2

ソケットをリッスンする 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 と同様に、タイムアウトになるまでハングします。

4

1 に答える 1