【问题标题】:How to handle both ipv4 and ipv6 client request如何处理 ipv4 和 ipv6 客户端请求
【发布时间】:2020-12-21 08:30:33
【问题描述】:

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

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()

【问题讨论】:

    标签: python sockets network-programming serversocket


    【解决方案1】:

    您的代码正在尝试将 IPv6 客户端连接到 IPv4 服务器。这是行不通的。您将需要一个 IPv6 服务器。

    某些平台支持双栈套接字,它可以接受 IPv4 和 IPv6 客户端连接,前提是操作系统中安装了这两种协议。基本上,您创建一个AF_INET6 套接字,禁用其上的IPV6_V6ONLY 套接字选项,然后将bind() 它添加到IPv6 的in6addr_any 通配符(”::”) 以进行侦听。任何接受的 IPv4 客户端都将报告 IPv4-mapped IPv6 address 作为其远程 IP 地址。

    在不支持双栈套接字的平台上,您别无选择,只能创建单独的 AF_INETAF_INET6 套接字进行监听。

    【讨论】:

    • 是的,我的系统同时支持 ipv6 和 ipv4。
    • @DeepakMourya 仅仅因为系统支持这两种协议并不能保证它也支持双栈套接字。您需要查看运行服务器代码的平台的文档。
    • 您好,支持,请从内部团队确认。
    【解决方案2】:

    我已经尝试过这个并为我工作,为其他人发帖。

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-13
      • 1970-01-01
      • 2011-11-09
      • 2020-08-27
      • 1970-01-01
      • 2016-06-10
      • 1970-01-01
      • 2016-08-09
      相关资源
      最近更新 更多