C++ Winsock unicode problem

C++ Winsock unicode problem

本文关键字:problem unicode Winsock C++      更新时间:2023-10-16

我刚刚将一个使用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,所以我想知道我应该怎么做。

编辑: 多亏了格里姆,它不再崩溃了。但现在我有另一个问题,我有这个代码,但它返回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());

主要问题是你混淆了不同的概念。

要得到正确的程序,你必须知道你在做什么,而不是机械地将整个代码中的"char"替换为"TCHAR"。

你的内部字符串表示和你通过网络发送的数据是完全不同的。

如何在内部表示文本数据是您的选择(无论是ANSI或UNICODE16或UTF-8或其他),当您一致地实现它时,任何选择都是OK的。

但是你通过网络发送的数据是完全不同的——它的格式是由你使用的协议定义的。当然recv函数不会在字符编码之间转换-它只是通过网络发送数据缓冲区(如果您使用TCP套接字,则作为TCP连接数据流)。如果你正在发送HTTP请求(正如你的变量名所暗示的),那么你必须使用char s(而不是TCHAR s),因为HTTP协议使用ANSI字符。

您的send语句可能有问题。Send()期望第三个参数是字节大小,你给它的是字符。虽然这对于ANSI字符串(sizeof(char) == 1)工作得很好,但对于UNICODE却不能正常工作。

sizeof(wchar_t) == 2

正确的代码应该是这样的:
send(mySocket, (char*)http_request, lstrlen(http_request)*sizeof(http_request[0]), 0);

不能交换char和TCHAR类型,这会导致问题。您要么需要将数据声明为char数组,要么更改recv以使用TCHAR。