当前位置: 技术问答>linux和unix
一个未连接的客户端socket套接字在select处的奇怪行为
来源: 互联网 发布时间:2016-06-29
本文导语: 观察实际程序得到以下现象: 一个未连接的客户端socket套接字在select处会导致select认为此套接口缓冲区有数据,进而解除阻塞向下执行。而在read的时候会报错:一个未连接的套接字。 请问:“一个未连接的客户端s...
观察实际程序得到以下现象:
一个未连接的客户端socket套接字在select处会导致select认为此套接口缓冲区有数据,进而解除阻塞向下执行。而在read的时候会报错:一个未连接的套接字。
请问:“一个未连接的客户端socket套接字在select处会导致select认为此套接口缓冲区有数据,进而解除阻塞向下执行。”
1.这个是为什么?
2.能避免select因套接字未连接而向下执行吗?谢谢
一个未连接的客户端socket套接字在select处会导致select认为此套接口缓冲区有数据,进而解除阻塞向下执行。而在read的时候会报错:一个未连接的套接字。
请问:“一个未连接的客户端socket套接字在select处会导致select认为此套接口缓冲区有数据,进而解除阻塞向下执行。”
1.这个是为什么?
2.能避免select因套接字未连接而向下执行吗?谢谢
|
1. 按照select的定义,此时select应该返回
A descriptor is considered ready for reading when a call to
an input function with O_NONBLOCK clear would not block,
whether or not the function would transfer data success-
fully. (The function might return data, an end-of-file indi-
cation, or an error other than one indicating that it is
blocked, and in each of these cases the descriptor will be
considered ready for reading.)
2. 因为上述原因不能。
|
至于说
“一个未连接的客户端socket套接字在select处会导致select认为此套接口缓冲区有数据,进而解除阻塞向下执行。”
这个理解时错误的,不是“有数据”,是“读就绪(ready for reading)”, 简单地说,就是read/recv/recvfrom不会阻塞。
在这一点上俺不得不赞一下Solaris的文档,“详尽,准确”,上面那段英文就是Solaris文档里的。
“一个未连接的客户端socket套接字在select处会导致select认为此套接口缓冲区有数据,进而解除阻塞向下执行。”
这个理解时错误的,不是“有数据”,是“读就绪(ready for reading)”, 简单地说,就是read/recv/recvfrom不会阻塞。
在这一点上俺不得不赞一下Solaris的文档,“详尽,准确”,上面那段英文就是Solaris文档里的。