Unix Socket - Strukturen

In der Unix-Socket-Programmierung werden verschiedene Strukturen verwendet, um Informationen über die Adresse und den Port sowie andere Informationen zu speichern. Die meisten Socket-Funktionen erfordern einen Zeiger auf eine Socket-Adressstruktur als Argument. In diesem Kapitel definierte Strukturen beziehen sich auf die Internetprotokollfamilie.

sockaddr

Die erste Struktur ist sockaddr , die die Socket-Informationen enthält -

struct sockaddr {
   unsigned short   sa_family;
   char             sa_data[14];
};

Dies ist eine generische Socket-Adressstruktur, die in den meisten Socket-Funktionsaufrufen übergeben wird. Die folgende Tabelle enthält eine Beschreibung der Mitgliedsfelder -

Attribut Werte Beschreibung
sa_family

AF_INET

AF_UNIX

AF_NS

AF_IMPLINK

Es repräsentiert eine Adressfamilie. In den meisten internetbasierten Anwendungen verwenden wir AF_INET.
sa_data Protokollspezifische Adresse Der Inhalt der 14 Bytes der protokollspezifischen Adresse wird entsprechend der Art der Adresse interpretiert. Für die Internetfamilie verwenden wir die IP-Adresse der Portnummer, die durch die unten definierte Struktur sockaddr_in dargestellt wird.

sockaddr in

Die zweite Struktur, mit der Sie auf die Elemente des Sockets verweisen können, lautet wie folgt:

struct sockaddr_in {
   short int            sin_family;
   unsigned short int   sin_port;
   struct in_addr       sin_addr;
   unsigned char        sin_zero[8];
};

Hier ist die Beschreibung der Mitgliedsfelder -

Attribut Werte Beschreibung
sa_family

AF_INET

AF_UNIX

AF_NS

AF_IMPLINK

Es repräsentiert eine Adressfamilie. In den meisten internetbasierten Anwendungen verwenden wir AF_INET.
sin_port Service-Port Eine 16-Bit-Portnummer in Netzwerkbyte-Reihenfolge.
sin_addr IP Adresse Eine 32-Bit-IP-Adresse in Netzwerkbyte-Reihenfolge.
sin_zero Nicht benutzt Sie setzen diesen Wert einfach auf NULL, da dieser nicht verwendet wird.

in addr

Diese Struktur wird nur in der obigen Struktur als Strukturfeld verwendet und enthält eine 32-Bit-Netz-ID / Host-ID.

struct in_addr {
   unsigned long s_addr;
};

Hier ist die Beschreibung der Mitgliedsfelder -

Attribut Werte Beschreibung
s_addr Service-Port Eine 32-Bit-IP-Adresse in Netzwerkbyte-Reihenfolge.

Hostent

Diese Struktur wird verwendet, um Informationen zum Host zu speichern.

struct hostent {
   char *h_name; 
   char **h_aliases; 
   int h_addrtype;  
   int h_length;    
   char **h_addr_list
	
#define h_addr  h_addr_list[0]
};

Hier ist die Beschreibung der Mitgliedsfelder -

Attribut Werte Beschreibung
h_name ti.com etc. Es ist der offizielle Name des Gastgebers. Zum Beispiel tutorialspoint.com, google.com usw.
h_aliases TI Es enthält eine Liste von Hostnamen-Aliasnamen.
h_addrtype AF_INET Es enthält die Adressfamilie und ist bei internetbasierten Anwendungen immer AF_INET.
h_Länge 4 Es enthält die Länge der IP-Adresse, die für die Internetadresse 4 beträgt.
h_addr_list in_addr Bei Internetadressen sind die Zeigerarrays h_addr_list [0], h_addr_list [1] usw. Punkte für die Strukturierung in_addr.

NOTE - h_addr ist als h_addr_list [0] definiert, um die Abwärtskompatibilität zu gewährleisten.

Diener

Diese spezielle Struktur wird verwendet, um Informationen zu Diensten und zugehörigen Ports zu speichern.

struct servent {
   char  *s_name; 
   char  **s_aliases; 
   int   s_port;  
   char  *s_proto;
};

Hier ist die Beschreibung der Mitgliedsfelder -

Attribut Werte Beschreibung
s_name http Dies ist der offizielle Name des Dienstes. Zum Beispiel SMTP, FTP POP3 usw.
s_aliases ALIAS Es enthält die Liste der Service-Aliase. Meistens wird dies auf NULL gesetzt.
Sport 80 Es wird eine Portnummer zugeordnet sein. Für HTTP sind dies beispielsweise 80.
s_proto

TCP

UDP

Es wird auf das verwendete Protokoll eingestellt. Internetdienste werden entweder über TCP oder UDP bereitgestellt.

Tipps zu Sockelstrukturen

Socket-Adressstrukturen sind ein wesentlicher Bestandteil jedes Netzwerkprogramms. Wir ordnen sie zu, füllen sie aus und übergeben ihnen Zeiger auf verschiedene Socket-Funktionen. Manchmal übergeben wir einen Zeiger auf eine dieser Strukturen an eine Socket-Funktion, die den Inhalt ausfüllt.

Wir übergeben diese Strukturen immer als Referenz (dh wir übergeben einen Zeiger auf die Struktur, nicht auf die Struktur selbst), und wir übergeben immer die Größe der Struktur als ein weiteres Argument.

Wenn eine Socket-Funktion eine Struktur ausfüllt, wird die Länge auch als Referenz übergeben, damit ihr Wert von der Funktion aktualisiert werden kann. Wir nennen diese Werte-Ergebnis-Argumente.

Setzen Sie die Strukturvariablen immer auf NULL (dh '\ 0'), indem Sie memset () für bzero () -Funktionen verwenden, da sonst unerwartete Junk-Werte in Ihrer Struktur auftreten können.