2015-02-24 2 views
-1

Использование сокетов BSD стиль, я называю:Зачем принимать аргумент адреса всех нулей?

accept(listenfd, &address, &len); 

До сегодняшнего дня это работало нормально.

Начиная с сегодняшнего дня, я вижу структуру адресов всех нулей.

Другими словами, ядро ​​не знает, что такое IP-адрес клиента, или, по крайней мере, он отказывается сообщить мне этот адрес в этом контексте. Это происходит как на Linux, так и на OS-X.

Излишне говорить, что я не вижу никакой документации, относящейся к этой проблеме, на страницах, которые я рассматривал на страницах согласия. И мои поиски для обсуждения по этой теме не нашли меня.

Я могу найти много (в основном противоречивые) советы о том, что я должен делать вместо этого. И, возможно, я возьму часть этого совета (getsockname() выглядит многообещающим ...). Но мне нужно понять, что здесь происходит.

Итак ... почему это происходит? Что изменилось бы, чтобы сделать работу accept() документированной на странице руководства?

+0

Является ли 'listenfd' IPv4 или IPv6-сокет? Что означает 'адрес'? Вы инициализируете 'len'? Вам нужно показать свой фактический код. –

+0

IPv4. адресом является struct sockaddr_storage, и указатель на него передается (struct sockaddr *) перед передачей для принятия. Я не инициализировал len - это может быть моей проблемой. – rdm

+0

Да, спасибо, что это было - и теперь я вижу, что я пропустил соответствующее предложение на странице руководства. Эта проблема в коде теперь исправлена. (Я могу указать на код на github, хотя, если вы действительно хотите его увидеть ...) – rdm

ответ

0

Реми указал на ответ, имеющий отношение к этому делу.

При вызове accept() третий аргумент accept() должен быть инициализирован размером байта буфера, передаваемого во втором параметре.

Смежные вопросы