Размер адреса длина функции приема в - PullRequest
6 голосов
/ 22 марта 2012

в "sys / socket.h" определяет функцию:

int accept (int socket, struct sockaddr *address, socklen_t *address_len);

Мой вопрос касается socklen_t * address_len , основанного на руководстве указывает на socklen_t , который на входе указывает длину предоставленной структуры sockaddr , а на выходе - длину сохраненного адреса.

При каких условияхвходные данные address_len отличаются от выходных данных?

Мне это нужно, чтобы я мог эмулировать тестовый пример для оболочки, которую я создал для структуры sockaddr_in .

Большое спасибо!

1 Ответ

4 голосов
/ 22 марта 2012

Никогда не может быть больше (длина ввода - это границы для предотвращения переполнения), но может быть меньше для определенных типов сокетов, например, для сокетов доменов unix, адреса которых по сути являются путевыми именами.Для сокетов IP (v4 или v6) это всегда будет номинальный размер соответствующей структуры sockaddr_in или sockaddr_in6.

Также обратите внимание, что можно использовать некоторые интерфейсы, подобные этому , не знаякакой тип семейства адресов / протоколов задействован .Например, у вас может быть функция как часть кода вашей библиотеки, которая принимает сокет неизвестного типа и принимает вызовы со структурой sockaddr_storage.Он может найти IPv4-адрес и IPv6-адрес или что-то еще полностью, в зависимости от того, что сделал вызывающий.

Это использование довольно нетипично для accept, но гораздо более вероятно для getpeername который использует тот же стиль интерфейса.Фактически именно так должны работать все демоны, которые запускаются с inetd и хотят знать удаленный адрес.

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