2012-01-29 44 views
0

我有一個小型的Web服務器腳本。如果我將它設置爲'localhost' - 那麼我無法從外部telnet到該端口。如果我將它設置爲FQDN - 那麼我不能像這樣telnet:'telnet localhost 7777'。在這種情況下命名主機的正確方法是什麼?套接字正確的主機名PHP

$host = 'localhost'; 
$port = 7777; 
set_time_limit(0); 
$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n"); 
$result = socket_bind($socket, $host, $port) or die("Could not bind to socket\n"); 
$result = socket_listen($socket, 3) or die("Could not set up socket listener\n"); 

while(1) 
{ 
    $spawn = socket_accept($socket) or die("Could not accept incoming connection\n"); 
    $input = socket_read($spawn, 1024) or die("Could not read input\n"); 

    while(trim($input)!="") 
    { 
      $msg=$msg.$input; 
      $input = socket_read($spawn, 1024) or die("Could not read input\n"); 
    } 

    $webserver = new Server($msg); 
    $output = $webserver->response(); 
    unset($msg); 
    socket_write($spawn, $output, strlen ($output)) or die("Could not write output\n"); 
    socket_close($spawn); 

    } 
+0

你正在寫整個網絡服務器在PHP?通常情況下,您使用Apache,nginx等實際的網絡服務器,PHP只負責提供內容。 – Thanatos 2012-01-29 01:59:13

回答

0

是的。你有兩個選擇。最簡單的方法是將套接字綁定到0.0.0.0,該套接字將套接字綁定到機器上的所有接口。 (請確保你確實想要所有的接口。)

否則,你總是可以創建> 1套接字,並將它們分別綁定到有意義的接口上。

你正在用PHP編寫整個網絡服務器?另外,如果PHP的套接字閱讀功能像大多數操作系統一樣工作,那麼你的內部循環可能是不正確的:雖然HTTP請求確實以空白結束,但這並不意味着操作系統的read功能正在進行逐行分割數據。

編輯:socket_read顯然分部業績由線(這是不尋常的),但你需要指定它作爲第三個參數。根據該文件,默認將不是逐行,但這並非總是如此 - 即默認情況下已更改。您應該指定它來確保您的代碼在升級時不會中斷。 (也許升級,而你在...)