Was ist AF_INET und warum brauche ich es?

199

Ich fange mit der Socket-Programmierung an und sehe das immer wieder AF_INET.

Ich habe jedoch noch nie etwas anderes an seiner Stelle gesehen. Meine Dozenten sind nicht so hilfreich und sagen einfach "Sie brauchen es einfach".

Also meine Fragen:

  • Was ist der Zweck von AF_INET?
  • Wird jemals etwas anderes verwendet?
    • Wenn nicht, warum ist es dort? Für mögliche Änderungen in der Zukunft?
    • Wenn ja, was und warum?
Smashery
quelle

Antworten:

267

AF_INETist eine Adressfamilie, mit der der Adresstyp festgelegt wird, mit dem Ihr Socket kommunizieren kann (in diesem Fall Internet Protocol v4-Adressen). Wenn Sie einen Socket erstellen, müssen Sie dessen Adressfamilie angeben. Anschließend können Sie nur Adressen dieses Typs mit dem Socket verwenden. Der Linux-Kernel unterstützt beispielsweise 29 andere Adressfamilien wie UNIX ( AF_UNIX) - Sockets und IPX ( AF_IPX) sowie die Kommunikation mit IRDA und Bluetooth ( AF_IRDAund AF_BLUETOOTHes ist zweifelhaft, ob Sie diese auf einer so niedrigen Ebene verwenden).

In den meisten Fällen AF_INETist es die sicherste Option , bei der Socket-Programmierung über ein Netzwerk zu bleiben . Es gibt auch AF_INET6für Internet Protocol v6 Adressen.

Hoffe das hilft,

George Shore
quelle
43

Der Hauptzweck von AF_INET bestand darin, andere mögliche Netzwerkprotokolle oder Adressfamilien zu berücksichtigen (AF steht für die Adressfamilie; PF_INET steht für die (IPv4) Internetprotokollfamilie). Zum Beispiel gibt es wahrscheinlich noch einige Netware SPX / IPX-Netzwerke. Es gab andere Netzwerksysteme wie DECNet, StarLAN und SNA, ganz zu schweigen von dem schlecht gezeugten ISO OSI (Open Systems Interconnection), und diese verwendeten nicht unbedingt die jetzt allgegenwärtige IP-Adresse, um den Peer-Host in Netzwerkverbindungen zu identifizieren.

Die allgegenwärtige Alternative zu AF_INET (die im Nachhinein AF_INET4 heißen sollte) ist AF_INET6 für die IPv6-Adressfamilie. IPv4 verwendet 32-Bit-Adressen. IPv6 verwendet 128-Bit-Adressen.

Möglicherweise sehen Sie einige andere Werte - diese sind jedoch ungewöhnlich. Es ist da, um Alternativen und zukünftige Richtungen zu ermöglichen. Die Sockets-Schnittstelle ist in der Tat sehr allgemein gehalten - was einer der Gründe ist, warum sie dort gedeiht, wo andere Netzwerkschnittstellen verwelkt sind.

Das Leben ist (meistens) einfacher geworden - sei dankbar.

Jonathan Leffler
quelle
Vielen Dank für Ihre Antwort. Ich gehe davon aus, dass Ihre Antwort auf meine erste Frage darin besteht, zu definieren, welches Netzwerkprotokoll verwendet werden soll. Könnten Sie bitte genauer auf die anderen Fragen eingehen?
Smashery
Guter Punkt zu AF_INET6; Andere Adressfamilien werden auf einigen Betriebssystemen unterstützt.
MarkR
15

Sie benötigen Argumente wie AF_UNIX oder AF_INET, um anzugeben, welche Art von Socket-Adressierung Sie zur Implementierung der IPC-Socket-Kommunikation verwenden würden. AF steht für Address Family.

Wie im BSD-Standard werden Socket-Adressen (im Python-Socket-Modul übernommen) wie folgt dargestellt:

  1. Für die Adressfamilie AF_UNIX / AF_LOCAL wird eine einzelne Zeichenfolge verwendet. Diese Option wird für IPC auf lokalen Computern verwendet, auf denen keine IP-Adresse erforderlich ist.

  2. Ein Paar (Host, Port) wird für die AF_INET-Adressfamilie verwendet, wobei Host eine Zeichenfolge ist, die entweder einen Hostnamen in der Internetdomänennotation wie 'daring.cwi.nl' oder eine IPv4-Adresse wie '100.50.200.5' darstellt, und Port ist eine ganze Zahl. Wird verwendet, um zwischen Prozessen über das Internet zu kommunizieren.

AF_UNIX, AF_INET6, AF_NETLINK, AF_TIPC, AF_CAN, AF_BLUETOOTH, AF_PACKET, AF_RDS sind andere Option , die statt verwendet werden könnten AF_INET .

Dieser Thread über die Unterschiede zwischen AF_INET und PF_INET könnte ebenfalls nützlich sein.

Avi Mehenwal
quelle
14

Socket zeichnen sich durch Domäne, Typ und Transportprotokoll aus. Übliche Domänen sind:

  1. AF_UNIX: Das Adressformat ist der UNIX-Pfadname

  2. AF_INET: Das Adressformat ist Host- und Portnummer

(Es gibt tatsächlich viele andere Optionen, die hier für spezielle Zwecke verwendet werden können.) Normalerweise verwenden wir AF_INET für die Socket-Programmierung

Referenz: http://www.cs.uic.edu/~troy/fall99/eecs471/sockets.html

Asish P Mathew
quelle