Struktura sockaddr_in

Struktura sockaddr_in

Programowanie gniazd w języku C wykorzystuje różne funkcje, wiele z nich służy do rozwiązywania, konwersji i określenia adresu serwera, z którym chcemy się połączyć. Niewątpliwie adres IP jest najważniejszymi informacjami, których potrzebujemy, gdy otwieramy gniazdo. I radzenie sobie z tymi adresami wymaga, abyśmy znali struktury, w których są przechowywane, rodzaj danych każdego z ich członków itp.

W tym Artykuł wskazów Linux, Dowiesz się wszystkiego o rodzaju socaddr_in Struktury używane przez funkcje systemowe do przechowywania adresów do połączeń internetowych.

Zobaczymy teoretyczny opis jego członków i rodzaj danych dla każdego z nich. Dowiemy się, jak tworzyć sockaddr_in struktura, a następnie odzyskaj, przekonwertuj i przechowuj adresy w tym typu struktury, aby ustanowić udane połączenie gniazda.

Wyjaśnimy również podobieństwa ze strukturą sockaddr i sposób konwersji danych z jednej na drugą, ponieważ jest to niezbędny krok do użycia funkcji Connect () i połączenia z serwerem.

Składnia struktury sockaddr_in w języku c

struct sockaddr_in
krótki sin_family;
niepodpisany krótki sin_port;
struct in_addr sin_addr;
char sin_zero [8];
;

Opis struktury sockaddr_in w języku c

