A maneira mais confiável de encontrar o endereço IP que seu host usará para se comunicar é usando getsockname
em um soquete UDP conectado. No caso do UDP, a chamada do sistema connect
não envolve nenhuma comunicação de rede.
Aqui está uma função do Python que escrevi no passado para um propósito semelhante. Se você não sabe de antemão com qual endereço IP remoto irá se comunicar, você deve procurar por um que esteja usando a rota padrão. Se você já sabe com qual endereço IP remoto irá se comunicar, então é melhor usar esse endereço IP na chamada de conexão.
def my_ip():
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
try:
s.connect(('192.0.0.8', 1027))
except socket.error:
return None
return s.getsockname()[0]
Com algumas pequenas alterações, essa função pode ser adaptada para retornar um endereço IPv6 em vez de IPv4:
def my_ipv6():
s = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
try:
s.connect(('2001:db8::', 1027))
except socket.error:
return None
return s.getsockname()[0]