2012-01-20 7 views
0

現在、PHPでサービスに接続するための非ブロックソケットを使用しています。私が無視する致命的ではないエラーですが、私は決して適切なエラーを取得しないため、接続がサーバーの終了に伴っていつドロップされたかを知ることができませんでした。この問題に関する提案はありますか?PHPソケットは、サーバーがオフラインになったために接続が終了したときに通知します。

マイリスニングルーチンは我々がどこリモートサービスの数と協力ので

$this->shouldListen = true; 
$fullResponse = ''; 

while ($this->shouldListen) { 

    //read some data 
    $tempResponse=socket_read($this->sock,1000); 
    if ($this->shouldBeRunning() == false) { 
    break; 
    } 

    if ($tempResponse == FALSE) { 
    //ignore ignorable error 
    $error = socket_last_error($this->sock); 
    if ($error!=11 && $error!=115 && $error!=10035) { 
     $this->writeLogFile("got an error ".$error); 
     break; 
    } 
    } else { 
    //do something with the response 
    } 

} 

のように見えるので、

function connect() { 

    /* Turn on implicit output flushing so we see what we're getting 
    * as it comes in. */ 
    ob_implicit_flush(); 

    if (($this->sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) { 
    return false; 
    // echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n"; 
    } else { 
    //echo 'success1<br />'; 
    } 

    if (socket_bind($this->sock, '0.0.0.0') === false) { 
    return false; 
    //echo "socket_bind() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n"; 
    } else { 
    //echo 'success2<br />'; 
    } 

    if (socket_connect($this->sock, $this->ip, $this->port) === false) { 
    //echo "socket_connect() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n"; 
    return false; 
    } else { 
    //echo 'success3<br />'; 
    } 

    socket_set_nonblock($this->sock); 
    return true; 
} 

おかげ

ダニエル

+2

いくつかのコードを表示できますか? –

+0

@Pekkaは私がリッスンしてソケット接続を作成するために使用するコードを投稿しました – Daniel

+0

これは、 'fsockopen()'または 'stream_socket _ *()'を使用するのが好きな理由の1つです。クローズドストリームを検出するためのリソースもちろん、サーバがダウンして、 'FIN'や' RST'を送信しない場合、それを検出することはできません。タイムアウト/キープアライブ/ ACKシステムを実装するだけです。 – DaveRandom

答えて

1

のようなソケット接続を作成します私たちは、私たちがサービスを提供しているかどうかをテストするために、「ping」メソッドを組み込む必要があります。再接続されてもアクティブな接続が残っています。スクリプト内にこのpingの概念を実装することをお勧めします。

誰かがPHPのsocket_createページにsocket_ *ライブラリを使用してユーティリティpingメソッドを投稿しました。

+0

いや、他に何も出てこないのなら、このようなことをやろうと思った – Daniel

関連する問題