Когда 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 является правильным.