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.