TCP套接字服务器如何判断从客户端接收到的数据何时完成?
Posted
技术标签:
【中文标题】TCP套接字服务器如何判断从客户端接收到的数据何时完成?【英文标题】:TCP socket server how to tell when data received from client is complete? 【发布时间】:2015-06-23 05:31:22 【问题描述】:我正在使用我在 MSDN 上找到的一些异步 TCP 套接字服务器代码,但我不清楚如何检测我已收到客户端应该发送的所有数据。在 MSDN 示例中,他们发送 ASCII 字符串(当然,转换为字节),并且在每次读取套接字后,他们检查解码的字符串是否包含 EOF 标记。如果没有,代码再次调用 BeginReceive() 以获取更多数据。
我从中接收数据的客户端将发送 8 种不同的二进制“消息”之一(不是 ASCII 字符串)。这些字节数组的长度可以从 6 字节到 ~10KB 不等。我的读取缓冲区为 1KB,因此我很有可能需要多次调用 BeginReceive() 才能读取所有数据。客户端是否需要将字节数组的总长度嵌入到数组开头附近的某处,以便我确定所有数据都已全部接收?
【问题讨论】:
如果客户端在同一个连接上发送多个“消息”,协议必须有一些指示如何分解它们。这可能是指示“消息结束”或(更简单)每条消息的长度前缀的东西。目前尚不清楚您是否控制协议... @Jon Skeet - 感谢您的确认。是的,我确实可以控制协议,所以我可能会为每条消息添加一个长度前缀。 【参考方案1】:如果您正在设计此二进制协议,则由您决定如何标记和确定消息的结尾。在消息的开头嵌入长度是执行此操作的常用方法。如果其他人设计了协议,请询问他们如何标记和确定消息的结尾。这是一个协议设计决策。
【讨论】:
非常感谢,大卫。我怀疑可能是这种情况,但我只是想和比我聪明的人确认一下。 :-)以上是关于TCP套接字服务器如何判断从客户端接收到的数据何时完成?的主要内容,如果未能解决你的问题,请参考以下文章