合并2个或更多TCP/IP数据包中的数据

合并2个或更多TCP/IP数据包中的数据,c,winapi,visual-c++,C,Winapi,Visual C++,我应该从服务器上获取一些XML数据 <?xml><a></a><?xml><a></a><?xml><a></a><?xml><a></a> 假设按照以下顺序接收数据包 <?xml><a> </a><?xml><a></a><?xml>

我应该从服务器上获取一些XML数据

     <?xml><a></a><?xml><a></a><?xml><a></a><?xml><a></a>

假设按照以下顺序接收数据包

     <?xml><a>
     </a><?xml><a></a><?xml>
     <a></a>


我如何制定解析此类数据的逻辑?

简单的回答是,您不需要担心顺序;TCP手柄为您重新组装

TCP是一种流协议,每个数据包都包含一个序列号,允许网络堆栈以正确的顺序重新组合传入的数据包。它还将自动重新发送传输过程中丢失或损坏的任何数据包。然而,与UDP不同,UDP一次传输一个完整的消息,TCP只是在连接关闭之前一直发送数据,没有单独消息的协议级别概念

我认为你的问题不是关于订购,而是关于你何时收到所有数据。通常有两种方法

首先,服务器可以在完成数据发送后关闭连接。客户端发出请求,累积响应,直到连接关闭,然后将接收到的所有数据向前传递给应用程序

其次,应用程序可以通过标记每条消息的结尾或在每条消息的开头插入字节计数来框定数据本身。接收器等待指定数量的字节到达,并将它们传递给应用程序

实际上还有第三种方法,但它容易出错,通常被认为是不好的做法:客户端可以简单地等待一段时间,直到它停止接收数据,假设超时指示消息结束。但是,当客户端等待超时时,这可能会导致不必要的延迟,并且如果网络中存在较大的延迟,它还可能过早地指示消息的结束。如果服务器在消息中间“走开”,防止客户端挂起,或者如果其他方法都不起作用,则可以使用它作为最后的手段。但是它很有可能会间歇性地失败,所以不要告诉任何人你从我那里听到的。:-)

祝你好运