c# - 在 C# 中从 Socket 接收数据的正确方法是什么?

标签 c# sockets tcp

假设我事先知道有效负载字节。接收所有字节的正确方法是什么?目前,我正在做这样的事情

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/

相关文章:

c# - Xamarin.iOS:Firebase 推送通知不起作用

c# - 在 MongoDB 中自动递增序列字段时插入文档

java - 客户端如何使用 EC2 连接到服务器

c - 处理多个客户端时,pthread_join 无法 fork TCP 服务器

c - 我怎样才能接受多个客户端到 TCP 服务器?

c# - 跨进程/平台的字符串列表的一致 HashCode

c# - LINQ 与嵌套循环

c - 了解用于接收 UDP 消息和打开 TCP 套接字的 Select 循环

c++ - 通过套接字发送 HBITMAP

sockets - 检测何时TCP连接无法打开或终止