客户端接收函数-字节到字符串

C++ - Client recv function - Bytes to string

本文关键字:字节 字符串 函数 客户端 端接 客户      更新时间:2023-10-16

我来这里是因为我有问题与recv()函数。我正试图编码一个TC/IP客户端,它将从服务器接收数据(我没有访问服务器代码,它是一个。exe)。我能够连接和接收数据,但我不能使用它们。通常我应该收到一个字符串,但在字节码。

int main()
{
    WSADATA WSAData;
    WSAStartup(MAKEWORD(2,0), &WSAData);//Initialisation du DLL,MAKEWORD(2,0) pour dire que c'est la V2,adresse de la variable qui lance le DLL
    string convert;
    long succes;
    SOCKADDR_IN sin;//info du socket
    int sock, bytes_recieved, bytes_send;
    char send_data[1024], recv_data[2048];
    struct hostent *host;
    struct sockaddr_in server_addr;
    host = gethostbyname("127.0.0.1");
    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
        perror("SocketError");
        exit(1);
    }
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(50500);
    server_addr.sin_addr = *((struct in_addr *) host->h_addr);
    bzero(&(server_addr.sin_zero), 8);

    if (connect(sock, (struct sockaddr *) &server_addr, sizeof(struct sockaddr))
        == -1) {
        perror("ConnectToError");
        exit(1);
    }

    //bytes_send = send(sock, a, strlen(a), 0);
    //bytes_send = shutdown(sock, 1);

    bytes_recieved = recv(sock, recv_data, 2048, 0);    recv_data[bytes_recieved] = '';
    printf("nRecieved data = %s ", recv_data);
    cout << endl << endl;
    shutdown(sock, 2);
    system("PAUSE");
        WSACleanup();

    return 0;
    }

I have value into my array:数组值但是我不知道如何将它们转换成字符串,它应该遵循以下顺序:

[0:3]字符串的大小

[4:n-2]字符串,每个字母占用2字节

[n-1:n]结束符号

谢谢你的帮助

wendelbsilva已经发布了答案,但它是在评论中。

两次呼叫recv。第一次调用为4字节。像这样:

unsigned int len;
assert(sizeof(len) == 4);
data_receive = recv(sock, &len, 4);

然后你可以读取真正的字符串。

std::vector<wchar_t> input(len+1);
if(data_receive = recv(sock, input.data(), len) != -1)

我在网上阅读了一些东西后修改了一些代码,使其更清晰:

void reception()
{
    wchar_t input[2048];
    wstring message;
    unsigned int data_receive;
    if(data_receive = recv(sock,(char*) input, 2048, 0) != -1)
    {
        message = input;
        std::wofstream fs("testout.txt");
        fs << message << std::flush;
        //cout << input[0]<<endl;
        system("PAUSE");
    }
}

现在我有一个字节数组,我想,但我不知道如何解析它。我想我的输入数组是UTF16。查看数组值:array view