Sockaddr_in -strukturen

Sockaddr_in -strukturen

Socket -programmering på C -språket bruker en rekke funksjoner, mange av dem brukes til å løse, konvertere og bestemme adressen til serveren vi ønsker å koble til. Utvilsomt er IP -adressen den viktigste informasjonen vi trenger når vi åpner en stikkontakt. Og å håndtere disse adressene krever at vi kjenner strukturene de er lagret i, typen data fra hvert av medlemmene osv.

I dette Linux hint artikkel, Du vil lære alt om typen SOCADDR_IN Strukturer som brukes av systemfunksjoner for å lagre adresser for internettforbindelser.

Vi vil se en teoretisk beskrivelse av medlemmene og typen data for hver av dem. Vi lærer å lage en Sockaddr_in Struktur og hente, konvertere og lagre adressene i denne strukturtypen for å etablere en vellykket stikkontakt.

Vi vil også forklare likhetene med Sockaddr -strukturen og hvordan du konverterer data fra den ene til den andre, da dette er et nødvendig skritt for å bruke Connect () -funksjonen og koble til serveren.

Syntaks av Sockaddr_in -strukturen på C -språk

struct sockaddr_in
kort sin_family;
usignert kort sin_port;
struct in_addr SIN_ADDR;
Char Sin_zero [8];
;

Beskrivelse av Sockaddr_in -strukturen på C -språk

Strukturer av type Sockaddr_in er ment å lagre adressen til serveren i Internett -tilkoblinger og å være kompatibel i størrelse og databestilling med en sockaddr -struktur som brukes av Connect () -funksjonen for å koble til en server.

Dataene som er lagret i disse strukturene spesifiserer adressefamilien, portnummer og IP -adresse til serveren. Deretter ser vi listen over medlemmer av Sockaddr_in Struktur og en beskrivelse av hvert medlem:

SIN_FAMILY: Dette er en kort som spesifiserer hvilken type adressefamilie som strukturen inneholder. Disse alternativene for adressefamilien er som følger:

Af_inet: Angir IPv4 -adressefamilien.

Af_inet6: Angir IPv6 -adressefamilien.

sin_port: det er en Ushort som spesifiserer portnummeret som kontakten vil bruke. I likhet med adresser er ikke portnummeret kodet, noe som betyr at det må spesifiseres i direkte binært format, så en konvertering til denne datatypen må gjøres for å tilordne en verdi til den.

in_add: Dette er en struktur hvis medlem er en uint32_t der hver av sine 4 byte tilsvarer et felt av IPv4 -adressen til internettserveren som kontakten skal åpnes. Som portnummeret, må adressen i denne strukturen spesifiseres i rent binært format.

Sin_zero: Dette er en 8-tegneserie, hvis eneste formål er å balansere størrelsen på strukturen med en struktur av typen Sockaddr.

Hvordan erklære en Sockaddr_in -struktur på C -språket

Å erklære a Sockaddr_in struktur, skriv i en kodeinje “struktur”Etterfulgt av typen. I dette tilfellet, Sockaddr_in Og så "Struct Name”Eller“* Strukturnavn”Å erklære pekeren. Syntaksen for å erklære en Sockaddr_in Struktur er som følger:

struct sockaddr_in *my_struct;

Hvordan sette portnummeret i en Sockaddr_in -struktur på C -språket

Portnummeret må spesifiseres i direkte binærform i SIN_PORT -medlemmet av strukturen. Derfor er det nødvendig å konvertere verdien til denne datatypen.

De htons () Funksjon brukes ofte til dette formålet. Den konverterer heltallverdien som er inneholdt i inngangsargumentet og returnerer verdien i direkte binært format til utdataene.

La oss deretter se hvordan vi skal tildele port 80 til Sin_port Medlem av den tidligere erklærte strukturen:

int port = 80;
my_struct.SIN_PORT = HTONS (port);

Hvordan angi IP -adressen i en Sockaddr_in -struktur på C -språket

IP -adresser er ikke kodet, noe som betyr at hvert av tallene i feltene deres er representert av dets binære ekvivalent. For å jobbe med dem, er det i visse tilfeller nødvendig å konvertere IP -adresser til strenger eller strenger til IP -adresser for å tilordne eller spørre disse verdiene i strukturene.

C -språket gir flere funksjoner for å konvertere strenger til adresser og lagre resultatet i visse strukturer.

De funksjon inet_pton () er en av de mest brukte til dette formålet. Det er definert i overskriften “inet.h”Og har tre inngangsargumenter. Den første må spesifisere adressefamilien som skal konvertere, i dette tilfellet AF _inet.

Det andre argumentet må være pekeren til en streng som spesifiserer IP -adressen, med hvert felt atskilt med en periode.

