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