Gniazdo Unix - Struktury

Różne struktury są używane w programowaniu gniazd Unix do przechowywania informacji o adresie i porcie, a także innych informacji. Większość funkcji gniazd wymaga jako argumentu wskaźnika do struktury adresu gniazda. Struktury zdefiniowane w tym rozdziale odnoszą się do rodziny protokołów internetowych.

sockaddr

Pierwsza struktura to sockaddr, która przechowuje informacje o gnieździe -

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

Jest to ogólna struktura adresu gniazda, która będzie przekazywana w większości wywołań funkcji gniazda. Poniższa tabela zawiera opis pól członków -

Atrybut Wartości Opis
sa_family

AF_INET

AF_UNIX

AF_NS

AF_IMPLINK

Reprezentuje rodzinę adresów. W większości aplikacji internetowych używamy AF_INET.
sa_data Adres zależny od protokołu Zawartość 14 bajtów adresu specyficznego dla protokołu jest interpretowana zgodnie z typem adresu. W przypadku rodziny internetowej użyjemy adresu IP numeru portu, który jest reprezentowany przez strukturę sockaddr_in zdefiniowaną poniżej.

sockaddr in

Druga struktura, która pomaga w odwołaniu się do elementów gniazda, jest następująca -

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

Oto opis pól członkowskich -

Atrybut Wartości Opis
sa_family

AF_INET

AF_UNIX

AF_NS

AF_IMPLINK

Reprezentuje rodzinę adresów. W większości aplikacji internetowych używamy AF_INET.
sin_port Port serwisowy 16-bitowy numer portu w sieciowej kolejności bajtów.
sin_addr Adres IP 32-bitowy adres IP w sieciowej kolejności bajtów.
sin_zero Nieużywany Po prostu ustawiasz tę wartość na NULL, ponieważ nie jest używana.

in addr

Ta struktura jest używana tylko w powyższej strukturze jako pole struktury i zawiera 32-bitowy identyfikator netid / hostid.

struct in_addr {
   unsigned long s_addr;
};

Oto opis pól członkowskich -

Atrybut Wartości Opis
s_addr port serwisowy 32-bitowy adres IP w sieciowej kolejności bajtów.

hostent

Ta struktura służy do przechowywania informacji związanych z hostem.

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]
};

Oto opis pól członkowskich -

Atrybut Wartości Opis
h_name ti.com itp. Jest to oficjalna nazwa gospodarza. Na przykład tutorialspoint.com, google.com itp.
h_aliases TI Zawiera listę aliasów nazw hostów.
h_addrtype AF_INET Zawiera rodzinę adresów, aw przypadku aplikacji internetowych zawsze będzie to AF_INET.
h_length 4 Przechowuje długość adresu IP, która wynosi 4 dla adresu internetowego.
h_addr_list in_addr W przypadku adresów internetowych tablica wskaźników h_addr_list [0], h_addr_list [1] itd. Wskazuje na strukturę in_addr.

NOTE - h_addr jest zdefiniowany jako h_addr_list [0], aby zachować wsteczną kompatybilność.

servent

Ta szczególna struktura służy do przechowywania informacji związanych z usługą i powiązanymi portami.

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

Oto opis pól członkowskich -

Atrybut Wartości Opis
s_name http To jest oficjalna nazwa serwisu. Na przykład SMTP, FTP POP3 itp.
s_aliases ALIAS Zawiera listę aliasów usług. W większości przypadków będzie to NULL.
sport 80 Będzie miał powiązany numer portu. Na przykład dla HTTP będzie to 80.
s_proto

TCP

UDP

Jest ustawiony na używany protokół. Usługi internetowe są świadczone przy użyciu protokołu TCP lub UDP.

Wskazówki dotyczące struktur gniazd

Struktury adresów gniazd są integralną częścią każdego programu sieciowego. Przydzielamy je, wypełniamy i przekazujemy do nich wskaźniki do różnych funkcji gniazd. Czasami przekazujemy wskaźnik do jednej z tych struktur do funkcji gniazda i wypełnia ona zawartość.

Zawsze przekazujemy te struktury przez odniesienie (tj. Przekazujemy wskaźnik do struktury, a nie samą strukturę) i zawsze przekazujemy rozmiar struktury jako kolejny argument.

Gdy funkcja gniazda wypełnia strukturę, długość jest również przekazywana przez odwołanie, dzięki czemu jej wartość może być aktualizowana przez funkcję. Nazywamy te argumenty wartość-wynik.

Zawsze ustawiaj zmienne struktury na NULL (tj. '\ 0') za pomocą memset () dla funkcji bzero (), w przeciwnym razie może dojść do nieoczekiwanych wartości śmieci w Twojej strukturze.