2017-10-06 3 views
0

私はPHPソケットサーバーを作っていますが、私のサーバーにソケットを読み取らせることができません。PHPサーバが作成したばかりのソケットをどのように読み取るのですか?

$this->log("Creating socket (please wait)..."); 

    $this->socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 
    if(socket_bind($this->socket, "127.0.0.1", 8080) === false){ 
     $this->log("Failed to bind socket to port (8080)"); 
     exit(); 
    } 
    socket_listen($this->socket, 5); 

    if(!is_resource($this->socket)){ 
     $this->log("Socket isn't a resource. Something went wrong, exiting."); 
     exit(); 
    } 

    $this->log("Socket created, creating socket reader..."); 
    $this->socketReader = new SocketReader($this); 

    $this->log("server started"); 

    //socket should be non-blocking 
    socket_set_nonblock($this->getSocket()); 

    //called every 10000 microseconds to read socket (error line here) 
    public function process(){ 
     $buffer = socket_read($this->getSocket(), 128); 
     var_dump($buffer);, 
    } 

私が手にエラーがある:

`Warning: socket_read(): unable to read from socket [57]: Socket is not connected` when calling proccess(). 

これはなぜでしょうか?ソケットは正常に作成されますが、潜在的な受信データを読み取ろうとするとエラーが発生します。

+0

着信接続に接続された新しいソケットを返すには、socket_accept()を呼び出す必要があります。 – Barmar

+0

@Barmar私がそれを呼び出すと、サーバーはフリーズします。私がそのset_non_blockを呼び出すと、falseを返します。私はサーバが接続を待つのを望んでおらず、ちょうどそれらをダニでパッシブに検出します。 – captincrunch

+0

非ブロックにして、定期的に 'socket_accept'を呼び出します。 falseを返した場合、処理するための接続はありません。それがリソースを返すとき、それから読むことができます。 – Barmar

答えて

0

着信接続用の新しいソケットを入手するには、socket_accept()に電話してからそれを読む必要があります。

//called every 10000 microseconds to read socket 
public function process(){ 
    $connection = socket_accept($this->getSocket()); 
    if ($connection) { 
     socket_set_nonblock($connection); 
     $buffer = socket_read($connection, 128); 
     var_dump($buffer); 
     socket_close($connection); 
    } 
} 
関連する問題