【问题标题】:HTTP server using perl HTTP::Daemon - only works from the same computer the server is running on使用 perl HTTP::Daemon 的 HTTP 服务器 - 只能在服务器运行的同一台计算机上工作
【发布时间】:2012-04-08 05:23:06
【问题描述】:

我将创建一个简单的 HTTP 服务器,我还将为其创建一些客户端。现在我正在通过浏览器使用 HTTP::Daemon 测试我在 perl 中创建的简单服务器。

我的服务器代码如下:

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

目前,我的问题是,当我在同一台机器上测试该服务器时,它可以正常工作。当我尝试通过同一网络中的另一台计算机访问服务器时,服务器根本没有收到请求。我是否错过了将服务器暴露给外界的强制性(可能很简单?我是新手!)步骤?

感谢您在这方面的帮助,


更新:下面是我运行服务器时收到的输出示例:

Web 服务器已启动!

服务器地址:0.0.0.0

服务器端口:80

请联系我:

收到请求...

收到请求...

URI:/

收到请求...

URI:/

收到请求...

收到请求...

URI:/


最新更新:

我意识到问题与我上面描述的不同。毕竟,我可以从另一台计算机访问我的服务器。从代码中可以看出,我没有创建单独的线程来满足请求。奇怪的是,当我从浏览器访问我的服务器时,来自其他计算机的所有请求都会超时,直到我关闭最初发送请求的浏览器(并得到请求的答案)。同时,来自同一浏览器的多个请求都成功完成。但是,当我使用 libwww-perl 库从用 Perl 编写的客户端发送请求时,不会发生这种情况。

这如何转化为最初的问题? 每次我想测试我的服务器时,我都会先在同一台机器上使用浏览器进行测试。然后,我尝试在不关闭最初测试服务器的浏览器的情况下从另一台机器访问服务器;而且,正如预期的那样,它没有用。

感谢你们的 cmets 伙计们。

【问题讨论】:

  • 让我们从更多信息开始。当你启动你的服务器时,它会打印出一些东西。请提供这些。

标签: perl http http-daemon


【解决方案1】:

问:PC(例如“myhttpserver”)是否有防火墙?您是否尝试过禁用它?

问:你试过“telnet myhttpserver 80”吗?你能“ping httpserver”吗?

这听起来更像是网络/网络配置问题,而不是编程问题。请确保主机可以互相看到,并且 http 端口是开放的。

【讨论】:

  • 我正在尝试将我的应用程序和端口的例外添加到防火墙。有一些问题。会在这里更新
【解决方案2】:

您似乎没有在 HTTP::Daemon 构造函数的参数中定义 LocalAddr。它可能默认为 localhost,在这种情况下,您将看到与您提供的完全一样的症状。尝试添加

LocalAddr => '<your ip>'

给你的构造函数看看是否有帮助

【讨论】:

  • 我想到了,但代码没有显示 localhost 被用作默认值。从那时起,他的输出指定:“服务器地址:0.0.0.0”,这是正确的。 (INADDR_ANY,通常为 0.0.0.0,表示接受来自任何接口的连接。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多