В чем разница между AF_INET и PF_INET в программировании сокетов? - PullRequest
194 голосов
/ 18 июля 2011

В чем разница между AF_INET и PF_INET в программировании сокетов?

Я запутался между использованием AF_INET и PF_INET в socket() и bind().

Также как указать ip-адрес в поле sin_addr?

Ответы [ 7 ]

232 голосов
/ 18 июля 2011

Известное руководство Beej по сетевому программированию дает хорошее объяснение:

В некоторых документах вы увидите упоминание о мистическом "PF_INET". Это странное эфирное чудовище, которое редко встречается в природе, но я С таким же успехом можно прояснить это немного здесь. Когда-то давно это было подумал, что может быть адресная семья (что означает "AF" в "AF_INET" для) может поддерживать несколько протоколов, на которые ссылались их семейство протоколов (что означает «PF» в «PF_INET»).
Этого не случилось. Ну что ж. Так что правильно сделать, это использовать AF_INET в вашем struct sockaddr_in и PF_INET в вашем вызове socket (). Но практически говоря, вы можете использовать AF_INET везде. И с тех пор это то, что В. Ричард Стивенс делает в своей книге, это то, что я сделаю здесь.

65 голосов
/ 11 августа 2012

Я обнаружил в исходном коде ядра Linux, что PF_INET и AF_INET одинаковы. Следующий код взят из файла include / linux / socket.h , строка 204 дерева ядра Linux 3.2.21.

/* Protocol families, same as address families. */
...
#define PF_INET     AF_INET
47 голосов
/ 18 июля 2011
  • AF = Адрес семьи
  • PF = Семейство протоколов

Значение, AF_INET относится к адресам из Интернета, в частности к IP-адресам. PF_INET относится к чему-либо в протоколе, обычно к сокетам / портам.

Попробуйте прочитать справочные страницы для socket (2) и bind (2) . Для поля sin_addr просто сделайте что-то вроде следующего, чтобы установить его:

struct sockaddr_in addr;
inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr); 
11 голосов
/ 22 февраля 2013

На самом деле AF_ и PF_ - это одно и то же. Есть несколько слов в Википедии, чтобы очистить вашу путаницу

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

4 голосов
/ 22 июня 2015

AF_INET = формат адреса, Интернет = IP-адреса

PF_INET = формат пакета, Интернет = IP, TCP / IP или UDP / IP

AF_INET - это семейство адресов, которое используется для создаваемого сокета (в данном случае это адрес интернет-протокола). Например, ядро ​​Linux поддерживает 29 других семейств адресов, таких как сокеты UNIX и IPX, а также связь с IRDA и Bluetooth (AF_IRDA и AF_BLUETOOTH, но вряд ли вы будете использовать их на таком низком уровне).

В большинстве случаев использование AF_INET для программирования сокетов по сети является наиболее безопасным вариантом.

Значение AF_INET относится к адресам из Интернета, в частности к IP-адресам.

PF_INET относится к чему-либо в протоколе, обычно к сокетам / портам.

2 голосов
/ 16 мая 2019

Проверка файла заголовка решает проблему.Можно проверить там системный компилятор.

Для моей системы AF_INET == PF_INET

AF == Семейство адресов и PF == Семейство протоколов

Семейства протоколов, такие же какадрес семьи.

enter image description here

2 голосов
/ 14 октября 2014

Бывают ситуации, когда это важно.

Если вы передадите AF_INET в socket() в Cygwin, ваш сокет может или не может быть произвольно сброшен. Передача PF_INET гарантирует, что соединение работает правильно.

Cygwin, по общему признанию, - огромный беспорядок для программирования сокетов, но - это реальный случай, когда AF_INET и PF_INET не идентичны.

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