GNU/Linux >> Linux Esercitazione >  >> Linux

Qual è la differenza tra AF_INET e PF_INET nella programmazione socket?

Infatti, AF_ e PF_ sono la stessa cosa. Ci sono alcune parole su Wikipedia che chiariranno la tua confusione

Il concetto di progettazione originale dell'interfaccia socket distingueva tra tipi di protocollo (famiglie) e tipi di indirizzi specifici che ciascuno può utilizzare. Si prevedeva che una famiglia di protocolli potesse avere diversi tipi di indirizzo. I tipi di indirizzo sono stati definiti da costanti simboliche aggiuntive, utilizzando il prefisso AF_ invece di PF_. Gli identificatori AF_ sono destinati a tutte le strutture di dati che si occupano specificamente del tipo di indirizzo e non della famiglia di protocolli. Tuttavia, questo concetto di separazione del protocollo e del tipo di indirizzo non ha trovato supporto implementativo e le costanti AF_ sono state semplicemente definite dal corrispondente identificatore di protocollo, rendendo la distinzione tra costanti AF_ e costanti PF_ un argomento tecnico senza conseguenze pratiche significative. In effetti, esiste molta confusione nell'uso corretto di entrambe le forme.


Ho trovato nel codice sorgente del kernel Linux che PF_INET e AF_INET sono la stessa cosa. Il seguente codice è tratto dal file include/linux/socket.h , riga 204 dell'albero del kernel Linux 3.2.21.

/* Protocol families, same as address families. */
...
#define PF_INET     AF_INET

La famosa guida alla programmazione di rete di Beej fornisce una bella spiegazione:

In alcuni documenti, vedrai menzione di un mistico "PF_INET". Questa è una strana bestia eterea che si vede raramente in natura, ma potrei anche chiarirlo un po' qui. Una volta, molto tempo fa, si pensava che forse una famiglia di indirizzi (cosa significa "AF" in "AF_INET") potesse supportare diversi protocolli a cui faceva riferimento la loro famiglia di protocolli (cosa significa "PF" in "PF_INET").
Non è successo. Oh bene. Quindi la cosa corretta da fare è usare AF_INET nella tua struttura sockaddr_in e PF_INET nella tua chiamata a socket(). Ma in pratica, puoi usare AF_INET ovunque. E, poiché è quello che fa W. Richard Stevens nel suo libro, è quello che farò qui.


  • AF =Indirizzo Famiglia
  • PF =Famiglia di protocolli

Significato, AF_INET si riferisce a indirizzi da Internet, indirizzi IP in particolare. PF_INET si riferisce a qualsiasi cosa nel protocollo, solitamente socket/porte.

Prendi in considerazione la lettura delle pagine man per socket(2) e bind(2). Per il sin_addr field, fai qualcosa di simile a quanto segue per impostarlo:

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

Linux
  1. Qual è la differenza tra InnoDB e MyISAM?

  2. La differenza tra [[ $a ==Z* ]] e [ $a ==Z* ]?

  3. Qual è la differenza tra Git Switch e Checkout?

  4. Qual è la differenza tra mutex e sezione critica?

  5. Qual è la differenza tra strtok_r e strtok_s in C?

Qual è la differenza tra Linux e Unix?

Qual è la differenza tra Login e Non-Login Shell

Qual è la differenza tra il comando apt e apt-get?

Che cos'è un hypervisor? Qual è la differenza tra il tipo 1 e 2?

Qual è la differenza tra curl e Wget?

Qual è la differenza tra unlink e rm?