3

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

  1. <梅萨

  2. ge><内容

  3. >嗨</content>

  4. </消息>

但不知何故,这永远不会发生,这意味着通过一次 Send() 操作发送的数据(假设它小于或等于套接字缓冲区大小)总是通过一次 Receive() 操作完全读取。鉴于端点的套接字缓冲区足够大并且从未超过,上述情况是否可能?

4

3 回答 3

4

对的,这是可能的。

您真的不能假设一侧的 send() 操作中的缓冲区边界将与另一端相应的 recv() 看到的缓冲区边界匹配,即使大多数情况下似乎都是如此。

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

于 2010-09-07T17:28:16.413 回答
1

如果两者之间有代理,这很容易发生。如果我们假设没有代理,客户端将收到与服务器发送的相同的数据包。如果您发送的数据少于链接的 TCP MSS,则客户端可能会一次性收到它。

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

于 2010-09-07T17:28:22.513 回答
0

您可以在消息中包含消息长度。您所要做的就是,当您发送 xml msg 时,您在前 4 个字节中添加 msg 长度,然后是 xml msg。当您收到时,您将流的前 4 个字节作为 msg 长度,然后读取 xml msg 的每个字节

于 2010-09-07T17:29:10.797 回答