ソケットをリッスンする Python プログラムを作成しようとしています。Python 2.7 で Windows 7 を使用しています。私が何をしても、ソケットはローカルマシンからアクセスできるようですが、ネットワーク上の他の場所からはアクセスできません。
私は次のコードを持っています:
from werkzeug.wrappers import Request, Response
@Request.application
def application(request):
return Response('Hello World!')
if __name__ == '__main__':
from werkzeug.serving import run_simple
# Using empty string or the machine's real IP address here
# gives the same problem
run_simple('0.0.0.0', 4000, application)
ローカル マシンから接続すると、応答が正常に表示されます。私が実行すると
$ curl 'http://192.168.1.1:4000/'
ネットワーク上の別の (Linux) ボックスから、curl がタイムアウトするまで長時間ハングします。Wireshark は、ポート 4000 への SYN パケットを受信したことを示していますが、ACK されていません。
このポートへのパケットがファイアウォールを通過できることを確認してみました (Wireshark で SYN が表示されるという事実は、これが問題ではないことを示唆しています)。Pythonを管理者として実行するように設定しようとしました(そして、それctypes.windll.shell32.IsUserAnAdmin()
がtrueを返すことを確認しました)。これは Werkzeug だけではなく、Python 標準ライブラリの SocketServer も試しました。
同じポートで Windows Apache を実行すると、ネットワーク全体から正常に動作します。これは、ネットワークやファイアウォール、または私のcurl
要求に問題がないことを示唆しています。
netstat -an
ショー:
TCP 0.0.0.0:4000 0.0.0.0:0 LISTENING
編集:次の最小限のコードで試しました。サーバー側 (Windows 7):
import socket
s = socket.socket()
s.bind(('', 8080))
s.listen(1)
remotesock, addr = s.accept()
Linux クライアントでは次のようにします。
import socket
s = socket.socket()
s.connect('192.168.1.1', 8080)
これは、curl と同様に、タイムアウトになるまでハングします。