python - 从外部本地网络连接到套接字
问题描述
我正在尝试在两个不同的终端之间建立套接字连接。当它们都在同一台计算机上或同一网络上的不同计算机上(在我的家庭路由器后面)时,它工作正常。
这是我使用的代码的最小示例。在客户端,我输入在ipconfig
服务器上运行时获得的 IP 地址,它同时IPv4 Address
适用Temporary IPv6 Address
于
服务器
import socket
ip_address = ""
ipv6 = False # True
PORT = 12345
STREAM = socket.SOCK_STREAM
if ipv6:
FAMILY = socket.AF_INET6
bind_args = (ip_address, PORT, 0, 0)
else:
FAMILY = socket.AF_INET
bind_args = (ip_address, PORT)
server_socket = socket.socket(FAMILY, STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind(bind_args)
server_socket.listen()
unsecured_sock, client_address = server_socket.accept()
print("accepted from", client_address)
客户
import socket
ip_address = "Entered from ipconfig or whatsmyip.com run from server"
ipv6 = False # True
PORT = 12345
STREAM = socket.SOCK_STREAM
if ipv6:
FAMILY = socket.AF_INET6
bind_args = (ip_address, PORT, 0, 0)
else:
FAMILY = socket.AF_INET
bind_args = (ip_address, PORT)
sock = socket.socket(FAMILY, STREAM)
sock.connect(bind_args)
print("Connected!")
当我将其中一台计算机从家庭网络中取出时,就会出现问题。由于我没有两个可以同时访问的标准网络,因此我通过手机上的 4G 或 VPN 将其中一台计算机连接到互联网来对此进行测试。在任何一种情况下,我都会使用whatsmyip.com
从服务器运行的 IP。我已经尝试了 IPv4 与 IPv6 的所有组合,以及服务器或客户端是否在我的家庭路由器后面。在所有情况下它都会失败(请注意,当服务器通过我的手机上的 4G 访问互联网时,我没有获得 IPv6 地址)。事实上,我什ping
至无法tracert
从客户端获取服务器的 IP 地址。
我怀疑我在做一些非常基本的错误,但我不知道是什么。我怀疑它与端口转发有关,所以我尝试了以下 UPnP 脚本
import upnpy
upnp = upnpy.UPnP()
devices = upnp.discover()
device = upnp.get_igd()
service = device.WANIPConn1
service.AddPortMapping(
NewRemoteHost='',
NewExternalPort=12345,
NewProtocol='TCP',
NewInternalPort=12345,
NewInternalClient='192.168.0.136', # Local server IP
NewEnabled=1,
NewPortMappingDescription='Test port mapping entry from UPnPy.',
NewLeaseDuration=600)
print("added new port mapping")
它运行正确但没有区别。我是否认为这对 IPv6 来说应该不是问题?如果有什么不同,我的互联网提供商会说我的连接是 IPv6 并且我没有正确的 IPv4 公共地址。考虑到我希望它是可移植的并最终分发,我宁愿避免它依赖于用户无法访问的特定设置。
任何网络菜鸟的指针都非常感谢
解决方案
推荐阅读
- mysql - 第二个查询在 MYSQL 触发器中不起作用
- php - 如何使用 php 将数组项映射到内部数组?
- expression - 如何识别 ANTLR 中的额外输入错误?
- php - Route::get 的选项和功能在 laravel 中无法正常工作
- sql - 如何将列名完全相同的两个表与具有唯一列名的第三个表连接起来以创建新视图?
- python-3.x - 从结果 date = datetime.strftime(datetime.utcnow(), "%Y-%m-%d") 获取前一天和第二天
- c# - 如何使用 c# 获取 Azure 中的虚拟机列表?
- mysql - 错误代码:1064 语法错误,意外 $end,需要 FTS_TERM 或 FTS_NUMB 或 '*' MYSQL
- python - Matploblib:创建多个图形面板,每个面板中都有大量子图
- ionic-framework - 我正在尝试将复选框的默认值设置为 false,默认情况下不应选中任何复选框,用户需要选择