Рассматривая примеры программирования сокетов, мы видим, что некоторые люди используют 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_
констант следует одному из руководящих принципов: «Должен быть один - и предпочтительно только один - очевидный способ сделать это». (Дзен Питона)
Другая информация
Это сообщение на форуме содержит ссылку на это старое сообщение , которое содержит некоторую историческую информацию.