2013-07-02 44 views
0

這是我的PHP客戶端代碼的服務器:腓socket_close()掛起我的客戶,直到disconect我

<?php 
    $service_port = 5310; 
    $address = gethostbyname('192.168.40.100'); 

    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 
    if ($socket === false) 
     echo "socket_create() falló: razón: " . socket_strerror(socket_last_error()) . "<br />"; 
    else 
    { 
     $result = socket_connect($socket, $address, $service_port); 
     if ($result === false) 
      echo "socket_connect() falló.\nRazón: ($result) " . socket_strerror(socket_last_error($socket)) . "<br />"; 
     else 
     { 
      $in = "Envio esto: HOLA"; 
      $out = 'RESPONSE: '; 
      echo "ANTES: " . date("H:i:s") . "<br />"; // #1 
      socket_write($socket, $in, strlen($in)); 
      echo "DESPUÉS: " . date("H:i:s") . "<br />"; // #2 Same time as #1 
      // Leer/imprimir respuesta 
      while ($out = socket_read($socket, 2048)) 
       echo "RESPONSE: " . date("H:i:s") . " " . $out; // #3 Same time as #2 
     } 
    } 

    // Cerramos socket 
    socket_close($socket); 
    echo "BANANA: " . date("H:i:s") . "<br />"; // Always run when I got disconected from server 
?> 

我沒有訪問server code,但我讀了一點點,它在VB.net writen它使用了像Client.socket.send()這樣的東西,我得到了迴應,並且當服務器拋棄了我時,我發現這些回顯打印得很好,如果不是這樣,我的php將被掛起。

編輯 我爲了告訴請,disconect我的服務器添加另一個socket_write(),但第二個不被髮送到服務器。

<?php 
    $service_port = 5310; 
    $address = gethostbyname('192.168.40.100'); 

    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 
    if ($socket === false) 
     echo "socket_create() falló: razón: " . socket_strerror(socket_last_error()) . "<br />"; 
    else 
    { 
     $result = socket_connect($socket, $address, $service_port); 
     if ($result === false) 
      echo "socket_connect() falló.\nRazón: (" . $result . ") " . socket_strerror(socket_last_error($socket)) . "<br />"; 
     else 
     { 
      $in = "Envio esto: HOLA"; 
      $out = ''; 
      $response = "RESPONSE: "; 
      echo "PRIMERA;"; 
      socket_write($socket, $in, strlen($in)); 
      while ($out = socket_read($socket, 2048)) 
       $response .= $out; 
      echo $response . ";SEGUNDA;"; 
      $in = "close"; 
      $out = ''; 
      $response = ""; 
      socket_write($socket, $in, strlen($in)); 
      while ($out = socket_read($socket, 2048)) 
       $response .= $out; 
      echo $response . " " . date("H:i:s"); 
     } 
    } 
    socket_close($socket); 
?> 

回答

1

可能是因爲您處於阻塞模式。

嘗試

socket_set_nonblock($socket); 

連接後。

這樣,如果沒有數據要讀取,您將不會掛在socket_read()並關閉而無需等待服務器執行某些操作。

+0

嗨,謝謝你的回答,但我需要從服務器接收響應,所以我認爲我必須使用阻塞模式。我會更新我的代碼。 – rokimoki

+0

然後,一種解決方案是設置非阻塞,然後循環讀取調用,所以如果您從未從服務器收到任何數據,請再次嘗試讀取。 (然後設置一個自定義超時,或另一個檢查是否應該停止嘗試閱讀)。 – crowebird

+0

這是一個很好的解決方案,購買爲什麼它是我的PHP在沒有'nonblock'的情況下掛出''socket_close()'? – rokimoki

相關問題