我的应用程序需要通过 tcp 套接字发送/接收 xml 数据。无法包含任何类型的包含消息长度的固定长度标头。据我了解,通过 tcp 传输的数据可以像这样到达接收方。
<梅萨
ge><内容
>嗨</content>
</消息>
但不知何故,这永远不会发生,这意味着通过一次 Send() 操作发送的数据(假设它小于或等于套接字缓冲区大小)总是通过一次 Receive() 操作完全读取。鉴于端点的套接字缓冲区足够大并且从未超过,上述情况是否可能?
我的应用程序需要通过 tcp 套接字发送/接收 xml 数据。无法包含任何类型的包含消息长度的固定长度标头。据我了解,通过 tcp 传输的数据可以像这样到达接收方。
<梅萨
ge><内容
>嗨</content>
</消息>
但不知何故,这永远不会发生,这意味着通过一次 Send() 操作发送的数据(假设它小于或等于套接字缓冲区大小)总是通过一次 Receive() 操作完全读取。鉴于端点的套接字缓冲区足够大并且从未超过,上述情况是否可能?
对的,这是可能的。
您真的不能假设一侧的 send() 操作中的缓冲区边界将与另一端相应的 recv() 看到的缓冲区边界匹配,即使大多数情况下似乎都是如此。
例如,如果您要发送大量数据,则接收操作系统可能会调用 TCP 流控制,而发送操作系统将只能发送缓冲区的一部分。或者,底层网络可能有数据包大小限制,需要拆分,或者......
如果两者之间有代理,这很容易发生。如果我们假设没有代理,客户端将收到与服务器发送的相同的数据包。如果您发送的数据少于链接的 TCP MSS,则客户端可能会一次性收到它。
但是,我不会依赖这个。通过查看结束标记 ( </message>
) 很容易判断 XML 消息的结束,因此很容易从流中解析 XML。
您可以在消息中包含消息长度。您所要做的就是,当您发送 xml msg 时,您在前 4 个字节中添加 msg 长度,然后是 xml msg。当您收到时,您将流的前 4 个字节作为 msg 长度,然后读取 xml msg 的每个字节