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

Winsock send() issue with single byte transmissions

本文关键字:传输 问题 字节 单字节 send Winsock      更新时间:2023-10-16

我遇到了令人沮丧的Windows套接字行为,我找不到任何信息,所以我想我会在这里尝试。

我的问题如下:

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

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

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

任何意见将不胜感激,我不知道如何解决这个问题。

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