Почему bind () и accept () позволяют указать размер структуры? - PullRequest
1 голос
/ 14 марта 2012

bind () и accept () позволяют вам указать размер структуры во втором параметре. Но я видел только размер всей передаваемой структуры. Почему они заставляют вас указать размер? Есть ли случаи, когда вы использовали бы другой номер?

Ответы [ 5 ]

3 голосов
/ 14 марта 2012

Различные семейства протоколов сокетов используют разные типы структур. Например, сокеты TCP и UDP, использующие адреса IPv4, используют структуру sockaddr_in, размер которой составляет 16 байтов, тогда как адреса IPv6 используют структуру sockaddr_in6, что составляет 28 байтов.

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

Размер указан, потому что это системные вызовы, которые выполняются в режиме ядра и в адресном пространстве ядра, а ядро ​​не знает, сколько данных копировать между адресным пространством ядра и пользовательским адресным пространством.Например, он не видит, используете ли вы структуру адресов IPv4 или IPv6.

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

Размер структуры sockaddr может варьироваться, например, в зависимости от того, используете ли вы IPv4 или IPv6.

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

Это связано с историческими причинами: перегрузка функции бедного человека для приема различных типов адресов сокетов, таких как IPv4, UNIX, IPv6.См. стр. 68 из Сетевое программирование UNIX: Сетевой API сокетов для получения дополнительной информации.

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

Размер может зависеть от реализации, типа сокета и / или платформы. Поэтому, если вы передадите этот размер при вызове, один и тот же код будет работать на разных платформах, независимо от того, какие дополнительные поля или отступы используются.

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