如何同时处理 ipv4 和 ipv6 客户端请求

问题描述

我是套接字编程的新手,我的用例是处理 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_INETAF_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)