C#套接字阻塞行为

C#套接字阻塞行为,c#,sockets,C#,Sockets,我的情况是这样的:我有一个C#tcp套接字,通过它我接收由一个3字节的头和一个可变大小的负载组成的结构化消息。tcp数据通过隧道网络路由,有时容易出现碎片。解决方案是对报头执行3个字节的阻塞读取,对可变大小的有效负载执行N个字节的阻塞读取(N的值在报头中)。我遇到的问题是,有时阻塞接收操作会返回部分数据包。也就是说,它读取的字节数小于我在接收调用中显式设置的字节数。经过一些调试后,它返回的字节数似乎等于receive op之前套接字的Available属性中的字节数 这种行为与我的期望相反。如果

我的情况是这样的:我有一个C#tcp套接字,通过它我接收由一个3字节的头和一个可变大小的负载组成的结构化消息。tcp数据通过隧道网络路由,有时容易出现碎片。解决方案是对报头执行3个字节的阻塞读取,对可变大小的有效负载执行N个字节的阻塞读取(N的值在报头中)。我遇到的问题是,有时阻塞接收操作会返回部分数据包。也就是说,它读取的字节数小于我在接收调用中显式设置的字节数。经过一些调试后,它返回的字节数似乎等于receive op之前套接字的Available属性中的字节数


这种行为与我的期望相反。如果套接字正在阻塞,并且我明确设置了要接收的字节数,那么在收到这些字节之前,套接字不应该阻塞吗?任何帮助、指针等都将不胜感激。

行为取决于您使用的套接字类型。TCP是一种面向连接的套接字,它:

如果您使用的是面向连接的套接字,则Receive方法将读取尽可能多的可用数据,最多可达size参数指定的字节数。如果远程主机使用Shutdown方法关闭套接字连接,并且已接收到所有可用数据,Receive方法将立即完成并返回零字节


当使用TCP套接字时,您必须为这种可能性做好准备;检查
Receive
方法的返回值,如果返回值小于预期值,则再次检查
Receive
,直到套接字关闭或实际收到所需的数据。

在这种情况下,C#中的阻塞套接字和非阻塞套接字有什么区别,甚至提供阻塞选项有什么意义呢?顺便说一句,谢谢。Doh!。刚刚意识到为什么,阻塞套接字将挂在空缓冲区上,直到数据进入,只是数据量不一定等于recv调用中指定的大小。