функция accept (), возвращающая -1 в случае IPv6 - PullRequest
1 голос
/ 09 июня 2011

В моей программе я пытаюсь реализовать поддержку работы с двумя стеками (как сокетов IPv4, так и сокетов IPv6).

В случае IPv4 все работает нормально.Но в случае IPv6 accept() возвращает значение -1 (ошибка).

Кто-нибудь может подсказать возможные причины и как это исправить?

1 Ответ

1 голос
/ 11 июня 2011

Когда accept() возвращает -1, errno будет установлено, чтобы указать, какая именно ошибка произошла. Пожалуйста, позвоните perror("accept"), чтобы узнать, в чем заключалась ошибка, и обновите свой вопрос с результатами.

Также обратите внимание, что accept() должен вызываться в сокете, который был:

  • Создано с помощью вызова socket(). (вы должны передать PF_INET6 в качестве первого аргумента вашего сокета, чтобы создать сокет семейства протоколов IPv6)
  • Связать, используя bind(), используя параметр struct sockaddr_in6 в качестве 2-го параметра (его sin6_family установлен на AF_INET6 для IPv6, чтобы указать, что вы будете привязаны к адресу IPv6). Не забудьте сначала обнулить поле sin6_zero. Одной из стратегий было бы обнуление всей структуры sockaddr, которая установила бы для адреса IPv6 значение IN6ADDR_ANY, что означает, что вам просто нужно установить порт и семейство адресов.
  • Прослушивание посредством вызова listen()

Если у вас все еще проблемы, опубликуйте код, который у вас есть.

Если бы мне пришлось угадывать (поскольку вы не опубликовали никакого кода), я думаю, что он работает с IPv4 и достигает точки, где он может accept() установить соединение, но соединение IPv6 accept() вызывает возврат -1, Я думаю, вероятно, что вы не передаете accept() достаточно большой struct sockaddr, чтобы это сработало.

Например, следующий код:

printf("sizeof(struct sockaddr_in) = %ld\n", sizeof(struct sockaddr_in));
printf("sizeof(struct sockaddr_in6) = %ld\n", sizeof(struct sockaddr_in6));

Печать (в моей системе):

sizeof(struct sockaddr_in) = 16
sizeof(struct sockaddr_in6) = 28

Если вы предоставляете accept() достаточно места только для записи адреса IPv4, произойдет сбой, когда он примет соединение IPv6. Убедитесь, что вы выделяете struct sockaddr_in6 или struct sockaddr storage и убедитесь, что аргумент size является правильным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...