如果客户端通过同一个套接字向服务器发送多条消息,那么服务器端的EndReceive是否会将消息分开,或者服务器是否可以从单个BeginReceive中的两个单独发送中接收部分消息?
答案 0 :(得分:1)
假设TCP,套接字上没有消息边界。一个发送可能被多个接收消耗,反之亦然,部分消耗。将TCP套接字视为流。要么发送固定大小的消息,要么知道要读取多少字节,要么将消息大小嵌入消息本身(最好是在消息的最开头),这样你就可以随时找到它。
要回答评论中的问题 - 不仅是“MS OS”正在这样做 - 它是连接两端的TCP / IP堆栈。写入套接字的字节在内核中缓冲,并在网络堆栈认为这是最佳时间时在线路上发送(内核内超时启动,输出队列达到TCP窗口大小等等 - 详细信息都在内容中) TCP如何工作)。对于TCP(但不是UDP),内核不跟踪应用程序写入边界,只记录要发送的字节数,已确认的数量等等。这是一个流,OS 不知道关于应用程序消息,只有字节。