当前位置: 首页 > 知识库问答 >
问题:

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

欧阳向文
2023-03-14

注意:“”表示我要在两个地址上侦听客户端。
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()

共有1个答案

宿镜
2023-03-14

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

有些平台支持双堆栈套接字,可以同时接受IPv4和IPv6客户端连接,前提是操作系统中安装了这两种协议。基本上,您可以创建一个af_inet6套接字,在其上禁用ipv6_v6only套接字选项,并将其bind()绑定到IPv6in6addr_any通配符(“::”)以进行侦听。任何被接受的IPv4客户端都将报告IPv4映射的IPv6地址作为其远程IP地址。

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

 类似资料:
  • 问题内容: 我们的Java程序之一在启动时仅监听IPv6(8080) 例如 问题是无法从外部访问(本地主机除外),要解决此问题,我需要手动添加 但这使得该程序仅适用于IPv4网络。 是否可以执行上述类似 sshd的 操作,并且都支持IPv4和IPv6? 问题答案: 我怀疑这不是Java编程问题,而是OS网络堆栈/ OS网络配置问题: http://coding.derkeiler.com/Arch

  • 我们的一个Java程序启动时,它只监听IPv6(8080) 例如。 问题是它不能从外部访问(除了localhost之外),为了解决这个问题,我手动添加了这个 是否可以像上面的sshd一样,同时支持IPv4和IPv6?

  • 同样,如果客户机已经创建了一个IPv6套接字(因为getaddrinfo()说它是有效的),然后调用getaddrinfo()来查找服务器的地址,那么如果它只得到一个IPv4结果呢?我知道我可以告诉getaddrinfo()只给出IPv6结果,但是如果服务器没有IPv6地址怎么办?UDP客户端是否应该关闭并重新创建其套接字以匹配服务器地址格式?还是保证我能得到我要求的地址格式? (我欢迎任何能回答

  • 问题内容: 关于Restlet客户端如何处理媒体类型标头,我有几个新手问题: 如果我传入类型a)POJO或b)InputStream实例的实体,Restlet客户端将在“ content-type”标头中放入什么?那么“ accept”头是什么? 如果我想在HTTP正文中以JSON格式传输POJO,我是否需要序列化POJO并将其作为JSON字符串传递,还是可以仅传递POJO而Restlet会完成其

  • 我的connect调用的结果始终是10061:连接被拒绝。 如果我将服务器代码更改为绑定到::(或者将空主机传递给getaddrinfo()(同样的事情)),并将客户机代码更改为在getaddrinfo()调用中指定空主机,那么V4客户机可以很好地连接。 谁能解释一下为什么?我没有读到任何东西,如果我们想要双套接字行为,我们必须指定一个空主机(因此使用INADDR_ANY)。这不可能是一个要求,因