【问题标题】:Winsock only sending data at program closeWinsock 仅在程序关闭时发送数据
【发布时间】:2010-03-10 14:15:06
【问题描述】:

我有一个 c++/windows 程序,它通过 WM_COPYDATA 消息从另一个 c++ 程序接收数据。然后应该使用 Sockets/winsock 将此消息发送到用 Java 编写的服务器。客户端可以正常连接到服务器,但似乎无法及时发送消息。但是,一旦客户端关闭,它应该发送的所有消息都会一大堆发送。下面是 Java 服务器的终端输出示例:

Server Starting up.
Client Accepted.
hi from clienttesttesttesttesttesttesttesttesttesttesttesttesttesttest

当这些事件发生时,Java 服务器会输出前两行。最后一行是来自客户端的消息。客户端在 winsock 初始化后立即发送“来自客户端的 hi”,然后在程序稍后的各个点“测试”,因为它通过 WM_COPYDATA 消息从其他 c++ 程序接收数据。

这里是 Java 服务器代码:

BufferedReader in = new BufferedReader(new InputStreamReader(
                                            clientSocket.getInputStream()));
String incomingLine;
while((incomingLine = in.readLine()) != null)
    System.out.println(incomingLine);

这是发送消息的 c++ 函数:

void sendDataWinsock(char* text){    
    int result = send(ConnectSocket,text,(int)strlen(text),0);
}

这是处理 WM_COPYDATA 消息的 WndProc 的一部分:

case WM_COPYDATA: 
    sendDataWinsock("test");
    break;

有谁知道它为什么这样做?就好像客户端程序正在将所有这些消息添加到它应该发送的队列中,但由于太忙而无法立即发送它们,因此仅在程序关闭时才发送它们,此时它不再需要处理Windows 消息。或者,我想,错误实际上可能出在 Java 代码中——我对此很陌生。

【问题讨论】:

    标签: java c++ winsock


    【解决方案1】:

    您正在服务器上读取行,但您没有发送行。

    这意味着您的服务器坐在那里,接收数据但等待从 readLine() 返回一行文本到您的程序,这不会发生,因为没有换行符 \n 被发送。当客户端退出时,readLine() 会返回它迄今为止读取的数据。

    【讨论】:

    • 哎呀,我真的应该抓住它。谢谢。
    • 这无疑是所有消息被合并(接收方)的原因,但Nagle算法会导致写入延迟(发送方)一小段时间,以便发送更多数据更少的数据包。
    • Nagle 算法可以在某些情况下导致写入延迟。它不会延迟所有写入。
    猜你喜欢
    • 1970-01-01
    • 2012-02-19
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    • 2012-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多