我的应用程序需要通过tcp套接字发送/接收xml数据。无法包含任何类型的包含消息长度的固定长度标头。据我所知,通过tcp传输的数据可以像这样来到收件人。
< MESSA
GE><内容
>喜< /内容>
< /消息>
但不知何故,这种情况永远不会发生意味着使用一个Send()操作发送的数据(假设它比套接字缓冲区大小更短或更小)总是通过一个Receive()操作完全读取。鉴于端点的套接字缓冲区足够大并且从未超过?
,上述情况是否可能答案 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的每个字节