Det tredje argumentet for denne funksjonen må være pekeren til en type struktur Sockaddr_in der den konverterte adressen er lagret.

De inet_ntop () Funksjonen gjør den omvendte oppgaven, konverterer adressene som er lagret i en Sockaddr_in struktur i strenger.

Deretter vil vi se hvordan du skal tilordne en IP -adresse til My_struct Structure of the Sockaddr_in Skriv fra en streng, i dette tilfellet ADDR, ved hjelp av inet_pton () funksjon. Deretter bruker vi inet_ntop () funksjon for å konvertere adressen tilbake til strengen IP for å vise den i kommandokonsollen med printf ().

#inkludere
#inkludere
#inkludere
#inkludere
tomrom ()

char ip [inet_addrstrlen] = "";
char addr [200] = "192.168.1.1";
struct sockaddr_in *my_struct;
// konverterer streng til adressen.
inet_pton (af_inet, addr, & my_struct);
// konverterer adresse til streng.
inet_ntop (af_inet, & my_struct, ip, inet_addrstrlen);
printf ("\ n \ nip adresse: %s \ n \ n", ip);

Følgende bilde viser IP -adressen vi skaffet oss fra strengen addr. Deretter kom vi tilbake med den komplementære funksjonen inet_ntop () For å konvertere adressen som er lagret i my_struct inn i en streng for å vise den i kommandokonsollen.

Hvordan bestemme IP -adressen til et domene og lagre den i en Sockaddr_in -struktur på C -språket

For å koble deg til en vert, må du først kjenne adressen. Deretter, la oss se på hvordan vi kan få IP -adressen til en vert og lagre den i en Sockaddr_in struktur ved å bruke GethostByName () funksjon.

Denne funksjonen tar som det eneste inngangsargumentet en streng, eller en peker til den, som spesifiserer vertsnavnet hvis adresse skal bestemmes. Som et resultat, GethostByName () Returnerer en struktur av typen hostent med alle domenedata, inkludert IP -adressen.

Når vertsinformasjonen i den hostentstrukturen er hentet, kopieres den oppnådde adressen til Sockaddr_in struktur ved hjelp av bcopy () -funksjon.

Deretter ser vi koden der SOCADDR_IN og strukturer av hostent type er definert. De IP adresse til “www.Google.com”Er bestemt i den siste strukturen og kopiert til Sockaddr_in struktur. Deretter konverteres den bestemte adressen til en streng ved hjelp av inet_ntoa () og printf () funksjoner og vises i kommandokonsollen:

#inkludere
#inkludere
#inkludere
#inkludere
#inkludere
int main ()
struct sockaddr_in my_struct;
struktur Hostent *host_ent;
host_ent = gethostbyName ("www.Google.com ");
bcopy ((char *) host_ent-> h_addr, (char *) & my_struct.Sin_addr.S_addr,
sizeof (host_ent-> h_length));
printf ("IP -adresse: %s \ n", inet_ntoa (my_struct.sin_addr));

På denne måten har vi allerede lagret adressen til “www.Google.com”I strukturen av typen Sockaddr_in. Figuren nedenfor viser adressen til verten som er spesifisert i inngangsargumentet til GethostByName () funksjon.

Google.com har flere IP -adresser tilknyttet domenet, så resultatet av denne koden kan avvike fra resultatet av bildet.

Hvordan kaste en sockaddr -struktur med dataene fra en Sockaddr_in -struktur

De koble() Funksjon er den eneste funksjonen levert av C -språket for å etablere sokkelforbindelser. Denne funksjonen bruker strukturer av type Sockaddr For å spesifisere adressen som den vil koble til.

Strukturen som brukes av koble() Funksjonen har samme størrelse i byte som en struktur av typen Sockaddr_in men er forskjellig i datatype. Dette betyr at en struktur støpe må utføres for å bruke tilkoblingsdataene som er lagret i Sockaddr_in struktur i denne funksjonen.

Denne enkle operasjonen kan utføres med samme samtale til Connect () Funksjon I det andre inngangsargumentet, som vist nedenfor:

Connect (socket, (struct sockaddr *) & my_struct, sizeof (my_struct));

Konklusjon

I dette Linux hint artikkel, Vi forklarte alt du trenger å vite om å jobbe med strukturer av type Sockaddr_in. Vi så i detalj på typen og dataene hver av medlemsbutikkene.

Vi viste deg også hvordan du skal erklære denne typen strukturer og hvordan du bruker de nødvendige funksjonene for å få, konvertere og manipulere de forskjellige dataene som er lagret av hvert av medlemmene.

For flere artikler om C -språket og Linux -tipsene, bruk søkemotoren på nettstedet vårt.