C++ 单字节传输的Winsock send()问题

C++ 单字节传输的Winsock send()问题,c++,sockets,tcp,C++,Sockets,Tcp,我遇到了一个令人沮丧的windows套接字行为,我找不到任何信息,所以我想我应该试试这里 我的问题如下: 我有一个C++应用程序,它是一个设备驱动程序,与一个串行设备通信。 通过串行到TCP/IP转换器。 串行协议要求在设备和设备之间传输大量单字节消息 我的软件。我注意到,这些小消息在启动后只发送了大约3次,之后它们不再通过wireshark进行实际传输。在此期间,send方法始终返回>0,表示消息已复制到其发送缓冲区。 我正在使用阻塞套接字 我发现了这个问题,因为当发送缓冲区被完全填满时,这个

我遇到了一个令人沮丧的windows套接字行为,我找不到任何信息,所以我想我应该试试这里

我的问题如下:

<>我有一个C++应用程序,它是一个设备驱动程序,与一个串行设备通信。 通过串行到TCP/IP转换器。 串行协议要求在设备和设备之间传输大量单字节消息 我的软件。我注意到,这些小消息在启动后只发送了大约3次,之后它们不再通过wireshark进行实际传输。在此期间,send方法始终返回>0,表示消息已复制到其发送缓冲区。 我正在使用阻塞套接字

我发现了这个问题,因为当发送缓冲区被完全填满时,这个特定的驱动程序最终不得不中断连接。大约5个小时后,由于这个原因,选择失败,但当我减小sou SNDBUF大小时,这种情况会发生得更快

我检查了一下,发现当我用2字节或更大的消息调用send时,传输从未失败


非常感谢您的任何输入,我不知道如何解决此问题。

这是一种罕见的情况,您应该设置TCP\u节点延迟,以便单独编写发送,而不是合并发送。但我认为你还有另一个问题。你确定你在看所有被送回的东西吗?并正确地采取行动?对我来说,这听起来像是一个应用程序协议问题。

我已经用TCP_NODELAY和SO_SNDBUF对非阻塞端口设置为0进行了实验。发送时对行为没有影响。我可以补充一点,当使用SO_SNDBUF设置为0的非阻塞端口时,发送调用会在前几个调用之后导致挂断。当然会。我看不出归零的意义,但这正是我所期望的。在我看来,设备甚至没有读取连接。没有错误,没有返回,只是冻结。就读取而言:所有接收到的数据都会定期从套接字读取。我的代码每100ms循环调用一次。到目前为止,我的实验只指出重复的1字节发送消息会导致出现问题,但发送调用会不断返回OK并添加到缓冲区,而缓冲区从未在线路上发送。我尝试每隔一次为测试目的插入更长的消息,但只要前面有多个连续的1字节消息,就仍然失败。将so_SNDBUF归零的想法是试图避免套接字缓冲我的消息。。如果另一方没有读取我们经常使用的VLINX串行端口转换器,那么为什么较长的消息不会导致问题?在进一步测试后,我要补充以下内容:使用相同的串行tp IP转换器,并在串行线路上安装环回连接器,我再次测试了问题。使用此设置,即使在发送1字节消息时,也不会出现任何问题。一个很大的区别是我在wireshark追踪中看到的。我的实际测试系统,第三方设备是串行的,显示了许多发送到端口转换器的零窗口探测消息。环回配置不显示正在使用的任何此类标志。我发送的第一个字节总是以零窗口探测消息结束。当我发送超过1个字节时,将发送第二个包,其中包含剩余的有效负载。当第二条消息被发送时,通信保持活跃。当我只发送1字节的消息,wireshark只检测到零窗口探测消息时,通信会很快停止。如果我知道发送零窗口探测的原因,我想不起端口转换器报告的任何0窗口大小。