【发布时间】:2012-10-16 17:44:35
【问题描述】:
我们正在使用一个应用程序协议,该协议在前 4 个字节中指定消息的长度指示符。 Socket.Receive 将返回与当时协议堆栈中的数据一样多的数据,或者阻塞直到数据可用。这就是为什么我们必须不断地从套接字读取,直到我们收到长度指示器中的字节数。如果对方关闭连接,Socket.Receive 将返回 0。我都明白了。
是否有必须读取的最小字节数?我问的原因是从文档看来,当 socket.Receive 可以返回时,整个长度指示器(4 个字节)可能不可用。然后我们将不得不继续努力。尽量减少调用 socket.receive 的次数会更有效,因为它必须将内容复制进出缓冲区。那么一次获取一个字节来获取长度指示符是否更安全,假设 4 个字节将始终可用是否安全,或者我们应该继续尝试使用偏移变量获取 4 个字节?
我认为可能存在某种默认最低级别的原因是我遇到了一个名为 ReceiveLowWater 的变量,我可以在套接字选项中设置它。但这似乎只适用于 BSD。 MSDN 见 SO_RCVLOWAT。
这并不重要,但我正在尝试编写单元测试。我已经在接口后面封装了一个标准的 .Net Socket。
【问题讨论】:
-
这不太可能,但您应该能够处理任意大小的读取。甚至 1 个字节。由于大多数情况下这种情况不太可能发生,因此您几乎不会受到性能影响。如果这 4 个字节不在流的最开始,那么它们实际上很可能会在读取之间被拆分。