1

我现在正在研究一个 php websockets 服务器实现来编写一个新的。

这是接受新连接的部分:

$write = [];
$except = [];
while(isset(self::$read[0])){
    $changed = self::$read;
    $result = socket_select($changed, $write, $except, 1);
    if($result === false){
        // Error handling
    }elseif($result > 0){
        foreach($changed as $clientID => $socket){
            if($clientID != 0){
                // Read bytes
            }else{
                $client = socket_accept(self::$read[0]);
                if($client !== false){
                    // Add client
                }
            }
        }
    }
    // Ping idle clients
}

self::$read[0]监听新连接的主套接字在哪里。

我还没有(目前也无法)彻底测试这个,但是如果在那一秒钟内有多个传入的新连接,那么socket_accept唯一的连接不会接受其中一个吗?是否会socket_select在下一次迭代中再次选择主套接字,因为仍有连接被接受?

4

1 回答 1

1

是的,socket_accept() 只返回一个连接。我们可以在循环中调用 select,如果有更多的连接(也就是 listener/server fd 的 read 事件),那么 select 会立即返回。TCP 为尚未接受的连接(也称为待处理连接)维护一个单独的队列。

于 2013-09-05T04:59:15.107 回答