GNU/Linux >> Znalost Linux >  >> Linux

Jaký je rozdíl mezi AF_INET a PF_INET v programování socketů?

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); 

Linux
  1. Jaký je rozdíl mezi insmod a modprobe

  2. Jaký je rozdíl mezi strtok_r a strtok_s v C?

  3. Jaký je rozdíl mezi fsck a e2fsck?

  1. Jaký je rozdíl mezi adduser a useradd?

  2. Jaký je rozdíl mezi ls a l?

  3. Jaký je rozdíl mezi `su -` a `su --login`?

  1. Rozdíl mezi [[ $a ==Z* ]] a [ $a ==Z* ]?

  2. Jaký je rozdíl mezi Git Switch a Checkout?

  3. Jaký je rozdíl mezi Redhat a centOS?