В чем разница между константами AF_INET и PF_INET? - PullRequest
30 голосов
/ 31 марта 2010

Рассматривая примеры программирования сокетов, мы видим, что некоторые люди используют AF_INET, а другие - PF_INET. Кроме того, иногда оба они используются в одном и том же примере . Вопрос в том, есть ли разница между ними? Какой из них мы должны использовать?

Если вы можете ответить на этот вопрос, другой вопрос будет ... Почему существуют эти две одинаковые (но равные) константы?


То, что я обнаружил до сих пор:

Страница socket

В программировании сокетов (Unix) у нас есть функция socket(), которая получает следующие параметры:

int socket(int domain, int type, int protocol);

Справочная страница гласит:

Аргумент domain указывает домен связи; это выбирает семейство протоколов, которое будет использоваться для связи. Эти семьи определены в .

И на странице руководства приведены AF_INET, а также некоторые другие AF_ константы для параметра domain. Кроме того, в разделе NOTES той же страницы руководства мы можем прочитать:

Константы манифеста, используемые в BSD 4.x для семейств протоколов: PF_UNIX, PF_INET и т. Д., А AF_UNIX и т. Д. Используются для семейств адресов. Тем не менее, уже страница руководства BSD обещает: «Семейство протоколов как правило, совпадает с адресной семьей ", и последующие стандарты везде используйте AF_ *.

Заголовки C

sys/socket.h на самом деле не определяет эти константы, а вместо этого включает bits/socket.h. Этот файл определяет около 38 AF_ констант и 38 PF_ констант, таких как:

#define PF_INET     2   /* IP protocol family.  */
#define AF_INET     PF_INET

Python

Модуль сокетов Python очень похож на C API. Однако существует много AF_ констант, но только одна PF_ константа (PF_PACKET). Таким образом, в Python у нас нет выбора, кроме как использовать AF_INET.

Я думаю, что это решение о включении только AF_ констант следует одному из руководящих принципов: «Должен быть один - и предпочтительно только один - очевидный способ сделать это». (Дзен Питона)

Другая информация

Это сообщение на форуме содержит ссылку на это старое сообщение , которое содержит некоторую историческую информацию.

1 Ответ

23 голосов
/ 31 марта 2010

Я думаю, что заметки из Википедии на этом довольно хорошо подводят итог:

Исходная концепция дизайна интерфейса сокетов, различающаяся между типами протоколов (семействами) и конкретными типами адресов, которые каждый может использовать. Предполагалось, что семейство протоколов может иметь несколько типов адресов. Типы адресов были определены дополнительными символическими константами, используя префикс AF_ вместо PF_. AF_ -идентификаторы предназначены для всех структур данных, которые имеют дело именно с типом адреса, а не с семейством протоколов. Однако эта концепция разделения протокола и типа адреса не нашла поддержки реализации, и AF_ -константы были просто определены соответствующим идентификатором протокола, что делает различие между AF_ по сравнению с PF_ константами техническим аргументом, не имеющим существенного значения. практическое следствие. Действительно, существует много путаницы в правильном использовании обеих форм.

Даже если бы кто-то придумал причину для разницы сегодня, он должен был бы придумать новые идентификаторы, или так много всего сломалось бы ...

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