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.