关于socket编程中阻塞的问题

时间:2021-03-23 23:56:31
刚刚开始学习socket编程,有个问题不是很清楚,请指点一下:
在使用fcntl方法设置一个socket为阻塞或者非阻塞后,对代码的影响是什么?如果设置成非阻塞,accept方法被调用时就不会一直阻塞在那里了么?不清楚,请指点一下,谢谢!
分有点少,抱歉!
另外请告知如何给分吧

12 个解决方案

#1


你问的没错,肯定程序流程多少有些变化.

#2


能具体说说什么变化吗?客户端,还是服务器段?

#3


都有变化,你知道阻塞和非阻塞的区别吗?
加群:4649839 
晚上回去给你讲讲

#4


我只是在概念上明白什么叫阻塞,什么叫非阻塞。但是对于代码中如何实现不清楚。比如对于阻塞的情况,服务器端在listen之后会用一个while循环,循环中accept方法会一直阻塞在那里,直到收到一个客户端的connect。那么对于非阻塞是怎么样一个情形呢?accept方法不会一致阻塞在那里是么?还是有其他的什么方法?
其实说白了就是我没太理解socket的那几个函数的说明。望能稍微说的详细一点,谢谢!

#5


while(1) {
     read(fd,buf,size);
}
像上面的代码,如果为阻塞方式,没有数据read就一直等
如果为非阻塞方式,没有数据,read不会等,直接就返回一个错误,继续往下面走了。
其他方法就是select了,用于检测多个非阻塞的描述符。

#6


奥,我明白了,函数并不是分为阻塞还是非阻塞,而是看socket设置是阻塞还是非阻塞,对吧?那么我又有两个问题了。
(1)如果是非阻塞服务器端如何知道什么时候该进行检查是否有数据发过来呢?
(2)阻塞还是非阻塞是针对客户端的socket是么?服务器端的socket也可以设置么?服务器端又是如何知道客户端的这些socket的描述符的?
谢谢!

#7


1:用select检测描述符
2:setsockopt函数或者ioctl/fcntl

#8


你可能没太理解我问的问题的意思:

1:用select检测描述符
---------------------------------------------
    你怎么知道何时调select方法呢?我的意思是比如客户机传来数据,服务器端一直不停的调select方法来进行检测?

2:setsockopt函数或者ioctl/fcntl
---------------------------------------------
    服务器与客户机建立起来的这个链接究竟是阻塞的还是非阻塞的应该是在哪边设置?难道是两边可以分别设置?

#9


你man一下select,里面有个例子,你看看估计就理解了。
相当于把一堆非阻塞的描述符放入这个函数里面,这个函数负责监控那个描述符有数据来了。
select处于阻塞状态。

#10


第二个问题似乎你说的那样,很久以前有个人问过。

#11


多谢了,告诉我怎么给分吧:)

#12


看在你也叫猪头的份上,回了这么多,分不分的五所谓了.
沉了吧

#1


你问的没错,肯定程序流程多少有些变化.

#2


能具体说说什么变化吗?客户端,还是服务器段?

#3


都有变化,你知道阻塞和非阻塞的区别吗?
加群:4649839 
晚上回去给你讲讲

#4


我只是在概念上明白什么叫阻塞,什么叫非阻塞。但是对于代码中如何实现不清楚。比如对于阻塞的情况,服务器端在listen之后会用一个while循环,循环中accept方法会一直阻塞在那里,直到收到一个客户端的connect。那么对于非阻塞是怎么样一个情形呢?accept方法不会一致阻塞在那里是么?还是有其他的什么方法?
其实说白了就是我没太理解socket的那几个函数的说明。望能稍微说的详细一点,谢谢!

#5


while(1) {
     read(fd,buf,size);
}
像上面的代码,如果为阻塞方式,没有数据read就一直等
如果为非阻塞方式,没有数据,read不会等,直接就返回一个错误,继续往下面走了。
其他方法就是select了,用于检测多个非阻塞的描述符。

#6


奥,我明白了,函数并不是分为阻塞还是非阻塞,而是看socket设置是阻塞还是非阻塞,对吧?那么我又有两个问题了。
(1)如果是非阻塞服务器端如何知道什么时候该进行检查是否有数据发过来呢?
(2)阻塞还是非阻塞是针对客户端的socket是么?服务器端的socket也可以设置么?服务器端又是如何知道客户端的这些socket的描述符的?
谢谢!

#7


1:用select检测描述符
2:setsockopt函数或者ioctl/fcntl

#8


你可能没太理解我问的问题的意思:

1:用select检测描述符
---------------------------------------------
    你怎么知道何时调select方法呢?我的意思是比如客户机传来数据,服务器端一直不停的调select方法来进行检测?

2:setsockopt函数或者ioctl/fcntl
---------------------------------------------
    服务器与客户机建立起来的这个链接究竟是阻塞的还是非阻塞的应该是在哪边设置?难道是两边可以分别设置?

#9


你man一下select,里面有个例子,你看看估计就理解了。
相当于把一堆非阻塞的描述符放入这个函数里面,这个函数负责监控那个描述符有数据来了。
select处于阻塞状态。

#10


第二个问题似乎你说的那样,很久以前有个人问过。

#11


多谢了,告诉我怎么给分吧:)

#12


看在你也叫猪头的份上,回了这么多,分不分的五所谓了.
沉了吧