сокет собственное имя хоста PHP - PullRequest
0 голосов
/ 29 января 2012

У меня есть небольшой скрипт веб-сервера. Если я установлю его на «localhost» - тогда я не смогу подключиться к этому порту извне. Если я установлю его на полное доменное имя - тогда я не могу telnet следующим образом: 'telnet localhost 7777'. Как правильно назвать хост в этом случае?

$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);

    }

1 Ответ

0 голосов
/ 29 января 2012

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...