【问题标题】:HTTP::Daemon and threadsHTTP::守护进程和线程
【发布时间】:2011-01-27 10:37:14
【问题描述】:

我在 Windows XP 和 ActiveState ActivePerl 5.8 上有以下代码。

它可能有什么问题?为什么它不起作用?

我尝试将其设置为我的 IE 的代理,但是当我从我的 IE 连接到某些 URL 时,没有任何反应。代码进入线程函数,没有任何反应。

use HTTP::Daemon;
use threads;
use HTTP::Status;
use LWP::UserAgent;

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

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

while (my $c = $d->accept) {
    threads->create(\&process_one_req, $c)->detach();
}

sub process_one_req {
    STDOUT->autoflush(1);
    my $c = shift;
    while (my $r = $c->get_request) {
        if ($r->method eq "GET") {
            print "Session info\n", $r->header('Host');
            my $ua       = LWP::UserAgent->new;
            my $response = $ua->request($r);
            $c->send_response($response);

        } else {
            $c->send_error(RC_FORBIDDEN);
        }

    }
    $c->close;
    undef($c);
}

【问题讨论】:

    标签: perl http


    【解决方案1】:

    我在 LWP::UserAgent->new 之前的代码中添加了以下行,它似乎对我有用(在 linux 中)。

    $r->uri("http://" . $r->header('Host') . "/" . $r->uri());
    

    您从原始请求的 HTTP::Request 对象获得的 uri 没有主机名。所以添加它以使其成为绝对的uri。测试如下:

    $ curl -D - -o /dev/null -s -H 'Host: www.yahoo.com' http://localhost:8080/
    HTTP/1.1 200 OK
    Date: Thu, 27 Jan 2011 12:59:56 GMT
    Server: libwww-perl-daemon/5.827
    Cache-Control: private
    Connection: close
    Date: Thu, 27 Jan 2011 12:57:15 GMT
    Age: 0
    ---snip--
    

    更新:看起来我完全错了。我不需要更改 URI 对象。你的原始代码在 Linux 中对我有用

    【讨论】:

      【解决方案2】:

      如果我没记错的话,这是因为 Windows 中的线程模型,除非特别要求,否则文件句柄不会在进程之间传递。 This PerlMonks post 似乎揭示了根本问题,并可能导致一种适合您的方法(我想您可能能够在客户端连接的文件描述符上调用 windows API 以允许在其中访问它生成的线程)。

      Windows 上的 Perl 线程通常让我头疼,而在 UNIX 列表系统上,我发现它们很容易处理。话又说回来,我想弄清楚如何正确使用分叉进程来模拟仅支持线程而不分叉的系统上的线程会让大多数人头疼。

      【讨论】:

        猜你喜欢
        • 2011-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多