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)
如何在内核模式驱动程序中使用 Winsock Kernel (WSK) 发送原始套接字数据包?
我们可以在 DLL DETACH 中初始化 Winsock 吗?实际上我想在进程终止时发送一些数据(DLL DETACH)