2012-03-23 7 views
1

単純なHTTPサーバーを作成します。今私はブラウザでHTTP :: Daemonを使ってperlで作成した簡単なサーバーをテストしています。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); 
} 

は現在、私の問題は、私は、同じマシン上でそれをテストする場合、このサーバーが正常に動作することで、次のように

私のサーバーコードがあります。同じネットワーク内の別のコンピュータによってサーバーにアクセスしようとすると、サーバーは要求をまったく受信しません。サーバーを外部に公開するために必須の(おそらくシンプル?私は初心者です!)ステップがありませんか?

私はこの点であなたの助けに感謝し、


更新:開始

Webサーバー:怒鳴る私は、サーバーを実行したとき、私は受信出力の一例です!

サーバーアドレス:0.0.0.0

サーバーポート:80

で私に連絡してください:

要求を受けた...

...依頼を受け

URI:/

...

URI:/

は要求を受けた...依頼を受け...

URI:/


最新のアップデート:

問題は私のものとは違うことに気づいた上記でエスケープ。結局、私は別のコンピュータから私のサーバにアクセスすることができました。コードからわかるように、私は要求を満たすために別のスレッドを作成していません。不思議なことに、ブラウザからサーバーにアクセスすると、最初に要求を送信したブラウザーを閉じるまで(そして要求の答えを得て)、他のコンピューターからのすべての要求がタイムアウトになります。同時に、同じブラウザからの複数のリクエストが正常に実行されます。しかし、私がPerlで書かれたクライアントからのリクエストをlibwww-perlライブラリを使って送ったときに、これは起こりません。

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

ご意見ありがとうございます。

+0

だが、いくつかのより多くの情報を見てみましょうことができますかどうかを確認してみてください。サーバーを起動すると、いくつかのことが表示されます。それらを提供してください。それは確かに –

答えて

2

Q:PC(「myhttpserver」など)にファイアウォールがありますか?あなたはそれを無効にしようとしましたか?

Q:「telnet myhttpserver 80」を試しましたか?あなたは "ping httpserver"できますか?

これは、プログラミングに関する質問よりも、ネットワーク/ネットワーク設定の問題のようです。ホストがお互いを見て、httpポートが開いていることを確認してください。

+0

です。 –

+0

ファイアウォールにアプリケーションとポートの例外を追加しようとしています。それにいくつかの問題があります。ここで更新されます – nav

1

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

LocalAddr => '<your ip>' 

を追加し、それが

+0

私はそれを考えましたが、コードはlocalhostがデフォルトとして使われていることを明らかにしません。それ以来、彼の出力は "Server Address:0.0.0.0"と指定されています。 (INADDR_ANY、通常0.0.0.0は、どのインタフェースからの接続も受け入れます)。 – ikegami

関連する問題