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



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



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



кроме того, как дать IP-адрес в sin_addr поле?

797   6  

6 ответов:

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

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

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

/* Protocol families, same as address families. */
...
#define PF_INET     AF_INET
  • AF = адрес семьи
  • PF = семейство протоколов

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

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

struct sockaddr_in addr;
inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr); 

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

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

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 ссылается на что-либо в протоколе, обычно сокеты/порты.

есть ситуации, когда это имеет значение.

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

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

Comments

    Ничего не найдено.