这段代码将确保我从套接字读取所有我想要的

本文关键字:读取 套接字 我想要 确保 段代码 代码 | 更新日期: 2023-09-27 18:06:04

执行Socket.Receive(byte[])将从缓冲区中获取字节,但如果预期的数据相当大,则所有字节可能尚未在缓冲区中,这将给我一个仅部分填充的字节数组。这段代码能确保我读取所有我想要的内容吗?

sock.Receive(message_byte, message_byte.Length, SocketFlags.None);

,其中message_byte已经被声明为我期望的确切数据大小。我这样做对吗?此处理的任何内容都不会大于~10 mb,因此在声明字节数组时不太可能有OutOfMemoryException。

这段代码将确保我从套接字读取所有我想要的

不,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)

不,代码将不能确保接收到完整的消息。您应该检查接收到的字节数并循环,直到接收到完整的消息。

请记住,如果从客户端顺序发送多条消息,您也可能开始接收下一条消息的一部分。例如,如果你的消息是100字节,第一次调用可能返回60字节,你将循环并再次读取并获得58字节,这意味着你现在已经收到了第一个消息的100字节和下一个消息的前18字节,所以你也需要正确处理这个。

注意:当你接收到这些字节时,你不能假设它们是如何被分割的。它只是一个流,当它开始接收数据时,操作系统会通知你,没有消息帧的概念,这完全取决于你来管理。

希望你明白。