unlisten 真的能用吗?unlisten之后能否使用此端口发起异步通信.

augushong

监听的udp端口6000,
worker里有一个listen和unlisten方法,我希望在一个逻辑地方,unlisten,使用异步udp发起一个连接,指定使用6000端口发起,然后调用listen.
但是为什么还是报already in use 错误.
代码如下:
$server就是监听在4788下的worker,
这段代码写在一个回调里面,
打印unlisten的信息(改worker.php),确实关闭了socket,对象属性_mainSocket也为null,把fclose换成stream_socket_shutdown也不行.


    $server->unlisten();

    foreach ($server->connections as $connection) {
        $connection->close();
    }

    // sleep(1);

    // connect to the internet using port '4788'
    $opts = array(
        'socket' => array(
            'bindto' => '0:4788',
        ),
    );

    $find_conn = new AsyncUdpConnection($address,$opts);

    $find_conn->worker = $server;

    $find_conn->action = $action;

    $find_conn->protocol = $server->protocol;

    // $find_conn->onConnect = function($connection) use ($msg,$server){
        // $connection->close($msg);
        // $server->listen();
    // };

    // $find_conn->connect();

    $find_conn->close($msg);

    $server->listen();

根据打印的信息,unlisten确实执行了但是stream_socket_client还是不能占用这个端口,这是为什么?

2070 1 0
1个回答

walkor

因为主进程还监听着那个udp端口。unlisten只是取消当前进程的监听,不影响其它进程。

  • augushong 2018-10-31

    感谢感谢,立刻点开了思路,需求已经实现,

年代过于久远,无法发表回答
🔝