假设我事先知道有效负载字节。接收所有字节的正确方法是什么?目前,我正在做这样的事情
byte[] buffer = new byte[payloadLength];
socket.Receive(buffer, buffer.Length, SocketFlags.None);
但后来,我想到如果负载很大,Receive
可能无法一次接收到全部数据怎么办。所以我打算做这样的事情
byte[] buffer = new byte[payloadLength];
int remained = payloadLength;
int size = 0;
do {
size = socket.Receive(buffer, payloadLength - remained, remained, SocketFlags.None);
remained -= size;
} while (remained > 0 && size > 0);
哪个更正确?或者你们有更好的主意吗?
最佳答案
肯定是 一些 像第二个这样的变体。忽略 Receive
的返回值是在 SO 上发现的最常见的初学者错误之一,因为契约(Contract)保证(如果您不要求 0 字节) Receive
返回的是它将读取至少 一个字节。它不保证它会尝试读取您要求的字节数。1
任何消息框架(例如这里显然是固定大小的消息)都取决于您在 TCP 字节流上实现。
1即使对于相对较小的接收尺寸,也无法保证。所以如果你知道你的消息有多大因为你首先发送长度(另一种常见的消息框架方式),你甚至需要循环以获得构成消息长度的 2/4/8 字节短, int 或 long。
关于c# - 在 C# 中从 Socket 接收数据的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46489864/