В чем разница между AF_INET и PF_INET в программировании сокетов?
В чем разница между AF_INET и PF_INET в программировании сокетов?
Я путаюсь между использованием AF_INET и PF_INET в socket()
и bind()
.
Также, как указать ip-адрес в поле sin_addr
?
Ответы
Ответ 1
Beej известное руководство по сетевому программированию дает хорошее объяснение:
В какой-то документации вы увидите упоминание о мистическом "PF_INET". Это странное эфирное чудовище, которое редко встречается в природе, но я С таким же успехом можно прояснить это немного здесь. Когда-то давно это было подумал, что может быть адресная семья (что означает "AF" в "AF_INET" для) может поддерживать несколько протоколов, на которые ссылались их семейство протоколов (что означает "PF" в "PF_INET").
Этого не случилось. Ну что ж. Так что правильно сделать, это использовать AF_INET в вашем struct sockaddr_in и PF_INET в вашем вызове socket(). Но практически говоря, вы можете использовать AF_INET везде. И с тех пор то, что В. Ричард Стивенс делает в своей книге, то, что я сделаю Вот.
Ответ 2
Я нашел в исходном коде ядра Linux, что PF_INET и AF_INET одинаковы.
Следующий код из файла include/linux/socket.h, строка 204 ядра ядра 3.2.21 Linux.
/* Protocol families, same as address families. */
...
#define PF_INET AF_INET
Ответ 3
- 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);
Ответ 4
Фактически, AF_ и PF_ - одно и то же. Есть несколько слов о Википедии, которые очистят ваше замешательство.
Оригинальная концепция дизайна интерфейса сокета, выделяемая между типами протоколов (семействами) и конкретными типами адресов, которые могут использовать каждый. Предполагалось, что семейство протоколов может иметь несколько типов адресов. Типы адресов определялись дополнительными символическими константами, используя префикс AF_ вместо PF_. Идентификаторы AF_ предназначены для всех структур данных, которые специфически относятся к типу адреса, а не к семейству протоколов. Однако эта концепция разделения типа протокола и адреса не нашла поддержки реализации, а AF_-константы были просто определены соответствующим идентификатором протокола, что делает различие между AF_ и PF_ константами техническим аргументом, не имеющим значительных практических последствий. Действительно, существует большая путаница в правильном использовании обеих форм.
Ответ 5
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 ссылается на что-либо в протоколе, обычно на сокеты/порты.
Ответ 6
Бывают ситуации, когда это имеет значение.
Если вы передадите AF_INET на socket()
в Cygwin, ваш сокет может быть или не быть случайным reset. Передача PF_INET гарантирует правильное соединение.
Cygwin само по себе является огромным беспорядком для программирования сокетов, но это реальный случай, когда AF_INET и PF_INET не идентичны.
Ответ 7
Проверка заголовочного файла решит проблему. Можно проверить там системный компилятор.
Для моей системы AF_INET == PF_INET
AF == Адрес семьи и PF == Протокол семьи
Протокол семейства, такой же, как адрес семьи.
![enter image description here]()