如何同时处理 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_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)
我是套接字编程的新手,我的用例是处理客户端对 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_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)