Struktury typu sockaddr_in są przeznaczone do przechowywania adresu serwera w połączeniach internetowych oraz do kompatybilnego rozmiaru i zamówienia danych ze strukturą sockaddr używaną przez funkcję Connect (.

Dane przechowywane w tych strukturach określają rodzinę adresu, numer portu i adres IP serwera. Następnie widzimy listę członków sockaddr_in Struktura i opis każdego członka:

sin_family: Jest to krótkie, które określa rodzaj rodziny adresów, którą zawiera struktura. Te opcje rodziny adresów są następujące:

AF_INET: Określa rodzinę adresu IPv4.

AF_INET6: Określa rodzinę adresu IPv6.

sin_port: to jest Ushort To określa numer portu, którego użyje gniazdo. Podobnie jak adresy, numer portu nie jest zakodowany, co oznacza, że ​​należy go określić w bezpośrednim formacie binarnym, więc należy wykonać konwersję na ten typ danych, aby przypisać do niego wartość.

in_add: To jest struktura, której członkiem jest uint32_t gdzie każdy z 4 bajtów odpowiada polu adresu IPv4 serwera internetowego, z którym gniazdo ma zostać otwarte. Podobnie jak numer portu, adres w tej strukturze musi być określony w czystym formacie binarnym.

sin_zero: Jest to tablica 8-znakowa, której jedynym celem jest zrównoważenie wielkości struktury o strukturze typu Sockaddr.

Jak ogłosić strukturę sockaddr_in w języku c

Zadeklarować sockaddr_in Struktura, napisz w jednym wierszu kodu „struct”Następnie typ. W tym przypadku, sockaddr_in A potem „Nazwa struktury" Lub "* Nazwa struktury„Zadekorować wskaźnik. Składnia do deklarowania sockaddr_in Struktura jest następująca:

struct sockaddr_in *my_struct;

Jak ustawić numer portu w strukturze sockaddr_in w języku c

Numer portu musi być określony w formie bezpośredniej binarnej w członku sin_port struktury. Dlatego konieczne jest konwersja wartości na ten typ danych.

HTONS () Funkcja jest najczęściej stosowana w tym celu. Przekształca wartość liczb całkowitą zawartą w argumencie wejściowym i zwraca swoją wartość w bezpośrednim formacie binarnym na wyjście.

Następnie zobaczmy, jak przypisać port 80 do sin_port Członek wcześniej zadeklarowanej struktury:

int port = 80;
my_struct.sin_port = htons (port);

Jak ustawić adres IP w strukturze sockaddr_in w języku c

Adresy IP nie są kodowane, co oznacza, że ​​każda z liczb w ich polach jest reprezentowana przez jego równoważny binarny. Aby z nimi współpracować, w niektórych przypadkach konieczne jest konwersja adresów IP na struny lub ciągi na adresy IP, aby przypisać lub zapytać te wartości w strukturach.

Język C zawiera kilka funkcji do konwertowania ciągów na adresy i przechowywania wyniku niektórych struktur.

funkcja inet_pton () jest jednym z najczęściej używanych do tego celu. Jest zdefiniowany w nagłówku „inet.H”I ma trzy argumenty wejściowe. Pierwszy musi określić rodzinę adresu do konwersji, w tym przypadku AF _inet.

Drugim argumentem musi być wskaźnik do ciągu określający adres IP, przy czym każde pole jest oddzielone okresem.

Trzecim argumentem tej funkcji musi być wskaźnik do struktury typu sockaddr_in gdzie przechowywany jest przekonwertowany adres.

inet_ntop () funkcja wykonuje odwrotne zadanie, konwertując adresy przechowywane w sockaddr_in struktura w strunach.

Następnie zobaczymy, jak przypisać adres IP do struktury my_struct sockaddr_in Wpisz z ciągu, w tym przypadku Addr, używając inet_pton () funkcjonować. Następnie używamy inet_ntop () funkcja do konwersji adresu z powrotem do ciągów IP, aby wyświetlić go w konsoli poleceń za pomocą printf ().

#włączać
#włączać
#włączać
#włączać
void main ()

Char ip [inet_adstrstlen] = "";
Char Addr [200] = "192.168.1.1 ";
struct sockaddr_in *my_struct;
// konwertuje ciąg na adres.
inet_pton (af_inet, addr i my_struct);
// konwertuje adres na ciąg.
inet_ntop (af_inet i my_struct, ip, inet_adstrstlen);
printf ("\ n \ NIP Adres: %s \ n \ n", ip);

Poniższy obraz pokazuje adres IP, który uzyskaliśmy z łańcucha addr. Następnie wróciliśmy z funkcją uzupełniającą inet_ntop () Aby przekonwertować adres przechowywany w my_struct do ciągu, aby wyświetlić go w konsoli poleceń.

Jak określić adres IP domeny i przechowywać go w strukturze sockaddr_in w języku c

Aby połączyć się z hostem, najpierw musisz znać jego adres. Następnie przyjrzyjmy się, jak uzyskać adres IP hosta i przechowywać go w sockaddr_in struktura za pomocą GethostbyName () funkcjonować.

Ta funkcja przyjmuje jako jedyny argument wejściowy ciąg lub wskaźnik, który określa nazwę hosta, której adres ma zostać ustalony. W rezultacie, GethostbyName () Zwraca strukturę typu hostentowego ze wszystkimi danymi domen, w tym adres IP.

Po pobraniu informacji hosta w strukturze hostentowej uzyskany adres jest skopiowany do sockaddr_in struktura za pomocą funkcja bcopy ().

Następnie widzimy kod, w którym socaddr_in i definiowane są struktury typu hostentowego. Ip adres "www.Google.com”Jest określone w ostatniej strukturze i skopiowane do sockaddr_in Struktura. Następnie określony adres jest konwertowany na ciąg za pomocą inet_ntoa () i printf () Funkcje i wyświetlane w konsoli poleceń:

#włączać
#włączać
#włączać
#włączać
#włączać
int main ()
struct sockaddr_in my_struct;
struct hostent *host_ent;
host_ent = gethostByName ("www.Google.com ”);
Bcopy ((char *) host_ent-> h_addr, (char *) i my_structu.sin_addr.s_addr,
sizeof (host_ent-> h_length));
printf („Adres IP: %s \ n”, inet_ntoa (my_structu.sin_addr));

W ten sposób zapisaliśmy już adres „www.Google.com”W strukturze typu sockaddr_in. Poniższy rysunek pokazuje adres hosta określonego w argumencie wejściowym GethostbyName () funkcjonować.

Google.COM ma wiele adresów IP powiązanych z domeną, więc wynik tego kodu może różnić się od wyniku obrazu.

Jak rzucić strukturę sockaddr z danymi ze struktury sockaddr_in

łączyć() Funkcja jest jedyną funkcją dostarczoną przez język C do ustanowienia połączeń gniazda. Ta funkcja wykorzystuje struktury typu Sockaddr Aby określić adres, do którego chce się połączyć.

Struktura używana przez łączyć() Funkcja ma ten sam rozmiar w bajtach co struktura typu sockaddr_in ale różni się typem danych. Oznacza to, że struktura rzucać należy wykonać, aby wykorzystać dane połączenia przechowywane w sockaddr_in Struktura w tej funkcji.

Ta prosta operacja można wykonać z tym samym wywołaniem Funkcja Connect () W drugim argumencie wejściowym, jak pokazano poniżej:

Connect (Socket, (struct sockaddr *) i my_struct, sizeof (my_struct));

Wniosek

W tym Artykuł wskazów Linux, Wyjaśniliśmy wszystko, co musisz wiedzieć o pracy ze strukturami typu sockaddr_in. Szczegółowo przyjrzeliśmy się typowi i danemu, które każdy z jego członków przechowuje.

Pokazaliśmy również, jak zadeklarować tego typu strukturę i jak korzystać z niezbędnych funkcji, aby uzyskać, konwertować i manipulować różnymi danymi przechowywanymi przez każdego z jego członków.

Aby uzyskać więcej artykułów na temat porad C Language i Linux, użyj wyszukiwarki na naszej stronie internetowej.