Ve skutečnosti jsou AF_ a PF_ totéž. Některá slova na Wikipedii odstraní váš zmatek
Původní koncepce designu rozhraní soketu rozlišovala mezi typy protokolů (rodinami) a specifickými typy adres, které může každý používat. Předpokládalo se, že rodina protokolů může mít několik typů adres. Typy adres byly definovány pomocí dalších symbolických konstant s použitím předpony AF_ namísto PF_. Identifikátory AF_ jsou určeny pro všechny datové struktury, které se specificky zabývají typem adresy a nikoli rodinou protokolů. Tento koncept oddělení protokolu a typu adresy však nenašel podporu implementace a AF_-konstanty byly jednoduše definovány odpovídajícím identifikátorem protokolu, což činí rozdíl mezi konstantami AF_ a PF_ technickým argumentem bez významných praktických důsledků. Ve správném použití obou forem skutečně existuje mnoho zmatků.
Ve zdrojovém kódu linuxového jádra jsem našel, že PF_INET a AF_INET jsou stejné. Následující kód je ze souboru include/linux/socket.h , řádek 204 stromu linuxového jádra 3.2.21.
/* Protocol families, same as address families. */
...
#define PF_INET AF_INET
Beejův slavný průvodce síťovým programováním poskytuje pěkné vysvětlení:
V nějaké dokumentaci uvidíte zmínku o mystickém "PF_INET". Jde o podivné éterické zvíře, které se v přírodě vyskytuje jen zřídka, ale i zde bych to mohl trochu objasnit. Kdysi dávno se myslelo, že rodina adres (co znamená "AF" v "AF_INET") by mohla podporovat několik protokolů, na které odkazovala jejich rodina protokolů (co znamená "PF" v "PF_INET").
To se nestalo. Ach, dobře. Správná věc, kterou musíte udělat, je použít AF_INET ve vašemstruct sockaddr_in a PF_INET ve vašem volání do socket(). Ale prakticky řečeno, AF_INET můžete použít všude. A protože to W. Richard Stevens ve své knize dělá, tak to udělám.
- AF =Rodina adres
- PF =rodina protokolů
Znamená AF_INET
odkazuje na adresy z internetu, konkrétně IP adresy. PF_INET
odkazuje na cokoli v protokolu, obvykle na zásuvky/porty.
Zvažte přečtení manuálových stránek pro socket(2) a bind(2). Pro sin_addr
pole, stačí pro jeho nastavení provést něco jako následující:
struct sockaddr_in addr;
inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr);