2014-01-09 122 views
0

我试图通过套接字发送西里尔邮件,我有问题。该消息没有通过。 如果我使用字符(在两边),在我收到的另一边,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

测试“!” MESSAGE

+0

你是否检查过发送的数据(例如使用Wireshark)? 然后,您将缩小问题范围,以查看它是客户端还是服务器问题。 然后你可以检查你实际发送,接收的字节,以及如果你的代码不能停止阅读某些特殊的东西(比如'\ 0')。 – Maciek

+1

向我们显示接收方。 – zoska

+0

我已经发布了服务器端和wireshark输出。对不起,延迟 – nikolakoco

回答

1

根据您发布的内容很难分辨出什么是错的。

首先,通常的问题,收到/发送可能不会给你所要求的数据,因为它只是一个提示。更令人困惑的是,在本地主机上几乎所有的时间都能成功发送数据,这意味着发送数据很可能会在一次呼叫中发送数据,而recv会在一次呼叫中收到数据。

看看recvsend,尤其是关于缓冲区和它的长度的注释部分。

其次,弦一般不表现良好时,通过网络发送,假设服务器组成部分,也是它可能工作的窗口,但仍然,你必须确保你总是发送基于字符计数*字符ASCII字符大小的大小是1字节的unicode它是2字节的Windows Linux使用4字节,因此你必须确保你知道多久你的字符串,然后计算它的大小以字节为单位。除此之外,你必须确保你知道你的数据在哪里结束,发送和字符串显示函数通常是'\ 0',但是你可以让网络函数知道在发送之前实际上有多长时间字符串数据和数据recvd时,然后手动在结尾处输入空值'\ 0'。

因此,根据你发布的内容,它应该工作,因为C会在每个静态字符串的末尾自动添加一个\ 0,并且由于你在本地主机上运行它,send/recv也应该可以工作,所以你要么有网络问题或别的什么是错的。如果可以,请发布更多信息,因为很难从此告诉可能是错误的。

+0

我也发布了服务器端。基本上我必须要Windows机器,并且我正在尝试发送消息。 一般的问题是,我有一个更大的问题,我通过包含cyrilic价值的套接字一些html代码。 – nikolakoco

+0

+1为'通常的问题'。 – Roddy