1

私は個人的なプロジェクトに取り組んでおり、マルチクライアントサーバーでソケットを管理するのに問題があります。

したがって、php.net によると、socket_create によって作成されたソケット、または socket_accept によって受け入れられたソケットを socket_read() の引数に入れることが可能です...

私が理解していれば、socket_create によって作成されたソケットは「ローカル」ソケットであり、socket_accept によって送信されたソケットはソケット クライアントです。

この場合、サーバー ソケットを socket_read のパラメータに配置して、このソケットへの複数の書き込みの中でクライアントを待機させたいと考えています。

より明確には、4つのクライアントを受け入れ、そのうちの1つがこのソケットに書き込むのを待ちますが、どのクライアントが書き込むかわからないため、特定のクライアントソケットをパラメーターに入れることはできません...

そして、socket_createによって作成されたソケットを配置すると、phpはエラーを返します

私の母国語はご覧のとおり英語ではありませんが、誰も私に答えることができませんでした...

if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) {
            echo "socket_create() a échoué : raison : " . socket_strerror(socket_last_error()) . "\n";
        } 

        if (socket_bind($sock, $this->address, $this->port) === false) {
            echo "socket_bind() a échoué : raison : " . socket_strerror(socket_last_error($sock)) . "\n";
        }

        if (socket_listen($sock, 5) === false) {
            echo "socket_listen() a échoué : raison : " . socket_strerror(socket_last_error($sock)) . "\n";
        }

        for($i=0;$i<$this->maxClient;$i++){

            if(($client = socket_accept($sock)) === false){
                 echo "socket_accept() a échoué : raison : " . socket_strerror(socket_last_error($sock)) . "\n";
                 break; 
            }else echo "<br/>Client $client[$i] has connected\n";


            $this->joueurs[$i] = new Joueur($client,$i);
        } 
                    while($start){
            $messageClient = socket_read($sock , 1024);
                        ......
                    }

したがって、私には2つの問題があります。1つ目は、socket_read()がスクリプトをブロックしないようにする必要があることと、読み取るものが見つかるまでソケットをスキャンすることです。

2番目の問題は、プログラムが停止しないため、クライアントが何も受信せず、サーバーを停止するとクライアントがメッセージを受信することです...

何か考えはありますか?

ありがとう

4

2 に答える 2

0

私は私の問題を見つけました:ロック解除用 socket_read()

socket_set_option($socket,SOL_SOCKET, SO_RCVTIMEO, array("sec"=>1, "usec"=>0));
                socket_set_nonblock($socket);

そして、バッファをクリアするには、サーバーが停止したときにのみクライアントでメッセージを受信できるようにせずに「/ n」を使用します。

于 2012-12-08T23:17:17.227 に答える
0

慣れてくださいsocket_select- 複数のソケットが読み取り可能または書き込み可能になるのを待つか、エラーが発生するのを待つことができます。新しい接続が保留中または準備ができている場合、リッスンしているソケットは読み取り可能になりますaccept()

于 2012-12-06T20:42:37.227 に答える