当前位置: 首页 > 知识库问答 >
问题:

Python套接字NAT端口地址

贺高飞
2023-03-14
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()
sock = socket.create_connection(("server_address", 1500))

这就是我有点困惑的地方。

我在服务器端拿到的地址,有客户端连接的WiFi网络的公有地址(这是我预期的),还有一些端口号,基于我对NATs的理解,应该和客户端实际使用的端口号不一样,是用来翻译地址的。

但是,如果我在客户端上使用了getsockname()函数,则得到的端口号与服务器给出的端口号相同。

client_socket.getpeername()
>>> ('WiFi_address', 4551)
sock.getsockname()
>>> ('local_address', 4551)

共有1个答案

杨腾
2023-03-14

路由器可能使用端口地址转换(或一对多NAT)。wiki链接进一步引用

PAT尝试保留原始源端口。如果该源端口已被使用,PAT将分配从适当端口组0-511、512-1023或1024-65535开始的第一个可用端口号。当没有更多的可用端口并且配置了多个外部IP地址时,PAT移动到下一个IP地址以尝试再次分配原始源端口。此过程将继续进行,直到耗尽可用端口和外部IP地址。

这应该是您在服务器上看到端口4551的原因。

 类似资料:
  • 问题内容: 我正在学习Java套接字编程。我使用以下语句连接到网站: 当我调试应用程序并查看s的内容时,我看到: 1)我想知道此本地端口7846的来源以及确切的含义。 2)如果网站的IP地址是2.21.246.97,为什么我不能仅在浏览器的地址栏中输入2.21.246.97来连接到该网站? 谢谢 问题答案: 这是本地套接字端口号。通常由系统分配。 请参阅什么是套接字?。 在客户端:客户端知道运行服

  • 我正试图用Netty开发以下用例: 客户端连接到上的中间服务器(端口 8900)。 客户端将具有配置的处理器请求发送到另一台计算机。 第 3 台计算机根据配置启动处理器。 处理器连接到根据配置中标识的端口(例如端口 8901)启动处理器的同一服务器。 服务器现在根据两者之间共享的匹配唯一哈希绑定客户端和处理器。 将为每个新的客户端连接创建新处理器。 客户端连接不是问题。我有一个处理这些请求的客户端

  • 然而,我遇到了一些问题。特别是带有内部异常的WebException(“无法连接到远程服务器”): 无法对套接字执行操作,因为系统缺少足够的缓冲区空间或队列已满127.0.0.1:52395 我正在尝试以每线程500次迭代的方式运行100个线程。 我可以使用更少的迭代和/或更少的线程来操作测试,因为看起来套接字最终会退出这个TIME_WAIT状态。但是,这不是一个解决方案,因为它没有充分测试web

  • 问题内容: 从堆栈溢出的其他帖子中应该可以正常工作 但由于某种原因,它只是挂在()上而从不打印。我知道对www.cnn.com的请求将对数据进行分块,但我至少应该从中读取一些信息,对吗? PS我知道这是不是做到这一点的最好办法,而且有像库和在那里,但我不能使用那些为这个项目(这是学校)。我必须使用图书馆 问题答案: 您忘记在请求行之后发送空白行: 此外,HTTP 1.1指定您应添加HTTP 1.1

  • 问题内容: 假设我想使用标准模块从套接字读取一行: 到底发生了什么?每次都会发出系统调用吗?我想无论如何我应该添加一些缓冲: 为了与硬件和网络实际情况达到最佳匹配, bufsize 的值应为2的相对较小的幂,例如4096。 http://docs.python.org/library/socket.html#socket.socket.recv 但是编写高效且线程安全的缓冲似乎并不容易。如果我使用

  • 当我运行此代码时,我得到[WinError 10057]。我不知道为什么当我浏览到时它会崩溃,因为我的朋友机器上也有相同的代码。。。 为什么我得到这个错误?一直在四处寻找,但没有真正找到答案。有什么建议吗?