C wywołanie systemu funkcji połączenia

C wywołanie systemu funkcji połączenia

W języku C ustanowienie połączenia klient-serwer za pośrednictwem gniazda wymaga kilku kroków i funkcji. Niektóre z nich służą do pobierania danych z serwera, z którym chcesz się połączyć, inne są używane do tworzenia gniazda lub konwersji adresów.

Chociaż nie ma konkretnej kolejności, ta seria kroków i wywołania funkcji należy wykonać w kolejności, ponieważ ich wyniki są używane w argumentach wejściowych kolejnej funkcji.

W tym Wskazówka Linux Artykuł, nauczysz się, jak korzystać z łączyć() funkcjonuj i utwórz gniazdo od podstaw, aby zdalnie podłączyć do serwera.

Zaczynamy od opisu składni, argumentów wejściowych i wyjściowych, które składają się na tę funkcję, oraz teoretyczne wyjaśnienie, jak to działa. Następnie przyjrzymy się przykładowi, który pokazuje krok po kroku proces tworzenia i podłączenia gniazda.

Ponieważ użycie tej funkcji wymaga wiedzy o strukturach danych, które składają się na jego argumenty wejściowe, w specjalnej sekcji przyjrzymy się jej składowi, typowi danych jego członków i parametrach, które definiują ją w każdym.

Składnia funkcji Connect () w języku C

int connect (int sockfd, struct sockaddr *serv_addr, int addrlen)

Opis funkcji Connect w języku C

Funkcja Connect () ustanawia połączenie gniazda między klientem a serwerem.

Ta funkcja łączy gniazdo, którego deskryptorem jest sockfd, do serwera i którego adres jest przechowywany w strukturze serv_addr, która ma długość addrlen.

Jeśli połączenie zakończy się powodzeniem, Connect () zwraca 0 w wyniku i jeśli połączenie nie można ustalić, -1.

Poniżej znajduje się szczegółowy opis każdego argumentu wejściowego i jego cel w funkcji Connect ().

Sockfd: To jest liczba całkowita z deskryptorem gniazda. Ten deskryptor jest wynikiem zwróconym przez funkcję socket () i służy do łączenia, wysyłania i odbierania danych z serwera.

Serv_Addr: To jest wskaźnik do struktury typu sockaddr, który przechowuje adres serwera, z którym można się połączyć.

addrlen: To jest rozmiar członka tablicy SA_DATA struktury Sockaddr, gdzie adres, numer portu itp. przechowywane.

Kroki przed wywołaniem funkcji Connect (), aby połączyć się z serwerem.

Wezwanie funkcji Connect () jest ostatnią z serii kroków niezbędnych do ustanowienia udanego połączenia. Kroki te obejmują zdefiniowanie zmiennych i struktur, których funkcje będą używać: tworzenie gniazda i uzyskanie adresu IP serwera, który chcemy podłączyć itp. W pięciu krokach wyjaśniamy, jak utworzyć gniazdo i podłączyć go do serwera za pomocą funkcji Connect ().

Jak tworzyć, skonfigurować i podłączyć gniazdo krok po kroku w języku C

Krok 1: W pierwszym kroku dołączymy następujące nagłówki i zdefiniujemy następujące zmienne:

#włączać
#włączać
#włączać
#włączać
#włączać
#włączać
#włączać
#włączać
int socket_id;
int port = 80;
W terrorze;
Bufor char [1025);

Liczba całkowita Socket_id jest identyfikatorem gniazda, za pomocą którego wykonane jest połączenie oraz przez które dane są wysyłane i odbierane. Zmienna Port Określa numer portu gniazda. W takim przypadku 80 dla serwisu HTTP i liczby całkowitej błąd służy do wykrywania błędów w różnych funkcjach.

