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

时间:2013-10-09 13:34:09

标签: c++ sockets tcp

我遇到了令人沮丧的Windows插座行为,我无法找到任何信息,所以我想我会在这里尝试。

我的问题如下:

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

我发现了这个问题,因为当发送缓冲区完全填满时,这个特定的驱动程序最终必须丢弃它的连接(select()在大约5个小时后因此失败,但是当我减少SO_SNDBUF大小时它会更快地发生。) / p>

我查了一下,注意到当我用2字节或更大字节的消息调用send时,传输永远不会失败。

任何意见都会非常感激,我不知道如何解决这个问题。

1 个答案:

答案 0 :(得分:0)

这是一种罕见的情况,您应该设置TCP_NODELAY,以便单独写入发送,而不是合并。但我认为你还有另一个问题。你确定你正在阅读所有被发回的内容吗?并正确地采取行动?这听起来像是一个应用程序协议问题。