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ć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;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 ”);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;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,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));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)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_insin_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 HostentH_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.