我们正在使用一个应用程序协议,它在前 4 个字节中指定消息的长度指示符。Socket.Receive 将返回与当时协议堆栈中的数据一样多的数据,或者阻塞直到数据可用。这就是为什么我们必须不断地从套接字读取,直到我们收到长度指示器中的字节数。如果对方关闭连接,Socket.Receive 将返回 0。我明白这一切。
是否有必须读取的最小字节数?我问的原因是从文档看来,当 socket.Receive 可以返回时,整个长度指示器(4 个字节)可能不可用。那么我们将不得不继续努力。尽量减少调用 socket.receive 的次数会更有效,因为它必须将内容复制进出缓冲区。那么一次获取一个字节来获取长度指示器是否更安全,假设 4 个字节将始终可用是否安全,或者我们是否应该继续尝试使用偏移变量获取 4 个字节?
我认为可能存在某种默认最低级别的原因是我遇到了一个名为 ReceiveLowWater 的变量,我可以在套接字选项中设置它。但这似乎只适用于 BSD。MSDN请参阅 SO_RCVLOWAT。
这并不是那么重要,但我正在尝试编写单元测试。我已经在接口后面包装了一个标准的.Net Socket。