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

时间:2012-04-05 05:51:06

标签: c winapi visual-c++

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

简短的回答是,您无需担心订单; TCP为您处理重组。

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

我认为您的问题不是关于订购,而是关于知道何时收到所有数据。通常有两种方法可以解决这个问题。

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

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

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

祝你好运!