【发布时间】:2016-12-14 21:23:41
【问题描述】:
我在 NAT 后面有一个客户端套接字,我想获取进程使用的本地端口号。
为了说明我的问题,这里有一个简单的例子。
假设我使用以下代码创建了一个服务器:
welcome_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
welcome_socket.bind(("", 1500))
welcome_socket.listen(5)
然后我监听传入的连接:
(client_socket, address) = self.welcome_socket.accept()
我使用以下代码从客户端(在 NAT 之后)进行连接:
sock = socket.create_connection(("server_address", 1500))
这是我有点困惑的地方。
我在服务器端获得的地址具有客户端连接到的 WiFi 网络的公共地址(我期望的)和一些端口号,根据我对 NAT 的理解,应该与实际端口号不同由客户端使用并用于地址转换。
但是,如果我在客户端上使用 getsockname() 函数,我会得到与服务器提供的端口号相同的端口号。
回到代码中的例子。
在服务器上:
client_socket.getpeername()
>>> ('WiFi_address', 4551)
在客户端:
sock.getsockname()
>>> ('local_address', 4551)
因此,即使客户端位于 NAT 之后,两个端口号也是相同的。这是怎么回事?我是否误解了 NAT 的工作原理?还是有其他命令可以获取客户端socket绑定的物理地址?
任何见解将不胜感激。
【问题讨论】: