2013-03-13 92 views
0

嗨下面的socket_read函數存在問題,它在讀完數據後不會返回空字符串''。在第二次調用socket_read()時,它只是掛在那裏,頁面繼續在瀏覽器中加載而不返回。 它可以在服務器關閉連接的情況下工作,服務器是否必須關閉客戶端套接字?由於PHP socket_read不返回空字符串''

$json = $_GET['json']; 

    /* Get the port for the WWW service. */ 
    // $service_port = getservbyname('www', 'tcp'); 
    $service_port = "1111"; 

    /* Get the IP address for the target host. */ 
    $address = "192.168.3.5"; 

    /* Create a TCP/IP socket. */ 
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 
    if ($socket === false) { 
     echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n"; 
     die(); 
    } else { 
     //echo "OK.\n"; 
    } 

    //echo "Attempting to connect to '$address' on port '$service_port'..."; 
    $result = socket_connect($socket, $address, $service_port); 
    if ($result === false) { 
     echo "socket_connect() failed.\nReason: ($result) " . socket_strerror(socket_last_error($socket)) . "\n"; 
     die(); 
    } else { 
     //echo "OK.\n"; 
    } 

    $out = ''; 

    //echo "Sending HTTP HEAD request..."; 
    $result = socket_write($socket, $json, strlen($json)); 

    if ($result === false) { 
     echo "socket_connect() failed.\nReason: ($result) " . socket_strerror(socket_last_error($socket)) . "\n"; 
     die(); 
    } else { 
     //echo "OK.\n"; 
    } 



    echo socket_read($socket, 2048); 
    echo socket_read($socket, 2048); 
// 
    // while (socket_read($socket, 2048) !== '') { 
     // echo $out; 
//  
    // } 
// 
    socket_close($socket); 

回答

1

是的,這正是我期望它做的事情 - socket_read(),除非你打開一個二進制服務器用「\ 0」響應絕不會返回一個空字符串。

您似乎在嘗試編寫HTTP客戶端。如果你是,立即停止,扔掉你的代碼,並閱讀Curl擴展。 HTTP不是一個簡單的協議,你仍然有很多東西需要了解簡單的東西是如何工作的。您正在依賴套接字狀態和數據格式來確定數據流 - 但HTTP不使用。

如果您想了解HTTP如何工作,那麼在互聯網上有很多文檔 - RFC是必須的,但不是一個溫和的介紹。如果你的目標是開發一個應用程序,然後使用curl(甚至HTTP流包裝)。

+0

嗨,我確實從服務器發送了'\ 0',但它仍然不返回空字符串。或者,我只需從服務器發送##,然後在php中檢查##以結束循環。 我知道curl,而不是試圖寫一個HTTP客戶端。我只想讓php與我寫的C++ winsock應用程序通信。 感謝您的幫助。 – William 2013-03-14 03:56:22