2024. május 3., péntek

Gyorskeresés

Útvonal

Cikkek » Számtech rovat

Bevezetés a hálózati kommunikáció programozástechnikájába

Legújabb írásomban a hálózati kommunikáció C-ben történő művelésébe próbálok betekintést nyújtani.

[ ÚJ TESZT ]

Név-, és címfeloldás

Felhasználóként igen ritkán jegyezzük meg egy szolgáltatás IP-címét, inkább hosztnév alapján szokás böngészni. Például elég kevesen jegyzik meg, hogy a google.hu IP címe 216.58.209.163, ezért is van szükségünk különféle névfeloldó automatizmusokra. Ez történhet a számítógépen lokálisan megtalálható IP – hosztnév párokból, de tipikusan DNS szerver segítségével történik. Ezekre az átváltásokra is van néhány igen hasznos segítséget nyújtó függvényünk, amelyeket a következőkben fogunk tárgyalni.

A getaddrinfo () függvény kompatibilis IPv4 és IPv6 lekérdezésekkel is, futása során pedig a hosztnevet és szolgáltatásnevet IP-címmé és portszámmá konvertálja. Használatához a sys/socket.h és netdb.h header fájlok szükségesek.
int getaddrinfo (const char* node, const char *service, const struct addrinfo *hints, struct addrinfo **res);

A node paraméterben a hosztnevet kell megadnunk, a service-ben pedig a szolgáltatásnevet (NULL megadásakor a függvény maga választ portszámot). A hosztnév mezőt nyugodtan kitölthetjük prezentációs alakú IP címmel, a függvény helyettesíti az inet_pton () utasítást. A hints paraméterben kritériumok adhatók meg (struct addrinfo formában), a res paraméterben pedig láncolt lista formában megkapjuk a választ. (Láncolt lista révén a futás végeztével, fel kell szabadítanunk a listát a freeaddrinfo () utasítással.) A láncolt listákról itt olvashatsz.
Sikeres futáskor nullát ad a függvény, hibás futáskor hibakódot, melyet a gai_sterror hívással alakíthatunk szöveggé.

A függvénytől kapott válasz és a hints mezőben megadható kritériumok egy új, eddig nem tárgyalt struktúra megismerését teszik szükségessé.

struct addrinfo
{
int ai_flags;
int ai_family;
int ai_socktype;
int ai_protocol;
size_t ai_addrlen;
struct sockaddr *ai_addr;
char *ai_canonname;
struct addrinfo *ai_next;
}

Az ai_family paraméter értéke lehet AF_INET, AF_INET6 és AF_UNSPEC, mely esetben megkapjuk az IPv4 és IPv6 címet is a válaszban. Az ai_socktype mezőben SOCK_STREAM vagy SOCK_DGRAM értéket vagy nullát adhatunk meg. Utóbbi esetben UDP és TCP alapú választ is kapunk. Az ai_protocol mezőt állítsuk nullára (ekkor a protokollérték nem megkötött). Az ai_addrlen paraméter pedig a cím méretét várja bájtos alakban, mely címet a következő, ai_addr paraméter tartalmazza. A cím lehet sockaddr_in vagy sockaddr_in6 típusú. Az ai_canonname és ai_flags mezőkre itt nem térek ki, utóbbit állítsuk nullára alapesetben, de aki utánaolvas a működésének, megtudhatja, hogy itt további funkciók bekapcsolhatók. Az ai_next paraméter a láncolt listának mindig a következő elemére mutat, a lista utolsó eleménél értéke NULL.

Az eddig tárgyalt getaddrinfo () függvény inverze a getnameinfo () utasítás. Tehát ez a függvény végzi a socketcím hoszt és szolgáltatásnévvé való konverzióját. Alakja:
int getnameinfo (const struct sockaddr *sa, socklent_t salen, char *host, size_t hostlen, char *serv, size_t servlen, int flags);

Az sa paraméter címstruktúrára mutat (sockaddr_in vagy sockaddrin_6), a struktúra méretet a salen paraméterben adjuk meg. A host és serv mezők egy-egy előre lefoglalt karaktertömbre mutatnak (ide várjuk a futás eredményét), a hostlen és servlen paraméterek pedig a két karaktertömb méretét kell, hogy tartalmazzák. A flags mezőre ezúttal sem térnék ki, de érdemes lehet utánaolvasni.
Sikerés futáskor a getnameinfo () nullával tér vissza, egyéb esetben a kapott hibakód a gai_sterror () utasítással itt is szöveggé alakítható.

A cikk még nem ért véget, kérlek, lapozz!

Hirdetés

Copyright © 2000-2024 PROHARDVER Informatikai Kft.