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]新しい接続をリッスンするマスター ソケットはどこにありますか。

私はこれを徹底的にテストしていません (そして現在はテストできません) が、その 1 秒以内に複数の着信新しい接続がある場合、そのうちsocket_acceptの 1 つだけを受け入れるのではないでしょうか? socket_select受け入れる接続がまだあるため、次の反復でマスターソケットを再度選択しますか?

4

1 に答える 1

1

はい、socket_accept() は 1 つの接続のみを返します。選択をループで呼び出すことができます。さらに接続がある場合 (リスナー/サーバー fd の読み取りイベント)、選択はすぐに戻ります。TCP は、まだ受け入れられていない接続 (保留中の接続とも呼ばれます) 用に別のキューを維持します。

于 2013-09-05T04:59:15.107 に答える