Uso de getaddrinfo () com AI_PASSIVE

Ogetaddrinfo() função @ não apenas permite que os programas clientes encontrem com eficiência os dados corretos para a criação de um soquete para um determinado host, mas também permite que os servidores se vinculem ao soquete correto - em teori

Eu só aprendi sobre isso e começou a brincar com ele via Python:

from socket import *
for i in getaddrinfo(None, 22, AF_UNSPEC, SOCK_STREAM, IPPROTO_IP, AI_PASSIVE): i

rendimento

(2, 1, 6, '', ('0.0.0.0', 22))
(10, 1, 6, '', ('::', 22, 0, 0))

o que me faz pensar se há algo errado.

O que exatamente eu devo fazer com essas respostas? Eu dev

make alisten() soquete de todas essas respostas, ou devo basta escolher o primeiro que realmente funcion

O exemplo no manpage sugere que eu pegue apenas o primeiro e fique feliz com ele se estiver livre de erros, mas só recebo uma conexão via IPv4 no meu exemplo.

Mas se eu tentar todos eles, tenho que me preocupar com 2 soquetes de servidor, o que é desnecessário devido ao fato de que os soquetes de servidor IPv6 também escutam o IPv4 se determinadas condições forem atendidas (SO, sinalizadores de soquete etc.

Onde estou pensando errado?

EDIT: Obviamente, não estou pensando errado, mas meu PC faz a coisa errada. Eu uso o padrão/etc/gai.conf enviado com o OpenSUSE. Seria bom se alguém pudesse me apontar na direção cert

EDIT 2: neste caso,strace faz as seguintes chamadas feitas internamente depois de ler/etc/gai.conf (agora com a porta 54321, pois eu pensava que o uso da porta 22 poderia ter alguma influência ruim, o que não era o caso):

socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP) = 3
connect(3, {sa_family=AF_INET6, sin6_port=htons(54321), inet_pton(AF_INET6, "::", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28) = 0
getsockname(3, {sa_family=AF_INET6, sin6_port=htons(38289), inet_pton(AF_INET6, "::1", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, [28]) = 0
connect(3, {sa_family=AF_UNSPEC, sa_data="\0\0\0\0\0\0\0\0\0\0\0\0\0\0"}, 16) = 0
connect(3, {sa_family=AF_INET, sin_port=htons(54321), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
getsockname(3, {sa_family=AF_INET6, sin6_port=htons(60866), inet_pton(AF_INET6, "::ffff:127.0.0.1", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, [28]) = 0
close(3)                                = 0

Obviamente, a decisão deve ocorrer de acordo com os resultados dogetsockname() chama ...

BTW:https: //bugs.launchpad.net/ubuntu/+source/eglibc/+bug/67370 e os outros relatórios de erros mencionados lá confirmam minhas observações. Várias pessoas afirmam que o novo comportamento está correto, por isso estou obviamente preso a usarAF_INET6 ...: -

questionAnswers(2)

yourAnswerToTheQuestion