1

簡単な 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);
}

現在、私の問題は、同じマシンでテストすると、このサーバーが正しく動作することです。同じネットワーク内の別のコンピューターからサーバーにアクセスしようとすると、サーバーは要求をまったく受信しません。サーバーを外部の世界に公開するための必須の (単純かもしれませんが、私は初心者です!) ステップがありませんか?

この点についてご協力いただきありがとうございます。


更新: 以下は、サーバーを実行したときに受け取る出力の例です。

ウェブサーバー開始!

サーバーアドレス: 0.0.0.0

サーバーポート: 80

私に連絡してください:

リクエストを頂きました…

リクエストを頂きました…

URI: /

リクエストを頂きました…

URI: /

リクエストを頂きました…

リクエストを頂きました…

URI: /


最新の更新:

問題が上で説明したものとは異なることに気付きました。結局、別のコンピューターからサーバーにアクセスできました。コードからわかるように、リクエストを満たすために別のスレッドを作成しているわけではありません。奇妙なことに、ブラウザーからサーバーにアクセスすると、最初に要求を送信したブラウザーを閉じるまで、他のコンピューターからのすべての要求がタイムアウトになります (そして、要求に対する応答が得られます)。一方、同じブラウザからの複数のリクエストは正常に処理されます。ただし、libwww-perl ライブラリを使用して Perl で記述されたクライアントからリクエストを送信した場合、これは発生しません。

これはどのように最初の問題に変換されますか? サーバーをテストするたびに、最初はブラウザーを使用して同じマシンからテストしました。次に、最初にサーバーをテストしたブラウザーを閉じずに、別のマシンからサーバーにアクセスしようとしました。そして、予想通り、うまくいきませんでした。

コメントありがとうございます。

4

2 に答える 2

2

Q: PC (例: "myhttpserver") にはファイアウォールがありますか? 無効にしてみましたか?

Q: 「telnet myhttpserver 80」は試しましたか? 「httpserverにping」できますか?

これは、プログラミングの問題というよりも、ネットワーク/ネットワーク構成の問題のように思えます。ホストが相互に認識できること、および http ポートが開いていることを確認してください。

于 2012-03-23T16:24:46.263 に答える
1

HTTP::Daemon コンストラクターのパラメーターで LocalAddr を定義していないようです。デフォルトで localhost になっている可能性があります。その場合、指定したとおりの症状が表示されます。追加してみる

LocalAddr => '<your ip>'

コンストラクターに渡して、それが役立つかどうかを確認してください

于 2012-03-23T17:33:40.917 に答える