将IPv6地址绑定到Python套接字作为源IP地址

jac*_*ack 8 python sockets ip ipv6

我以前使用下面的代码将IPv4地址绑定到Python套接字作为源IP地址.

import socket
true_socket = socket.socket
def bound_socket(*a, **k):
    sock = true_socket(*a, **k)
    sock.bind((sourceIP, 0))
    return sock
socket.socket = bound_socket
Run Code Online (Sandbox Code Playgroud)

上面的代码是否适用于IPv6地址?如果没有,我如何绑定IPv6地址?

提前致谢!

Sam*_*lar 6

你可以尝试这个,获得一个IPV6地址,建议你使用socket.getaddrinfo它将返回所有不同的地址IPV4和IPV6,你可以绑定它们或只是你想要/需要的地方.

import socket
def bound_socket(*a, **k):
    sock = socket.socket(*a, **k)
    if socket.AF_INET6 in a:
        if not socket.has_ipv6:
            raise ValueError("There's no support for IPV6!")
        else:
            address = [addr for addr in socket.getaddrinfo(source_ip, None)
                        if socket.AF_INET6 == addr[0]] # You ussually want the first one.
            if not address:
                raise ValueError("Couldn't find ipv6 address for source %s" % source_ip)
            sock.bind(address[0][-1])
    else:
        sock.bind((source_ip, 0))
    return sock
Run Code Online (Sandbox Code Playgroud)