advanced-php icon indicating copy to clipboard operation
advanced-php copied to clipboard

socket 两处阻塞有点没明白,请大佬解释一下

Open dchaofei opened this issue 7 years ago • 6 comments

32

dchaofei avatar Jul 18 '18 03:07 dchaofei

首先是listen socket本身是阻塞的 其次是accpet是阻塞的

elarity avatar Jul 18 '18 03:07 elarity

恩, "listen socket 本身是阻塞" 这个我有点不明白,

// 创建一个监听socket,这个一个阻塞IO的socket
$listen = socket_create( AF_INET, SOCK_STREAM, SOL_TCP );
socket_bind( $listen, '0.0.0.0', 9999 );
socket_listen( $listen );

echo "test.",PHP_EOL;

while( true ){
    $connect = socket_accept( $listen );
}

如果 listen socket 是阻塞的,为什么会先把 test 打印出来

dchaofei avatar Jul 18 '18 06:07 dchaofei

不太容易解释,我这么说如果你把listen设置为非阻塞的,那么监听期间就只能应对一个客户的链接,如果恰巧此时有第二个客户,第二个就得等了。阻塞并不是说前三行代码阻塞,而是这个listen socket(本质上是一个文件)是阻塞的,是指这个意思。

elarity avatar Jul 18 '18 06:07 elarity

越来越懵了。。。 我理解的是当为 "阻塞时" ,监听期间如果有两个客户链接,第二就得等了。

dchaofei avatar Jul 18 '18 06:07 dchaofei

可能是我解释的不太好,文本表达有限。你可以去php.net查询 socket_set_nonblock函数,那上面有解释

elarity avatar Jul 18 '18 06:07 elarity

好的, 谢谢解释。

dchaofei avatar Jul 18 '18 06:07 dchaofei