Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 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