Następnie zdefiniujemy wskaźnik do struktury typu Hostent o imieniu serwer i jeden typu sockaddr_in o imieniu klient. Te struktury przechowują informacje, takie jak adresy IP, typ połączenia itp. Te typu przechowują informacje o serwerze, podczas gdy te typowe sockadrr_in Przechowuj dane połączenia. Używamy funkcji memcpy (), aby wyczyścić wszystkie dane w strukturze hostacyjnej.

Struktury hostent *serwer;
struct sockaddr_in Client;
memcpy (i serwer, 0, sizeof (serwer));

Krok 2: Po zdefiniowaniu struktury hostenowej następnym krokiem jest określenie adresu IP nazwy hosta, z którą chcemy się połączyć. W tym celu C zawiera kilka funkcji, które mogą rozwiązać adres. W tym przykładzie użyjemy GethostByName (). Ta funkcja zwraca Hostent Struktura z danymi domeny przekazanymi w argumencie wejściowym jako ciąg lub wskaźnik. Jeśli Warunek złamie połączenie w przypadku błędu, na przykład nieistniejącej nazwy domeny.

server_id = gethostByName ("www.Google.com ”);
if (server_id == null)

printf („\ nerror otrzymuje dane domeny.\N");
zwrot 1;

Krok 3: Utwórz gniazdo sockket_id i zdobądź jego identyfikator. Funkcja socket () zwraca identyfikator utworzonego gniazda na podstawie rodziny adresów, typu i protokołu połączenia. W tym przypadku AF _inet, Sock _stream dla połączenia IP4 i TCP.

Socket_id = Socket (af_inet, sock_stream, 0);

Krok 4: Ustaw konfigurację połączenia w sockaddr_in Struktura. Aby to zrobić, uzyskaj dostęp do członków i przypisz ich wartości, aby określić usługę i zająć się rodziną. Numer portu jest określony w bezpośrednim formacie binarnym i dlatego musi zostać przekonwertowany za pomocą funkcji htons ().

W tym przykładzie ustawimy AF_INET w sin_family pole dla adresów IPv4 i In sin_port Przypisujemy port 80 do usługi „HTTP”.

klient.sin_family = af_inet;
klient.sin_port = htons (port);

Krok 5: Następnym krokiem jest skopiowanie adresu z serwer struktura do klient Struktura do użycia jako adres połączenia dla gniazda. Jednym ze sposobów na to jest użycie funkcji bcopy () w następujący sposób:

bcopy ((char *) serwer-> h_addr,
(char *) i klient.sin_addr.s_addr,
sizeof (server-> h_length));

Skopiuj adres do struktury Sockaddr, która jest używana przez funkcję connect () jako argument wejściowy dla Serv_Addr.

Robimy to przez rzucać struktur i zapisać linie kodu. Zrobimy to w wywołaniu funkcji Connect () w argumencie wejściowym Serv_Addr.

Poniżej możesz zobaczyć, jak poprawnie przekonwertować informacje klient Struktura:

(struct sockaddr *) i klient, sizeof (klient))

Następnie wywołaj funkcję Connect () i przejdź do identyfikatora Socket_id Jako pierwszy argument. Jako drugi argument, Sockaddr struktura i wreszcie rozmiar struktury.

Liczba całkowita błąd jest przekazywany jako argument wejściowy, którego używamy do sprawdzenia, czy połączenie się powiodło. Poniższy fragment pokazuje, jak wywołać funkcję Connect () i sprawdzić, czy się udało:

error = connect (socket_id, (struct sockaddr *) i klient, sizeof (client));
If (błąd h_addr,
(char *) i klient.sin_addr.s_addr,
sizeof (server-> h_length));
error = connect (socket_id, (struct sockaddr *) i klient, sizeof (client));
if (błąd <0)
printf („\ ncould nie ustanowienie połączenia z serwerem \ n”);
Zamknij (socket_id);
zwrot 1;

printf ("\ nconnectto: %s \ n", inet_ntoa (klient.sin_addr));

Obraz pokazuje kompilację i wykonanie kodu, w którym łączy się z „www.Google.Serwer com ”. Ten kod ustanawia połączenie, a następnie zamyka aplikację poprzez odłączenie.

Poniższy fragment używa funkcji fgets () do wprowadzania ciągów za pomocą konsoli poleceń oraz funkcji send () i recv () do wysyłania poleceń HTTP na serwer i odbierania odpowiedzi:

while (1)
printf („Aby wyjść naciśnij Ctrl+c \ nsend http polecenie:”);
Walki (bufor, 1025, stdin);
Wyślij (socket_id, bufor, 1025, 0);
memset (i bufor, „\ 0”, 1025);
recv (socket_id, bufor, 1025, 0);
printf („%s”, bufor);
memset (i bufor, „\ 0”, 1025);

Obraz, który widzimy poniżej, pokazuje wykonanie kompletnego kodu z wysyłaniem polecenia „Get” HTTP i odpowiedź serwera:

Struktura sockaddr_in

Struktury typu sockaddr_in Przechowuj konfigurację typu i adresu połączenia. Ich członkowie są używane do określania rodziny, adresu do użycia i numeru portu.

Poniżej możesz zobaczyć ten typ struktury wraz ze szczegółową listą każdego członka:

struct sockaddr_in

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

sin_family: Ta liczba całkowita określa jedną z opcji rodzinnych, które należy zwrócić przez serwer. Opcje rodziny adresów to:

AF_INET dla adresów IPv4.

AF_INET6 dla adresów IPv6.

sin_port: Ustawia numer portu Usługi do użycia.

sin_addr: To jest skrót od adresu internetowego. Jest to struktura typu in_addr, w której przechowywany jest adres internetowy.

sin_zero: Jest to tablica 8 niepodpisanych znaków o wartości 0, które służą jako wyściółka do zrekompensowania 14 bajtów wielkości struktury sockaddr.

Struktura hostacyjna

Ten typ struktury przechowuje przydatne dane dostarczone przez serwer, gdy zapytanie jest wykonywane z funkcjami takimi jak gethostbynam (). Te prequeria dotyczące połączeń gniazdowych rozwiążą adresy i informacje zwrotne, takie jak nazwa domeny, rodzina adresów i lista adresów, jeśli istnieje więcej niż jeden. Poniżej możesz zobaczyć tę strukturę wraz ze szczegółowym opisem każdego elementu:

Structu Hostent

char *h_name;
char ** h_aliases;
int h_addrtype;
int h_length;
char ** h_addr_list;
#Define H_Addr H_Addr_List [0]
;

H_name: To wskaźnik do ciągu o nazwie domeny, o którą został zapytany.

H_aliases: To jest lista alternatywnych nazwisk.

H_ADDRTYPE: Ten członek określa rodzinę adresu, o którą został zapytany.

H_Length: To określa rozmiar adresu.

H_ADDR_LIST: To jest wskaźnik do listy wskazówek adresowych. Jeśli serwer zwróci więcej niż jeden adres dla zapytania, każdy jest dostępny za pośrednictwem tego wskaźnika listy.

H_ADDR : Ta struktura definiuje h_addr jako wskaźnik pierwszego adresu w H_ADDR_LIST, Więc dostęp jest poprzez tę definicję.

Wniosek

W tym Wskazówka Linux Artykuł, wyjaśniliśmy wszystko o łączyć() Funkcja w języku C.

Przyjrzeliśmy się składni tej funkcji, a także rodzajom argumentów i struktur, których używa w swoich danych wejściowych. Ponadto wyjaśniliśmy krok po kroku, jak utworzyć gniazdo i połączyć się z zdalnym serwerem za pomocą tej funkcji.

Aby mieć głębszą wiedzę na temat gniazd w tym języku, stworzyliśmy specjalną sekcję, która wyjaśnia struktury używane przez funkcje gniazda, szczegółowo opisując każdego z ich członków funkcję, którą wykonują w argumentach wejściowych różnych funkcji.