Ошибка от вызова socket () - PullRequest
       29

Ошибка от вызова socket ()

2 голосов
/ 08 марта 2012

Я хотел добавить поддержку IPv6 для моей программы и натолкнулся на странную ошибку.Я хочу открыть сокет, который принимает соединения.Вот мой сценарий:

Сначала я использую getaddrinfo (), чтобы найти конфигурацию сокета:

struct addrinfo hint, *info = NULL;

memset((void *)&hint, 0, sizeof(hint));
hint.ai_family = AF_INET6;
hint.ai_flags = AI_PASSIVE | AI_NUMERICSERV;
hint.ai_socktype = SOCK_STREAM;

if ((error = getaddrinfo(NULL, "1234", &hint, &info))) {
    /* some error handling */
}

Я получаю ненулевой результат в info.Затем я хочу создать сокет:

socket(info->ai_family, info->ai_socktype, info->ai_protocol)

Здесь я получаю -1

strerror(errno)

возвращает Address family not supported by protocol

Я думал, что getaddrinfo() возвращает только адресаэто может быть связано, и я ожидал бы, что это возвратит NULL в этом случае.Чего мне не хватает?

Хочу добавить, что у моего eth0 сейчас нет IPv6-адреса.Я использую uClibc 0.9.32

Ответы [ 2 ]

1 голос
/ 08 марта 2012

Вам нужно добавить AI_ADDRCONFIG в ai_flags, чтобы убедиться, что он не возвращает семейства адресов, не поддерживаемые ядром.Сейчас я почти всегда добавляю этот флаг.

Если вы хотите поддерживать ядра без IPv6, вам следует избегать установки ai_family в AF_INET6.Вместо этого вы должны прослушивать все возвращенные адреса и обязательно установить IPV6_V6ONLY на AF_INET6.К сожалению, нет гарантии, что адрес AF_INET6 будет возвращен первым.

0 голосов
/ 08 марта 2012

getaddrinfo возвращает связанный список struct addrinfo объектов, которые вы можете просматривать, используя элемент ai_next.Вы должны попробовать каждый возвращенный объект addrinfo по очереди, пока не получите соединение (или не нажмете NULL / конец списка).

...