执行Socket.Receive(byte [])将从缓冲区中获取字节,但如果预期的数据相当大,则所有字节可能还没有在缓冲区中,这将只给我一个部分填充字节数组。这段代码会确保我读到我想要的所有内容吗?
sock.Receive(message_byte, message_byte.Length, SocketFlags.None);
其中message_byte已被声明为我期望的数据的确切大小。我是否以正确的方式解决这个问题?这个处理的任何东西都不会超过~10兆,所以在声明字节数组时我不太可能有OutOfMemoryException。
答案 0 :(得分:9)
不,Receive
返回接收的字节数。你应该妥善处理这个问题。
var needBytes = message_byte.Length;
var receivedBytes;
var totalReceivedBytes = 0;
do
{
receivedBytes = sock.Receive(message_byte, totalReceivedBytes, needBytes, SocketFlags.None);
needBytes -= receivedBytes;
totalReceivedBytes += receivedBytes;
} while (needBytes > 0 && receivedBytes > 0)
答案 1 :(得分:3)
不,代码不能确保收到完整的消息。您应该检查收到的字节数并循环,直到收到完整的消息。
请记住,如果从客户端顺序发送多条消息,您可能也会收到下一条消息的一部分。例如,如果您的消息是100个字节,则第一个调用可能返回60个字节,您将循环并再次读取并获得58个字节,这意味着您现在已收到第一个消息的100个字节和前18个字节下一条消息,所以你也需要正确处理它。
注意:您不能对收到字节时如何拆分字节做出任何假设。它只是一个流,操作系统会在开始接收数据时通知您,没有消息框架的概念,这完全取决于您管理。
希望这是有道理的。