Почему `struct sockaddr` содержит поле семейства адресов? - PullRequest
5 голосов
/ 10 марта 2011

Почему struct sockaddr содержит поле семейства адресов? Не определено ли семейство адресов при вызове на socket()?

Ответы [ 4 ]

4 голосов
/ 10 марта 2011

sockaddr используется в большем количестве мест, чем просто connect и bind, в том числе в тех местах, где вы не обладаете какими-либо внешними знаниями о соответствующей семье адресов - getaddrinfo является одним.

Кроме того, хотя я не верю, что следующее приравнивает к практике где-либо, я вижу, что это было в глазах тех, кто изначально разрабатывал этот материал: вызов socket() определяет семейство протоколов.sockaddr содержит семейство адресов.На практике я считаю, что они всегда одинаковы, но теоретически у вас может быть протокол, способный поддерживать два разных типа адресов.

РЕДАКТИРОВАТЬ: есть другой способ, которым этот параметр полезен.Если вы используете сокеты дейтаграмм (UDP) и у вас есть сокет в «подключенном» состоянии с адресом назначения по умолчанию, вы можете очистить этот адрес , вызвав connect() с sockaddr сsa_family установлен на AF_UNSPEC.

2 голосов
/ 10 марта 2011

Если вы посмотрите на интерфейс getaddrinfo, который является единственным современным правильным способом преобразования между представлениями обмена адресов (имен или числовых адресов) и структурами sockaddr, я думаю, вы поймете, зачем это нужно.

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

Другим хорошим примером того, почему необходимо поле sa_family, являются интерфейсы getsockname и getpeername. Если программа унаследовала файловый дескриптор от другой программы и еще не знает, какой это тип сокета, она должна быть в состоянии определить это, чтобы установить новые соединения или даже преобразовать адрес в представление, подходящее для обмена.

1 голос
/ 10 марта 2011

Если вы посмотрите на код сети для 4.2BSD , откуда возник интерфейс сокетов, вы увидите, что sockaddr передается драйверам сетевого интерфейса, а сокет fd - нет.

0 голосов
/ 10 марта 2011

Поле sa_family используется, чтобы указать, какой тип адреса будет в поле sa_data. Во многих приложениях семейство адресов считается IPV4. Однако многие приложения также поддерживают IPV6.

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