2012-01-29 5 views
0

작은 웹 서버 스크립트가 있습니다. 'localhost'로 설정하면 외부에서 해당 포트로 텔넷 할 수 없습니다. 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로 작성하고 있습니까? 일반적으로 아파치, nginx 등과 같은 것을 실제 웹 서버로 사용하며, PHP는 컨텐츠를 제공하는 책임을집니다. – Thanatos

답변

0

예. 두 가지 옵션이 있습니다. 가장 쉬운 방법은 소켓을 컴퓨터의 모든 인터페이스에 바인드하는 0.0.0.0에 바인드하는 것입니다. 실제로 모두 인터페이스를 원한다는 것을 확인하십시오.

그렇지 않으면 언제나 1보다 큰 소켓을 생성하여 의미있는 인터페이스에 개별적으로 바인딩 할 수 있습니다.

PHP로 전체 웹 서버를 작성하고 있습니까?

또한 PHP의 소켓 읽기 기능이 대부분의 운영 체제처럼 작동하는 경우 내부 루프가 올바르지 않을 수 있습니다. HTTP 요청은 공백으로 끝나지만 OS의 read 기능이 작동한다는 것을 의미하지는 않습니다. 데이터를 한 줄씩 구분합니다.

편집 :socket_read 분명히 것이다 선으로 세그먼트 결과 (이 드문),하지만 당신은 세 번째 매개 변수로 지정해야합니다. 문서에 따르면 기본값은 이 아니며 줄 단위로이 아니라 항상 그렇지는 않습니다 - 즉, 기본값이 변경되었습니다. 업그레이드 할 때 코드가 손상되지 않도록 지정해야합니다. (그리고 어쩌면 업그레이드 할 때 ...)