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