2015-09-16 3 views
0

Я прихожу сюда, потому что у меня проблема с функцией recv(). Я пытаюсь закодировать клиент TC/IP, который будет получать данные с сервера (я не согласен с кодом сервера, это .exe). Я могу подключать и получать данные, но тогда я не могу их использовать. Normaly Я должен получить строку, но в коде байтов.C++ - функция возврата клиента - байты в строку

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] = '\0'; 
    printf("\nRecieved data = %s ", recv_data); 
    cout << endl << endl; 

    shutdown(sock, 2); 
    system("PAUSE"); 
     WSACleanup(); 


    return 0; 
    } 

У меня есть значение в моем массиве: значение массива Но я не знаю, как перевести их в строку, он должен следовать следующий порядок:

[0: 3] Размер строки

[4: п-2] String, каждая буква на 2 байта

[п-1: п] Конец SYMBOLE

Спасибо вам помочь.

+3

Вам придется разобрать байты, которые вы получили .. получить первые 4 байта и преобразовать в числовое значение 'n' ([пример небольшой Endian к UINT] (http://stackoverflow.com/questions/17916394/превращающего 4 байта-в-прямой порядок байтов порядка-в-ан-беззнаковое-целое число)). Впоследствии вы должны использовать этот 'n' для получения строки. Поскольку вы упоминаете 2 байта на письмо ... это wchar? Вы можете получить следующие 'n' байты и построить, например,' std :: wstring'. Знаете ли вы, что используется конечный символ? это всегда одно и то же? Получаете ли вы более одного текста в то время? – wendelbsilva

+0

Сначала спасибо за быстрый ответ. Я не знаю, какой тип данных это просто указанные байты. Конец символа - две точки, например пример: Пример: для отправки или получения строки «xyz» Unicode она должна быть обернута в следующий пакет: i. Байты [0: 3] - целое число 8 в виде числа байтов данных ii. Байты [4: 5] - «x» в Юникоде iii. Байты [6: 7] - 'y' в Юникоде iv. Байты [8: 9] - 'z' в Unicode v. Bytes [10:11] - нули, завершающие строку vi. Общая сумма: 12 байт Я постараюсь сделать wstring и использовать wchar. –

ответ

0

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) 
0

Я изменил чуток мой код после прочтения некоторых вещей в Интернете и сделать его более ясным:

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