我的情况是这样的:我有一个C#tcp套接字,我通过它接收由3字节头和可变大小的有效负载组成的结构化消息。 tcp数据通过隧道网络路由,偶尔会出现碎片。对此的解决方案是对标头执行3字节的阻塞读取,对可变大小的有效负载执行N字节的阻塞读取(N的值在标头中)。我遇到的问题是,偶尔阻塞接收操作会返回一个部分数据包。也就是说,它读取的字节数小于我在接收调用中明确设置的数字。经过一些调试后,它返回的字节数似乎等于接收操作之前套接字的Available属性中的字节数。
这种行为与我的期望相反。如果套接字是阻塞的并且我明确地设置了要接收的字节数,那么套接字是否应该阻塞,直到它恢复那些字节?,任何帮助,指针等都会非常感激。
答案 0 :(得分:2)
行为取决于您正在使用的套接字类型。 TCP是一个面向连接的套接字,means:
如果您使用的是面向连接的套接字,则Receive方法将读取尽可能多的数据,最多为size参数指定的字节数。如果远程主机关闭使用Shutdown方法的Socket连接,并且已收到所有可用数据,Receive方法将立即完成并返回零字节。
使用TCP套接字时,必须为这种可能性做好准备;检查Receive
方法的返回值,如果它小于预期,Receive
,直到套接字关闭或您实际收到所需数据为止。