Uwe*_*Uwe 8 sockets udp tcp nonblocking blocking
我在理解recv()/ recvfrom()从非阻塞UDP套接字返回时遇到了问题.
更具体一点,与TCP相比(如果我错了,请纠正我):
阻塞套接字(TCP或UDP)将不会从recv()返回,直到缓冲区中有一些数据.这可以是一些字节数(TCP)或完整数据报(UDP).
非阻塞TCP套接字要么返回EWOULDBLOCK(linux)/ WSAEWOULDBLOCK(窗口),要么返回当前缓冲区中的字节.由于TCP数据是流,因此返回多少字节无关紧要.
现在的问题是:
编辑:
我对"数据报的一半"的意思是:如果我在套接字当前正在接收数据报时调用recv()会发生什么.在那一刻,缓冲区中有一些字节,但数据报尚未完成.
您的解释和评论表示赞赏.谢谢!
最后,借口从我的旧办公室里挖出我的史蒂文斯书.
如果缓冲区足够大,标准的Berkeley套接字recv()和recvfrom()函数将永远不会返回部分数据报.在内核完全接收并重新组装数据报之前,应用程序无法使用该数据报.
有趣的是,今天的问题并不多(任何?),其他网络编程接口在提供的缓冲区太小时不同意行为:
传统的Berkeley版本的套接字API会截断数据报,丢弃任何多余的数据.是否通知应用程序取决于版本.(4.3BSD Reno及以后可以通知应用程序数据报被截断.)
SVR4下的套接字API(包括Solaris 2.x)不会截断数据报.在后续读取中返回任何多余的数据.不通知应用程序从单个UDP数据报中实现多个读取.
TLI API不会丢弃数据.而是返回一个标志,指示有更多数据可用,并且应用程序的后续读取返回数据报的其余部分.
(Stevens,TCP/IP Illustrated,第1卷,第160页)
| 归档时间: |
|
| 查看次数: |
8654 次 |
| 最近记录: |