NATの後ろにクライアントソケットがあり、そのプロセスで使用されているローカルポート番号を取得したいとします。PythonソケットNATポートアドレス
私の質問を説明するために、ここに簡単な例があります。次のコードを使用して
(client_socket, address) = self.welcome_socket.accept()
私は(NATの背後に)クライアントからの接続:
welcome_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
welcome_socket.bind(("", 1500))
welcome_socket.listen(5)
私は、着信接続をリッスン:
のは、私は次のコードを使用してサーバーを作成しましょう:
sock = socket.create_connection(("server_address", 1500))
ここで私は少し混乱しています。
私がサーバ側に持っているアドレスには、クライアントが接続しているWiFiネットワークのパブリックアドレス(私が期待している)と、NATの理解に基づいたポート番号が実際のポートとは異なるはずですクライアントが使用する番号で、アドレス変換に使用されます。
ただし、クライアントでgetsockname()関数を使用した場合、サーバーから与えられたものと同じポート番号が返されます。
コードの例に戻ります。サーバー上で
:クライアントで
client_socket.getpeername()
>>> ('WiFi_address', 4551)
:だから
sock.getsockname()
>>> ('local_address', 4551)
、両方のポート番号は、クライアントがNATの背後にあるにもかかわらず、同じです。これはどうですか? NATの仕組みを誤解していますか?または、クライアントソケットがバインドされている物理アドレスを取得する別のコマンドがありますか?
洞察力があれば幸いです。