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

How to handle both ipv4 and ipv6 client request

我是套接字编程的新手,我的用例是处理客户端对 ipv4 和 ipv6 的请求。现在 ipv4 工作正常但无法使用 ipv6 Ip.

// 运行 服务器 Python server.py -i '' -p 2010

注意:''表示我想在两个地址都收听客户端。
server.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))

client.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 客户端连接,前提是这两种协议都安装在OS 中。基本上,您创建一个 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)