2012-01-29 3 views
0

У меня есть небольшой скрипт веб-сервера. Если я установил его на «localhost» - тогда я не могу подключиться к этому порту со стороны. Если я установил его в полное доменное имя - тогда я не могу telnet следующим образом: «telnet localhost 7777». Каков правильный способ назвать хост в этом случае?socket надлежащее имя хоста 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

ответ

0

Да. У вас есть два варианта. Самый простой способ - связать сокет с 0.0.0.0, который свяжет сокет со всеми интерфейсами на машине. (Удостоверьтесь, однако, что вы действительно хотите все интерфейсы.)

В противном случае вы всегда можете создать> 1 сокет и привязать их индивидуально к интерфейсам, которые имеют смысл.

Вы пишете весь веб-сервер в PHP?

Кроме того, если функции чтения сокетов PHP работают как в большинстве операционных систем, то ваш внутренний цикл, вероятно, неверен: в то время как HTTP-запрос заканчивается пустым подобным, это не означает, что функция read операционной системы для сегментации данных по строкам.

Edit:socket_read по-видимому, будет результаты сегмента по линии (это необычно), но вы должны указать его в качестве третьего параметра. Согласно документации, по умолчанию будет не сегмент за строкой, но это не всегда так, то есть по умолчанию изменено. Вероятно, вы должны указать его, чтобы убедиться, что ваш код не сломается при обновлении. (И, может быть, обновление, пока вы на нем ...)