Winsock 仅在程序关闭时发送数据

Posted

技术标签:

【中文标题】Winsock 仅在程序关闭时发送数据【英文标题】:Winsock only sending data at program close 【发布时间】: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 代码中——我对此很陌生。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

哎呀,我真的应该抓住它。谢谢。 这无疑是所有消息被合并(接收方)的原因,但Nagle算法会导致写入延迟(发送方)一小段时间,以便发送更多数据更少的数据包。 Nagle 算法可以在某些情况下导致写入延迟。它不会延迟所有写入。

以上是关于Winsock 仅在程序关闭时发送数据的主要内容,如果未能解决你的问题,请参考以下文章

C++ Winsock 套接字错误:10038 (WSAENOTSOCK)

C ++ Winsock发送文件[关闭]

如何在内核模式驱动程序中使用 Winsock Kernel (WSK) 发送原始套接字数据包?

仅在用户启用时发送通知

我们可以在 DLL DETACH 中初始化 Winsock 吗?实际上我想在进程终止时发送一些数据(DLL DETACH)

winsock 缺少数据 c++ win32