C++ Winsock unicode problem
C++ Winsock unicode problem
我刚刚将一个使用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。
相关文章:
- C++ - Unicode Newline
- 如何将unicode字符串从C++传递到delphi
- ascii 和 unicode 在处理级别有什么区别吗?
- 无法从 std::string 中提取C++ Unicode 符号
- MinGW64 - Unicode 源文件错误?
- 使用 Visual Studio 2019 编译 Unicode
- 将ANSI C字符串转换为UNICODE
- 如何从 oracle 数据库 c++ 读取 unicode
- 在特定 Unicode 路径中创建文件
- 如何存储 unicode 字符并将其输出到文件?
- C++ wmain 函数错误时使用 Unicode
- C++:打印 Unicode 字符
- QTextStream,用于打印英语和Unicode 16
- 将 unicode 字符串与 c ++ 符号进行比较?
- 如何在C++中使用 UTF-8 和 Unicode?C++20 char8_t有多大?
- 在 CHtmlEditCtrl::SetDocumentHTML 中使用 Unicode
- C++ - 为什么 unicode 输出不正确?
- 如何在 c++ 中读取用 utf-8 编码的 java unicode 字节字符串
- 在 Windows 中使用 boost::p rogram_options 从命令行参数读取 Unicode 字符
- C++ Winsock unicode problem