0

我有一个使用来自 cpan的模块HTTP::AppServer的 http 服务器。

我可以使用127.0.0.1or连接到我的服务器localhost,而使用::1.

以下是 curl 的一些示例:

$ curl http://127.0.0.1:8080/index.html
This is a test.
$ curl -g http://[::1]:8080/index.html
curl: (7) couldn't connect to host

这是服务器的启动方式:

use HTTP::AppServer;
use IO::Socket::IP -register;

  my $server = HTTP::AppServer->new( StartBackground => 0, ServerPort => 8080 );

  $server->plugin('FileRetriever', DocRoot => '/tmp');

  $server->start; 

实际上它要复杂得多。但我不认为脚本的所有其余部分都是必要的。我添加了模块IO::Socket::IP并将模块 Socket 升级到此处找到的版本,以使 IO::Socket::IP 工作。

仍然,它不起作用。

4

3 回答 3

0

尝试使用比 5.14 更新的 Perl 版本。

http://www.perl.org/about/whitepapers/perl-ipv6.html

于 2012-07-11T20:43:20.503 回答
0

在 LeoNerd 说 IO::Socket::IP 在这种情况下无法帮助我之后,我找到了一个替代解决方案,尽管这个解决方案只适用于某些 perl 版本。

HTTP::AppServer 基于 HTTP::Server::Simple,我在 cpan 上找到了支持 ipv6 的第二个模块的更新版本。

首先,您需要在此处下载较新版本的 HTTP::Server::Simple:

http://metacpan.org/pod/HTTP::Server::Simple

如您所见,它有一个new接受新参数的不同方法family

现在您必须获取 HTTP::AppServer.pm 并init

sub init
{
    my ($self, %opts) = @_;

    # server options defaults
    my %defaults = (StartBackground => 0, ServerPort => 3000);

    # set options or use defaults
    map { $self->{$_} = (exists $opts{$_} ? $opts{$_} : $defaults{$_}) }
        keys %defaults;

    $self->{'server'} = HTTP::AppServer::Base->new($self->{'ServerPort'});

    return $self;
}

sub init
{
    my ($self, %opts) = @_;

    # server options defaults
    my %defaults = (StartBackground => 0, ServerPort => 3000);

    # set options or use defaults
    map { $self->{$_} = (exists $opts{$_} ? $opts{$_} : $defaults{$_}) }
        keys %defaults;

    $self->{'server'} = HTTP::AppServer::Base->new($self->{'ServerPort'}, Socket::AF_INET6);

    return $self;
}

不幸的是,这回答了问题,但不是我的问题,因为它不适用于 perl 5.8.8 也将 Socket.pm 升级到最新版本。

于 2012-07-18T17:53:49.587 回答
0

如果这不起作用,则可能是IO::Socket::IP或中某处的错误HTTP::AppServer。你能把它作为 RT 上的 bug 发给我吗IO::Socket::IP,我会研究一下。

https://rt.cpan.org/Dist/Display.html?Queue=IO-Socket-IP

于 2012-07-12T12:01:45.923 回答