【问题标题】:How can we find that all bytes receive from sockets?我们如何才能发现所有字节都从套接字接收?
【发布时间】:2026-01-20 19:55:01
【问题描述】:

我想知道我们何时从没有 Socket.Disconnect() 的套接字接收所有字节 方法?

然而,我使用此代码接收所有字节,但是当 Scoket.Send(byte[]) 方法完成时,我使用 Socket.Disconnect() 方法。

List<byte> LBytes = new List<byte>();
do
{
System.Threading.Thread.Sleep(50);
BytesRead = obj_socket.Receive(obj_buffer, 0);
LBytes.Append(obj_buffer);
} while (BytesRead != 0);

因为当我们断开套接字时,套接字读取 0 个字节。 例如我们发送了 100,000 个字节,我们应该收到 100,000 个字节。你是怎么做到的?

【问题讨论】:

  • 查看您的通信协议常见问题以获取更多信息。谁知道结束消息字节是什么?

标签: c# sockets disconnect


【解决方案1】:

当套接字打开时,没有办法做到这一点而不导致它在到达末尾时阻塞(期望更多数据)。

有几种方法:

  • 发送后关闭套接字
  • 有一些表示“消息结束”的标记(使用编码文本很容易 - 0 是一种常见的选择;但在发送任意二进制数据时会很棘手)
  • 在数据前发送一个长度前缀(本例中为 100,000),当你得到那么多时停止阅读

如果是NetworkStream,例如,使用长度前缀:

int expecting = //TODO: read header in your chosen form
int bytesRead;
while(expecting > 0 && (bytesRead = stream.Read(buffer, 0,
        Math.Min(expecting, buffer.Length))) > 0)
{
    // TODO: do something with the newly buffered data
    expecting -= bytesRead;
}

【讨论】: