0

さて、を使用するクラスがwhile(true)あり、ソケットを使用して接続します。今私の問題は、socket_set_nonblockを使用すると接続されないことで、「接続できませんでした」と表示されなくなります。パケットを送ってから入れると、最初からやり直してやり直します。

これが私の接続機能です:

function connect($ip, $port) {
        if($this->soc!=null) socket_close($this->soc);
        $this->soc = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
        if(!$this->soc) die(socket_strerror(socket_last_error($this->soc)));
        if(!socket_connect($this->soc,$ip,$port)) die("Could not connect."); 

    }

socket_set_nonblockを使用しようとしたときの関数は次のとおりです

function connect($ip, $port) {
        if($this->soc!=null) socket_close($this->soc);
        $this->soc = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
        socket_set_nonblock($this->soc);
        if(!$this->soc) die(socket_strerror(socket_last_error($this->soc)));
        if(!socket_connect($this->soc,$ip,$port)) die("Could not connect."); 

    }
4

1 に答える 1

0

まず、ソケットをノンブロッキング モードにする理由を説明する必要があります。これには主に 2 つの理由があります。

  • 単一のスレッドで複数のファイル記述子/ソケット (言語/プラットフォームに応じて) を多重化します。
  • 操作のタイムアウトを設定します。

とにかく、非ブロッキングには 2 つのフェーズがありますconnect()

  • 接続を開始します。php では、 で完了しますsocket_connect()が、通常はSOCKET_EINPROGRESS;で失敗します。その場合、フェーズ 2 が必要になります。
  • 接続が完了するのを待って、ステータスを確認します。待機部分はsocket_select()、イベントを待機しているいくつかのソケットを多重化できる で行われます。返されたら、返されたソケットを反復処理する必要があります。接続の成功を待っているソケットに到達したら、 で接続の結果を確認しsocket_get_option($socket, SOL_SOCKET, SO_ERROR)ます。
于 2012-11-04T12:08:55.977 に答える