0

最近、ソケットを使用して python でクライアント/サーバーのペアを作成しましたが、問題は、クライアントが別のネットワーク上のサーバーに接続しないことです。ポート転送を試み、内部 IP アドレスを静的にしてみました。クライアントを接続するには外部/パブリック IP アドレスが必要です。この場合、ISP が外部 IP アドレスを変更したときに何をすべきか。いくつかの提案をお願いします、ありがとう。

code:

PORT=8888
srvsock = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
srvsock.setsockopt( socket.SOL_SOCKET, socket.SO_REUSEADDR, 1 )
srvsock.bind( ('', PORT) )
srvsock.listen( 10 )
print 'server now listening on PORT '+str(PORT)

while 1:

  clisock, (remhost, remport) = srvsock.accept()
  dl_information_file="server.txt"
  if os.path.exists(dl_information_file):
      f=open('server.txt','rb')
      read=f.read()
      clisock.send( read )
      f.close()
4

2 に答える 2

0

クライアントとサーバーはローカル ネットワーク上にありますか、それともクライアントとサーバーはインターネットで分離されていますか?

サーバーが NAT の背後にあるマシンで実行されている場合は、そのマシンでポート転送を実行し、マシンの IP が静的であることを確認するか、更新された IP でクライアントを更新する必要があります。

サーバーが独自のネットワーク内にある場合は、 を使用socket.gethostbyname(socket.getfqdn())してインターフェイスの IP を取得し (注意: 複数ある場合があります)、その IP を使用してソケットをバインドできます。

また、WireShark を使用して接続のトラブルシューティングを行うこともできます。どのパケットがクライアントから送信され、どのパケットがサーバーに送信されているかを確認できます。

これ以上のコードとネットワークに関する情報がなければ、それ以上のことを言うのは非常に困難です。それはファイアウォールである可能性があり、NAT である可能性があり、不適切に構成されたインターフェイスである可能性があります。

編集:ソケットを''にバインドしているようです。つまり、localhost ポートにバインドする必要があります。つまり、サーバーはローカル ループバック (127.0.0.1) で接続をリッスンします。このインターフェイスは、サーバーが実行されている他のマシンからはアクセスできません。スクリプトの変数で静的に構成された IP を使用するか、それを使用する必要がありますsocket.gethostbyname(socket.getfqdn()))

于 2012-11-01T10:58:09.030 に答える
0

まず、サーバーとクライアントの両方を同じコンピューターから実行してみます (localhost に接続します)。

それが機能する場合、問題はポート転送に関連しています。参照:ポートフォワードの方法

于 2012-11-01T10:50:28.313 に答える