我想在两个不同的终端之间建立一个插座连接。当它们都在同一台计算机上,或者在同一网络(在我的家庭路由器后面)的不同计算机上时,它工作正常
下面是我使用的代码的一个简单示例。在客户端,我输入通过在服务器上运行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来说应该是一个不成问题的想法对吗?如果有区别的话,我的互联网提供商会说我的connection is IPv6 and that I do not have a proper IPv4 public address。考虑到我希望它是可移植的,并且最终是分布式的,我宁愿避免它依赖于用户无法访问的特定设置
非常感谢任何关于网络noob的建议
目前没有回答
相关问题 更多 >
编程相关推荐