HTTP-сервер, использующий perl HTTP :: Daemon - работает только с того же компьютера, на котором работает сервер - PullRequest
1 голос
/ 23 марта 2012

Я собираюсь создать простой HTTP-сервер, для которого я также создам несколько клиентов.Сейчас я тестирую мой простой сервер, созданный в Perl, используя HTTP :: Daemon с помощью браузера.

Мой код сервера выглядит следующим образом:

use HTTP::Daemon;
use HTTP::Status;

my $d = HTTP::Daemon->new(LocalPort => 80,
                      Listen => 20) || die;

print "Web Server started!\n";
print "Server Address: ", $d->sockhost(), "\n";
print "Server Port: ", $d->sockport(), "\n";


print "Please contact me at: <URL:", $d->url, ">\n";
while (my $c = $d->accept) {

    print "received a request...\n";

    while (my $r = $c->get_request) {

        print "URI: " . $r->uri->path . "\n";

        if ($r->method eq 'GET' and $r->uri->path eq "/") {

            # remember, this is *not* recommended practice :-)

            $c->send_file_response("http_daemon_test.pl");

        }

        else {

            print "method: " . $r->method;

            print " uri:" . $r->uri . "\n";

            $c->send_error(RC_FORBIDDEN, "please do not try again")
        }
    }

    $c->close;

    undef($c);
}

В настоящее время моя проблема заключается в том, что этот серверработает правильно, когда я тестирую его на той же машине.Когда я пытаюсь получить доступ к серверу с другого компьютера в той же сети, сервер вообще не получает запрос.Я пропускаю обязательный (может быть простой? Я новичок!) Шаг, чтобы выставить сервер для внешнего мира?

Я ценю вашу помощь в этом отношении,


Обновление: ниже приведен пример вывода, который я получаю при запуске сервера:

Веб-сервер запущен!

Адрес сервера: 0.0.0.0

Порт сервера: 80

Пожалуйста, свяжитесь со мной по адресу:

получил запрос ...

получил запрос ...

URI: /

получил запрос ...

URI: /

получил запрос ...

получил запрос ...

URI: /


Последнее обновление:

Я понял, что проблема отличается от того, что я описал выше.В конце концов, я мог получить доступ к своему серверу с другого компьютера.Как видно из кода, я не создаю отдельный поток для выполнения запроса.Как ни странно, когда я получаю доступ к своему серверу из браузера, все запросы с других компьютеров будут задерживаться до тех пор, пока я не закрою браузер, с которого я изначально отправил запрос (и не получил ответ на запрос).Между тем, несколько запросов от одного и того же браузера успешно выполняются.Однако этого не происходит, когда я отправляю запросы от клиентов, написанных на Perl, с использованием библиотеки libwww-perl.

Как это приводит к первоначальной проблеме? Каждый раз, когда я хотел проверить своисервер, я сделал это сначала с той же машины, используя браузер.Затем я попытался получить доступ к серверу с другого компьютера, не закрывая браузер, с которым я изначально тестировал сервер;и, как и ожидалось, это не сработало.

Спасибо за ваши комментарии, ребята.

Ответы [ 2 ]

2 голосов
/ 23 марта 2012

В: Есть ли на ПК (например, myhttpserver) брандмауэр? Вы пытались отключить его?

В: Вы пробовали "telnet myhttpserver 80"? Вы можете "пинговать httpserver"?

Звучит так, что это скорее вопрос сети / конфигурации сети, чем вопрос программирования. Убедитесь, что хосты видят друг друга, и что http-порт открыт.

1 голос
/ 23 марта 2012

Похоже, вы не определили LocalAddr в параметрах для конструктора HTTP :: Daemon.Возможно, по умолчанию используется localhost, и в этом случае вы увидите симптомы именно так, как вы указали.Попробуйте добавить

LocalAddr => '<your ip>'

в ваш конструктор и посмотрите, поможет ли это

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