2013-05-21 93 views
0

我試圖設置一個WebSocket應用程序,但我堅持以下。 接受我收到了客戶的標頭,預計插座後,但是當我試圖升級送回socket_write()拋出一個警告:PHP:write_socket()給出意想不到的警告

Warning: socket_write(): unable to write to socket [10038]: An operation was attempted on something that is not a socket 

這發生在下面的代碼段:

var_dump($this->socket); //output: resource(2) of type (Socket) 
socket_write($this->socket, $upgrade); 

這發生在pthreads上下文中。
什麼可能的原因PHP向我發出此警告?

的完整代碼:

public function handshake($headers) 
{ 
    Main::console($headers); 
    Main::console("Getting client WebSocket version..."); 
    Main::console("Headers: \r\n\r\n".$headers); 
    if(preg_match("/Sec-WebSocket-Version: (.*)\r\n/", $headers, $match)) 
     $version = $match[1]; 
    else { 
     Main::console("The client doesn't support WebSocket"); 
     return false; 
    } 

    Main::console("Client WebSocket version is {$version}, (required: 13)"); 
    if($version == 13) { 
     // Extract header variables 
     Main::console("Getting headers..."); 
     if(preg_match("/GET (.*) HTTP/", $headers, $match)) 
      $root = $match[1]; 
     if(preg_match("/Host: (.*)\r\n/", $headers, $match)) 
      $host = $match[1]; 
     if(preg_match("/Origin: (.*)\r\n/", $headers, $match)) 
      $origin = $match[1]; 
     if(preg_match("/Sec-WebSocket-Key: (.*)\r\n/", $headers, $match)) 
      $key = $match[1]; 

     Main::console("Client headers are:\r\n\r\n". 
         "- Root: ".$root."\r\n". 
         "- Host: ".$host."\r\n". 
         "- Origin: ".$origin."\r\n". 
         "- Sec-WebSocket-Key: ".$key."\n"); 

     Main::console("Generating Sec-WebSocket-Accept key..."); 
     $acceptKey = $key.'258EAFA5-E914-47DA-95CA-C5AB0DC85B11'; 
     $acceptKey = base64_encode(sha1($acceptKey, true)); 

     $upgrade = "HTTP/1.1 101 Switching Protocols\r\n". 
        "Upgrade: websocket\r\n". 
        "Connection: Upgrade\r\n". 
        "Sec-WebSocket-Accept: $acceptKey". 
        "\r\n\r\n"; 

     Main::console("Sending this response to the client #{$this->getId()}:\r\n\r\n".$upgrade); 
     var_dump($this->socket); 
     socket_write($this->socket, $upgrade, strlen($upgrade)); 
     $this->setHandshake(true); 
     Main::console("Handshake is successfully done!"); 
     return true; 
    } 
    else { 
     Main::console("WebSocket version 13 required (the client supports version {$version})"); 
     return false; 
    } 
} 

public function run() 
{ 
while($this->alive) 
{ 
    $bytes = @socket_recv($this->socket, $buffer, 4096, MSG_WAITALL); 
    if ($buffer) 
     { 
     if(!$this->handshake) 
     { 
      $this->handshake($buffer); 
     } else { 
      Main::console("Client {$this->getID()} says {$buffer}"); 
     } 
    } 
} 

}

+0

您可能想向我們展示您用於此的代碼。 – alk

回答