通过TCP套接字发送可变长度数据

时间:2010-09-07 17:17:35

标签: xml sockets tcp variable-length

我的应用程序需要通过tcp套接字发送/接收xml数据。无法包含任何类型的包含消息长度的固定长度标头。据我所知,通过tcp传输的数据可以像这样来到收件人。

  1. < MESSA

  2. GE><内容

  3. >喜< /内容>

  4. < /消息>

  5. 但不知何故,这种情况永远不会发生意味着使用一个Send()操作发送的数据(假设它比套接字缓冲区大小更短或更小)总是通过一个Receive()操作完全读取。鉴于端点的套接字缓冲区足够大并且从未超过?

    ,上述情况是否可能

3 个答案:

答案 0 :(得分:4)

是的,这是可能的。

你真的不能假设一方的send()操作中的缓冲区边界与另一端的相应recv()所看到的缓冲区边界相匹配,即使在大多数情况下看起来是这种情况。

例如,如果您要发送大量数据,则接收操作系统可能会调用TCP流控制,而发送操作系统只能发送部分缓冲区。或者底层网络可能存在数据包大小限制,需要拆分,或者......

答案 1 :(得分:1)

如果之间存在代理,则很容易发生这种情况。如果我们假设没有代理,客户端将收到与服务器发送的相同的数据包。如果您发送的数据少于链接的TCP MSS,则客户端可能会将其收到一个部分。

但是,我不会依赖于此。通过查看close标记(</message>)很容易告诉XML消息的结束,因此从流中解析XML很容易。

答案 2 :(得分:0)

您可以在邮件中包含邮件长度。所有你需要做的就是,当你发送xml msg时,你先用前4个字节的msg长度然后再用xml msg。当您收到时,将流的前4个字节作为msg长度,然后读取xml msg的每个字节