问题描述
我是套接字编程的新手,我的用例是处理 ipv4 和 ipv6 的客户端请求。现在 ipv4 工作正常,但无法使用 ipv6 ip。
// 运行服务器 Python server.py -i '' -p 2010
注意:''表示我想在两个地址监听客户端。
服务器.py
tcpserver = socket.socket(socket.AF_INET,socket.soCK_STREAM)
tcpserver.bind((self.TCP_IP,self.TCP_Port))
tcpserver.listen(4)
while True:
print "Multithreaded Python server : Waiting for connections from TCP clients..."
(conn,(ip,port)) = tcpserver.accept()
print("Client connected: {}:{}".format(ip,port))
客户端.py
host = "::1"
port = 2010
s = socket.socket(socket.AF_INET6,socket.soCK_STREAM,0)
s.connect((host,port))
print "Non Secure ipv6 authentication"
while True:
s.send("Hello,world!\n")
s.close()
解决方法
您的代码正在尝试将 IPv6 客户端连接到 IPv4 服务器。这是行不通的。您将需要一台 IPv6 服务器。
某些平台支持双栈套接字,它可以接受 IPv4 和 IPv6 客户端连接,前提是操作系统中安装了这两种协议。基本上,您创建一个 AF_INET6
套接字,禁用其上的 IPV6_V6ONLY
套接字选项,并将其 bind()
到 IPv6 in6addr_any
通配符 (”::”
) 以进行侦听。任何被接受的 IPv4 客户端都会报告一个 IPv4-mapped IPv6 address 作为其远程 IP 地址。
在不支持双栈套接字的平台上,您别无选择,只能创建单独的 AF_INET
和 AF_INET6
套接字用于侦听。
我已经尝试过这个并为我工作,为其他人发帖。
bindsocket = socket.socket(socket.AF_INET6,socket.SOCK_STREAM)
bindsocket.setsockopt(socket.IPPROTO_IPV6,socket.IPV6_V6ONLY,0)
addr = [addr for addr in socket.getaddrinfo(self.TCP_IP,self.TCP_Port,socket.AF_INET6,socket.IPPROTO_TCP)]
try:
bindsocket.bind((addr[0][-1]))
except socket.error as e:
print str(e)
bindsocket.listen(5)