我试图通过套接字发送西里尔语消息,我有问题。消息未通过。 如果我使用char(在两侧),在我收到的另一侧,cyrilic部分不正确。 如果我使用WCHAR(在两边),我会收到消息,直到第一个西里尔字符。 如果我只发送ASCII字符一切正常。 所以这是客户端代码。如果有必要,我也可以提供服务器代码。
客户端:
char ip_addr[] = "192.168.0.102";
int port = 30000;
wchar_t message[] = L"TEST ТЕСТ MESSAGE ПОРАКА";
//char message[] = "TEST ТЕСТ MESSAGE ПОРАКА";
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != 0) {
wprintf(L"WSAStartup failed: %d\n", iResult);
return 1;
}
struct sockaddr_in messageServer;
memset(&messageServer, 0, sizeof(messageServer));
messageServer.sin_family = AF_INET;
messageServer.sin_addr.S_un.S_addr = inet_addr(ip_addr);
messageServer.sin_port = htons(port);
SOCKET outsocket;
outsocket = socket(AF_INET, SOCK_STREAM, 0);
if (outsocket == -1) {
std::cout << "ERROR";
exit(-1);
}
int connRes = 0;
connRes = connect(outsocket, (struct sockaddr *)&messageServer, sizeof(messageServer));
if (connRes < 0) {
std::cout << "ERRROR CONNECT " << WSAGetLastError() << std::endl;
system("pause");
exit(-1);
}
int result;
result = send(outsocket, (char*)message, sizeof(message), 0);
if (result == SOCKET_ERROR) {
wprintf(L"send failed with error: %d\n", WSAGetLastError());
closesocket(outsocket);
WSACleanup();
return 1;
} else {
std::wcout << "Return code: " << result << std::endl;
}
closesocket(clientSocket);
服务器:
int port = 30000;
char ip_addr[] = "192.168.0.102";
struct sockaddr_in serverAddr, clientAddr;
memset(&serverAddr, 0, sizeof(serverAddr));
memset(&clientAddr, 0, sizeof(clientAddr));
std::locale::global(std::locale("Russian_Russia"));
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != NO_ERROR) {
wprintf(L"Error at WSAStartup()\n");
return 1;
}
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.S_un.S_addr = inet_addr(ip_addr);
serverAddr.sin_port = htons(port);
SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, 0);
int bindRes = 0;
bindRes = bind(serverSocket, (struct sockaddr *) &serverAddr, sizeof(serverAddr));
if (bindRes < 0) {
std::wcout << "ERRROR BIND" << WSAGetLastError() << std::endl;
system("pause");
exit(-1);
}
if (listen(serverSocket, 5) < 0)
{
std::wcout << "ERRRORRR LISTEN" << std::endl;
system("pause");
exit(-1);
}
for (;;)
{
std::wcout << "WAITING..." << std::endl;
int length = sizeof(clientAddr);
wchar_t message[500];
ZeroMemory(&message, sizeof(message));
SOCKET clientSocket = accept(serverSocket, (struct sockaddr *) &clientAddr, &length);
int bR = 0;
bR = recv(clientSocket, (char*)message, sizeof(message), 0);
if(bR == -1) {
std::wcout << "ERRRRORORORORRR";
}
std::wcout << "Received bytes: " << bR << std::endl;
std::wcout << "Message: " << message << std::endl;
closesocket(clientSocket);
}
我还使用Wireshark进行了捕获。这是输出: HEX:
54:00:45:00:53:00:54:00:20:00:22:04:15:04:21:04:22:04:20:00:4D:00:45:00 :53:00:53:00:41:00:47:00:45:00:20:00:1F:04:1E:04:20:04:10:04:1A:04:10:04:00 :00:CC
TEST“!”消息
答案 0 :(得分:1)
根据你发布的内容,很难说出来是什么问题。
首先,通常的问题,recv / send 可能不会为您提供您要求的数据,因为它只是一个提示。更令人困惑的是,在localhost上几乎所有时间都成功,这意味着发送很可能在一次通话中发送数据,而recv将在一次通话中接收数据。
请查看recv和send,特别是有关缓冲区及其长度的备注部分。
其次,字符串通常在通过网络发送时表现不佳,假设服务器部分也是Windows可能会工作但是,你必须确保你总是发送基于char count *字符大小为ASCII字符大小是1字节对于unicode它是2字节对于windows 但是 linux使用4字节因此你必须确保你知道你的字符串有多长然后计算它的大小in字节。除此之外,您必须确保知道数据的结束位置,对于send和字符串显示函数(通常为'\ 0'),您可以让网络函数知道它实际上是多长时间 发送字符串数据,当数据是recvd时,你手动在末尾加上'\ 0'。
所以基于你发布的内容它应该可以工作,因为C会在每个静态字符串的末尾自动添加\ 0,并且由于你在localhost上运行它,send / recv也应该有效,所以你要么有网络问题,要么别的东西是错的。如果可以发布更多信息,因为很难从中判断出什么是错误的。