【发布时间】:2013-10-10 05:35:20
【问题描述】:
我遇到了令人沮丧的 Windows 套接字行为,我找不到任何相关信息,所以我想在这里尝试一下。
我的问题如下:
我有一个用作设备驱动程序的 C++ 应用程序,与连接的串行设备通信 通过串行到 TCP/IP 转换器。 串行协议需要在设备和设备之间传递大量单字节消息 我的软件。我注意到这些小消息在启动后只发送了大约 3 次,之后它们不再实际传输(用wireshark检查)。一直以来,send() 方法一直返回 > 0,表明消息已被复制到它的发送缓冲区。 我正在使用阻塞套接字。
我发现了这个问题,因为当发送缓冲区完全填满时,这个特定的驱动程序最终不得不断开它的连接(select() 在大约 5 小时后因此失败,但是当我减小 SO_SNDBUF 大小时它会更快地发生)。
我检查了一下,发现当我用 2 个字节或更大的消息调用 send 时,传输永远不会失败。
非常感谢任何意见,我不知道如何解决这个问题。
【问题讨论】:
-
经过进一步的测试后,我要添加以下内容:使用相同的串行 tp IP 转换器,并在串行线路上安装了环回连接器,我再次测试了该问题。使用此设置,即使在发送 1 字节消息时也不会出现任何问题。一个很大的不同是我在wireshark 跟踪中看到的内容。我的实际测试系统,带有串行的第 3 方设备,显示许多零窗口探测消息被发送到端口转换器。环回配置不显示正在使用的任何此类标志。
-
我发送的第一个字节总是在那些零窗口探测消息中结束。当我发送超过 1 个字节时,会发送第二个包,其中包含有效负载的其余部分。当发送第二条消息时,通信保持活跃。当我只发送 1 个字节的消息,而wireshark 只检测到零窗口探测消息时,通信很快就停止了。如果我知道为什么要发送零窗口探测,我不记得端口转换器报告了任何 0 窗口大小。