我的情况是这样的:我有一个c tcp套接字,通过它我可以接收由一个3字节的头和一个可变大小的负载组成的结构化消息。TCP数据通过隧道网络路由,有时容易受到碎片化的影响。解决方法是对报头执行3字节的阻塞读取,对可变大小的负载执行n字节的阻塞读取(n的值在报头中)。我遇到的问题是,阻塞接收操作偶尔返回一个部分数据包。也就是说,它读取的字节数小于我在接收调用中显式设置的字节数。经过一些调试后,它返回的字节数似乎等于接收操作之前套接字的可用属性中的字节数。
这种行为与我的期望相反。如果套接字阻塞了,并且我显式地设置了要接收的字节数,那么套接字不应该阻塞,直到它接收到那些字节吗?,任何帮助、指示等都将不胜感激。
行为取决于您使用的套接字类型。TCP是一个面向连接的套接字,它 means :
如果使用的是面向连接的套接字,则receive方法将读取 尽可能多的可用数据,最多为size参数指定的字节数。 如果远程主机使用shutdown方法关闭套接字连接,并且已接收到所有可用数据,则接收方法将立即完成并返回零字节。
当使用TCP套接字时,必须为这种可能性做好准备;检查 Receive 方法,如果低于你的预期, 接收 再次,直到套接字关闭或实际收到所需的数据为止。
Receive
接收