Język C ma dużą liczbę funkcji do programowania gniazd. Wiele z nich służy do uzyskania niezbędnych informacji od hosta, do których ma być nawiązane połączenie. Informacje, że ten rodzaj funkcji pobiera, są niezbędne dla udanego połączenia, ponieważ obejmują adresy domeny, numery portów i tak dalej.
W tym artykule z podpowiedzi Linux dowiesz się wszystkiego o funkcji GethostByName (), która jest najczęściej używana do rozwiązywania i uzyskiwania adresów IP z nazw hostów.
Pokazamy składnię tej funkcji i teoretyczny opis tego, jak ona działa, jego argumenty wejściowe i wyjściowe, typ danych używany w każdym przypadku oraz prawidłowe deklaracja.
Następnie stosujemy to, czego nauczyliśmy się poprzez praktyczne przykłady, w tym fragmenty kodowe i obrazy, w których wdrażamy funkcję gethostByName (), aby rozwiązać i uzyskać adresy nazwy hosta.
Składnia funkcji GethostByName () w języku C
Struct Hostent *GethostByName (const char *nazwa);Opis funkcji GethostByName () w języku C
Funkcja GethostByName () zwraca adres IP, oficjalną nazwę i rodzinę adresu nazwy hosta. Ta funkcja prosi serwer o rozwiązywanie i zwrócenie adresu nazwy hosta, który jest określony jako ciąg lub wskaźnik do niej w nazwie argumentu pojedynczego wejścia.
Jeśli nie wystąpi błąd, GethostByName () zwraca wskaźnik do struktury typu „Hostent”, która przechowuje informacje o nazwie hosta. Jeśli wystąpi błąd, zwracany jest wskaźnik zerowy, a kod identyfikacji błędu można pobrać za pośrednictwem zmiennej globalnej H_ERRNO.
Nazwy hostów są zwykle powiązane z jednym adresem, ale istnieją przypadki dużych platform, które mają wiele powiązanych adresów, takich jak „www.Google.com ”. Z tego powodu struktury „hostentowe” są zaprojektowane tak, aby zawierały listę adresów. Do każdego z nich można uzyskać za pomocą tablicy wskazówek „h_addr_list”. Dalej, istnieje specjalna sekcja, która wyjaśnia wszystko na temat tego rodzaju struktury.
Chociaż funkcja GethostByName () jest uważana za przestarzała i została zastąpiona przez getAddrinfo (), jej prostota w inwokacji metody i argumentach wejściowych sprawia, że jest bardzo przydatna, gdy potrzebujesz tylko adresu nazwy hosta.
Funkcja gethostByName (), a także wszystkie inne funkcje rodziny gethostxxxx (), struktury i zmienne, których używają, są zadeklarowane w „netdb.H ”nagłówek. Musisz więc umieścić je do kodu, jak w następujący sposób:
#włączaćJak uzyskać adres nazwy hosta z funkcją gethostbyName () w języku C
W tym przykładzie użyjemy funkcji GethostByName (), aby uzyskać adres i oficjalną nazwę „Www.jądro.org ” Nazwa hosta.
Krok 1: Pierwszym krokiem jest wstawienie wymaganych nagłówków i utworzenie funkcji main (), która zwraca pustą wartość.
Krok 2: Wewnątrz funkcji main () deklarujemy host wskaźnika struktury typu, który służy jako argument wyjściowy GethostByName (). Ogłaszamy również tablicę o nazwie 256 znaków o nazwie „Bufor”, który przechowuje ciąg, który zawiera nazwę hosta, który przekazujemy jako argument wejściowy.
Krok 3: Po ogłoszeniu stosowanej zmiennej i struktury nazywamy funkcję GethostByName (), przekazując bufor jako argument wejściowy i strukturę hosta jako argumenty wyjściowe.
Krok 4: Jeśli funkcja powróci pomyślnie, następnym krokiem jest wyświetlenie oficjalnej nazwy i adresu. W tym celu używamy funkcji printf () w dwóch połączeniach. Pierwsze połączenie pokazuje oficjalną nazwę domeny, ciąg wskazany przez element H_Name struktury hosta. Drugi wywołanie pokazuje adres zapisany w H_ADDR_LIST [0], zdefiniowany jako H_ADDR, który konwertujemy na ciąg za pomocą funkcji inet_ntoa ().
Poniżej znajduje się pełny kod ze wszystkimi czterema krokami w tym przykładzie:
//Krok 1Poniższy obraz pokazuje kompilację i wykonanie tego kodu. Jak widzimy, GethostbyName () otrzymuje informacje z „Www.jądro.org ” domena i przechowuje ją w strukturze „hostencyjnej”.
Struktura hostacyjna
Struktura „hostentowa” przechowuje przydatne dane, które są dostarczane przez serwer, gdy zapytanie jest wykonywane z funkcjami takimi jak GethostByName (). Te połączenie gniazda jest wstępnie wymagane w celu rozwiązania adresów i zwraca informacje, takie jak nazwa domeny, rodzina adresów i lista adresów, jeśli istnieje więcej niż jeden. Możesz zobaczyć tę strukturę wraz ze szczegółowym opisem każdego elementu:
Structu HostentH_name: Jest to wskaźnik do ciągu o nazwie domeny, o którą jest zapytany.
H_aliases: Jest to lista alternatywnych nazwisk.
H_ADDRTYPE: Ten członek określa rodzinę adresu, o którą jest zapytany.
H_Length: 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: Dla uproszczenia ta struktura definiuje H_ADDR jako wskaźnik pierwszego adresu w h_addr_list. Dostęp odbywa się dzięki tej definicji.
Błędy, które mogą wystąpić podczas korzystania z funkcji gethostByName (): Jak je rozpoznać i identyfikować
Funkcja gethostByName () zwraca wskaźnik zerowy w przypadku błędu. Najłatwiejszym sposobem wykrycia błędu jest użycie warunku „jeśli”, w którym warunek wejściowy jest wskaźnikiem wyjściowym o wartości zerowej. Poniżej znajduje się fragment kodu, który pokazuje tę technikę:
if ((host = gethostByName (bufor)) == null)Gdy wystąpi błąd, jego liczbowa wartość identyfikacji jest automatycznie przechowywana w zmiennej globalnej H_ERRNO. Definicje błędów i ich reprezentacja numeryczna są określone w „Netdb.H" nagłówek.
Poniżej znajduje się fragment „netdb.H ”nagłówek z błędami, które funkcja GethostByName () może wygenerować, ich wartość numeryczna w H_ERRNO i krótki opis każdego błędu:
Definicja | Wartość | Błąd |
HOST NIEZNALEZIONY | 1 | Host nieznaleziony. |
SPRÓBUJ PONOWNIE | 2 | Nieautoryzujący. Host nieznaleziony. |
No_reCovery | 3 | Błąd nie do odzyskania. |
BRAK DANYCH | 4 | Prawidłowa nazwa, brak rekordu danych żądanego typu. |
Najłatwiejszym sposobem zidentyfikowania błędu jest otwarcie warunkowego skoku przełącznika w warunkach „jeśli”, który widzieliśmy wcześniej. Warunkiem skoku jest zmienna H_ERRNO. Każdy przypadek jest definicją każdego z opisanych błędów.
Teraz spójrzmy na kod pierwszego przykładu, w którym wstawiamy tę metodę do wykrywania i zidentyfikowania błędów w kroku 3.
//Krok 1Jak widać, określamy nieistniejącą domenę w buforze, która służy jako argument wejściowy do funkcji gethostbyName () w tym przypadku. Powoduje to błąd zidentyfikowany w warunkowym przełączniku skoku.
Poniższy obraz pokazuje kompilację i wykonanie tego kodu. W tym przypadku funkcja GethostByName () nie mogła znaleźć hosta. Tak więc program przeskakuje do
Host _not_ Znaleziono przypadek warunku przełącznika:
Wniosek
W tym artykule z podpowiedzi Linuksa pokazaliśmy, jak korzystać z funkcji gethostByName (), aby uzyskać informacje o nazwie hosta. Nauczyliśmy się teoretyczny opis tego, jak to działa i jak składają się argumenty wejściowe i wyjściowe, w tym specjalna sekcja opisująca, w jaki sposób skomponowana jest struktura „hostentowa”.
Następnie wdrożyliśmy zastosowanie tej funkcji w praktycznych przykładach. W ten sposób użyliśmy fragmentów kodu, aby pokazać niezbędne nagłówki do jego użycia, deklaracja struktur i zmiennych dla ich argumentów oraz konwersji i wyświetlania uzyskanych informacji.
Ponadto uwzględniliśmy sekcję, która wyjaśnia możliwe błędy, które ta funkcja może wygenerować i nauczyła technik ich wykrywania i identyfikacji.
Jak widzieliśmy w tym artykule, prostota tej funkcji i jej szybka implementacja oznaczają, że jest ona nadal przydatna, mimo że uznano ją za przestarzałą.