C ++ Winsock Unicode проблема - PullRequest
       17

C ++ Winsock Unicode проблема

1 голос
/ 25 сентября 2011

Я только что преобразовал программу, которая использует winsock, в Unicode, и я столкнулся с проблемой.

Вот мой код, ну и часть его

TCHAR http_request[MAX_REQUEST_LEN];
TCHAR data[65536];
int nDataLen = 0;

/* Create http_request */

send(mySocket, (char*)http_request, lstrlen(http_request), 0)
nDataLen = recv(mySocket, (char*)data, 65536, 0);

Я почти уверен, что приведение data к char* вызывает проблему, но я не совсем уверен. Там нет sendW или recvW, поэтому мне интересно, как я должен это сделать.

EDIT: Это больше не терпит крах благодаря Grim. Но теперь у меня есть другая проблема, у меня есть этот код, но он возвращает ERROR_INVALID_PARAMETER

TCHAR http_request[MAX_REQUEST_LEN];
char ansi_data[65536];
TCHAR data[65536];
int nDataLen = 0;

/* Create http_request */

send(mySocket, (char*)http_request, lstrlen(http_request) * sizeof(TCHAR), 0);

nDataLen = recv(mySocket, ansi_data, 65536, 0);

// Convert ansi_data to data, this is what causes the error
if (MultiByteToWideChar(CP_ACP, 0, ansi_data, nDataLen, data, 65536) == 0)
    ErrorExit(GetLastError());

Ответы [ 3 ]

3 голосов
/ 25 сентября 2011

Основная проблема заключается в том, что вы смешиваете разные понятия.

Чтобы получить правильную программу, вы должны знать, что вы делаете, вместо того, чтобы механически заменить «char» на «TCHAR» во всем коде.

Ваше внутреннее строковое представление и данные, которые вы отправляете по сети, - это совершенно разные вещи.

Как вы представляете текстовые данные внутри, это ваш выбор (будь то ANSI, UNICODE16 или UTF-8или что-то в этом роде), и любой выбор в порядке, если вы реализуете его последовательно.

Но данные, которые вы отправляете по сети, - это совсем другое - их формат определяется протоколом, который вы используете.Конечно, функция recv не конвертирует между кодировками символов - она ​​просто отправляет буфер данных по сети (как поток данных соединения TCP, если вы используете сокет TCP).Если вы отправляете HTTP-запрос (как следует из названия вашей переменной), вам придется использовать char s (не TCHAR s), поскольку протокол HTTP использует символы ANSI.

2 голосов
/ 25 сентября 2011

Возможно, у вас возникла проблема с отправленным заявлением. send () ожидает, что третий параметр будет иметь размер в байтах, вы даете ему символы. Хотя это нормально работает для строк ANSI (sizeof (char) == 1), для UNICODE это не будет работать корректно.

sizeof (wchar_t) == 2

Правильный код должен выглядеть следующим образом:

send(mySocket, (char*)http_request, lstrlen(http_request)*sizeof(http_request[0]), 0);
0 голосов
/ 25 сентября 2011

Нельзя обмениваться типами char и TCHAR, это может вызвать проблемы.Вам нужно либо объявить данные как массив char, либо изменить recv для использования TCHAR.

...