gpt4 book ai didi

c++ - 通过套接字发送西里尔文消息的问题

转载 作者:行者123 更新时间:2023-11-28 07:10:38 25 4
gpt4 key购买 nike

我正在尝试通过套接字发送西里尔文消息,但遇到问题。消息不通过。如果我使用 char(在两侧),在另一侧我收到西里尔字母部分不正确。如果我使用 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 进行了捕获。这是输出:十六进制:

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 "!" MESSAGE

最佳答案

根据您发布的内容,很难判断哪里出了问题。

首先,常见的问题是,recv/send 可能不会 给你你要求的数据,因为它只是一个提示。更令人困惑的是,在本地主机上它几乎总是成功,这意味着发送很可能会在一次调用中发送数据,而 recv 将在一次调用中接收数据。

看看recvsend特别是关于缓冲区及其长度的备注部分。

其次,字符串在通过网络发送时通常表现不佳,假设服务器部分也是 Windows 它可能会工作,但您仍然必须确保始终基于char count * char size 对于 ASCII 字符大小对于 unicode 是 1 字节它对于 windows 是 2 字节 但是 linux 使用 4 字节因此你必须确保你知道你的字符串有多长然后计算它的大小字节。最重要的是,你必须确保你知道你的数据在哪里结束,对于发送和字符串显示函数,通常是一个 '\0' 但你可以让网络函数知道它实际有多长 发送字符串数据,当数据被接收时,您手动在末尾放置一个空的 '\0'。

因此根据您发布的内容,它应该可以工作,因为 C 会自动在每个静态字符串的末尾添加一个\0,并且由于您在本地主机上运行它,发送/接收也应该可以工作,所以您要么遇到网络问题,要么其他事情是错误的。如果可以,请发布更多信息,因为很难仅从中判断哪里出了问题。

关于c++ - 通过套接字发送西里尔文消息的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21023263/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com