如果尚未接受套接字,主套接字是否仍然是socket_select-able?

时间:2013-09-05 04:42:54

标签: php sockets

我现在正在研究一个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是否会在下一次迭代中再次选择主套接字,因为仍有接受连接?

1 个答案:

答案 0 :(得分:1)

是的,socket_accept()只返回一个连接。我们可以在循环中调用select,如果有更多连接(也就是侦听器/服务器fd的读事件),则select会立即返回。 TCP为尚未接受的连接(也称为挂起连接)维护一个单独的队列。