【问题标题】:C# socket blocking behaviorC# 套接字阻塞行为
【发布时间】:2010-05-07 22:07:38
【问题描述】:

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

这种行为出乎我的意料。如果套接字阻塞并且我明确设置了要接收的字节数,那么套接字不应该阻塞直到它接收到这些字节吗?任何帮助、指针等将不胜感激。

【问题讨论】:

    标签: c# sockets


    【解决方案1】:

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

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

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

    【讨论】:

    • 在这种情况下,C# 中的阻塞和非阻塞套接字有什么区别,甚至提供阻塞选项有什么意义?顺便说一句,谢谢。
    • 哇!刚刚意识到为什么,阻塞套接字会在一个空缓冲区上徘徊,直到数据进入,只是数据量不一定等于 recv 调用中指定的大小。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-20
    • 1970-01-01
    • 2010-10-31
    • 2013-10-15
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    相关资源
    最近更新 更多