问题描述
我正在尝试在两个不同终端之间建立套接字连接。如果它们都在同一台计算机上,或者在同一网络上的不同计算机上(在我的家用路由器后面),它就可以正常工作。
这是我使用的代码的最小示例。在客户端,我输入在服务器上运行 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)
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)
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 来说应该不是问题?如果它有所作为,我的互联网提供商会说我的 connection is IPv6 and that I do not have a proper IPv4 public address.考虑到我希望它是可移植的,并且最终是分布式的,我宁愿避免它依赖于用户无法访问的特定设置。
最感谢网络新手的任何指示
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)