C# 一个BeginReceive中包含多条消息

C# 一个BeginReceive中包含多条消息,c#,sockets,tcp,C#,Sockets,Tcp,如果客户端通过同一个套接字向服务器发送多条消息,服务器端的EndReceive是否会将消息分开,或者服务器是否可以在一个BeginReceive中从两个单独的发送接收部分消息?假设TCP,套接字上没有消息边界。一个发送可能会被多个接收占用,另一个发送可能会被部分占用。将TCP套接字视为流。要么发送固定大小的消息以便知道要读取的字节数,要么将消息大小嵌入消息本身(最好是在消息的最开始处),以便您可以边走边查 编辑: 要回答您评论中的问题,不仅是“MS OS”在做这件事,连接两侧的TCP/IP堆栈也

如果客户端通过同一个套接字向服务器发送多条消息,服务器端的EndReceive是否会将消息分开,或者服务器是否可以在一个BeginReceive中从两个单独的发送接收部分消息?

假设TCP,套接字上没有消息边界。一个发送可能会被多个接收占用,另一个发送可能会被部分占用。将TCP套接字视为流。要么发送固定大小的消息以便知道要读取的字节数,要么将消息大小嵌入消息本身(最好是在消息的最开始处),以便您可以边走边查

编辑:
要回答您评论中的问题,不仅是“MS OS”在做这件事,连接两侧的TCP/IP堆栈也在做这件事。写入套接字的字节在内核内缓冲,并在网络堆栈认为这是最好的时间时通过线路发送(在内核超时结束时,输出队列达到TCP窗口大小,等等-这都在TCP工作原理的细节中)。对于TCP(而不是UDP),内核不跟踪应用程序写入边界,只跟踪要发送的字节数、已确认的字节数等。它是一个流,操作系统不知道应用程序消息,只知道字节。

假设TCP,套接字上没有消息边界。一个发送可能会被多个接收占用,另一个发送可能会被部分占用。将TCP套接字视为流。要么发送固定大小的消息以便知道要读取的字节数,要么将消息大小嵌入消息本身(最好是在消息的最开始处),以便您可以边走边查

编辑:
要回答您评论中的问题,不仅是“MS OS”在做这件事,连接两侧的TCP/IP堆栈也在做这件事。写入套接字的字节在内核内缓冲,并在网络堆栈认为这是最好的时间时通过线路发送(在内核超时结束时,输出队列达到TCP窗口大小,等等-这都在TCP工作原理的细节中)。对于TCP(而不是UDP),内核不跟踪应用程序写入边界,只跟踪要发送的字节数、已确认的字节数等。这是一个流,操作系统不知道应用程序消息,只知道字节数。

这是真的吗?我担心这一点,但要实现这一点,MS OS层必须从一个发送接收部分/全部消息,去掉报头,从另一个发送接收部分/全部消息,去掉报头,并将两个数据包合并为一个消息,然后转发给BeginReceive。这真的会发生吗?非常感谢。。我正要编辑我的问题,包括客户端可能也在发送之前缓冲发送。我刚刚测试了这一点,事实上它正在发生——我只是阻止了服务器(断点),让多个小消息从客户端生成。虽然这不是我所希望的答案,但谢谢!:-)这是真的吗?我担心这一点,但要实现这一点,MS OS层必须从一个发送接收部分/全部消息,去掉报头,从另一个发送接收部分/全部消息,去掉报头,并将两个数据包合并为一个消息,然后转发给BeginReceive。这真的会发生吗?非常感谢。。我正要编辑我的问题,包括客户端可能也在发送之前缓冲发送。我刚刚测试了这一点,事实上它正在发生——我只是阻止了服务器(断点),让多个小消息从客户端生成。虽然这不是我所希望的答案,但谢谢!:-)