当前位置: 技术问答>linux和unix
select和非阻塞socket的迷惑
来源: 互联网 发布时间:2016-02-18
本文导语: 关于非阻塞和阻塞的socket有点疑惑。 如果fd1是一个阻塞的socket,我将它加入select的readset中,然后用select去侦听fd1上是否有数据到来。我感觉这和非阻塞socket的性质是一样的,因为它不会阻塞在fd1的recv函数上,因为之...
关于非阻塞和阻塞的socket有点疑惑。
如果fd1是一个阻塞的socket,我将它加入select的readset中,然后用select去侦听fd1上是否有数据到来。我感觉这和非阻塞socket的性质是一样的,因为它不会阻塞在fd1的recv函数上,因为之前select已经判断到fd1可读,所以recv就会返回不会阻塞。
那么为什么大家总要还要创建一个非阻塞的socket加入select中呢?难道是因为socket读写效率问题?还是有其他原因。
如果fd1是一个阻塞的socket,我将它加入select的readset中,然后用select去侦听fd1上是否有数据到来。我感觉这和非阻塞socket的性质是一样的,因为它不会阻塞在fd1的recv函数上,因为之前select已经判断到fd1可读,所以recv就会返回不会阻塞。
那么为什么大家总要还要创建一个非阻塞的socket加入select中呢?难道是因为socket读写效率问题?还是有其他原因。
|
关于非阻塞和阻塞的socket有点疑惑。
如果fd1是一个阻塞的socket,我将它加入select的readset中,然后用select去侦听fd1上是否有数据到来。我感觉这和非阻塞 socket的性质是一样的,因为它不会阻塞在fd1的recv函数上,因为之前select已经判断到fd1可读,所以recv就会返回不会阻塞。
那么为什么大家总要还要创建一个非阻塞的socket加入select中呢?难道是因为socket读写效率问题?还是有其他原因。
-----------------------------------------------------------------------------------------------
是这样的,虽然你select判断了是可读的,但是没法判断能读多少数据,比如说,只到了3个字节的数据,而你要读取10个字节的,那就会阻塞在那.
阻塞和非阻塞的区别,不在于你用select判断时,而是在读/写数据时才起作用.
如果fd1是一个阻塞的socket,我将它加入select的readset中,然后用select去侦听fd1上是否有数据到来。我感觉这和非阻塞 socket的性质是一样的,因为它不会阻塞在fd1的recv函数上,因为之前select已经判断到fd1可读,所以recv就会返回不会阻塞。
那么为什么大家总要还要创建一个非阻塞的socket加入select中呢?难道是因为socket读写效率问题?还是有其他原因。
-----------------------------------------------------------------------------------------------
是这样的,虽然你select判断了是可读的,但是没法判断能读多少数据,比如说,只到了3个字节的数据,而你要读取10个字节的,那就会阻塞在那.
阻塞和非阻塞的区别,不在于你用select判断时,而是在读/写数据时才起作用.
|
楼上正解,但是对于“比如说,只到了3个字节的数据,而你要读取10个字节的,那就会阻塞在那.”有不同看法,只在调用recv(int s, void *buf, size_t len, int flags)的flags参数设置了MSG_WAITALL才会阻塞,否则会返回已经到达的数据。