C Connect Funksjonssystemanrop

C Connect Funksjonssystemanrop

På C-språket krever det å etablere en klient-serverforbindelse gjennom en stikkontakt flere trinn og funksjoner. Noen av disse brukes til å hente data fra serveren du vil koble til, andre brukes til å lage kontakten eller konvertere adresser.

Selv om det ikke er noen spesiell orden, må denne serien med trinn og funksjonssamtaler gjøres i en rekkefølge fordi resultatene deres brukes i inngangsargumentene til den påfølgende funksjonen.

I dette Linux hint artikkel, du lærer hvordan du bruker koble() funksjon og lag en stikkontakt fra bunnen av for å koble eksternt til en server.

Vi begynner med en beskrivelse av syntaksen, inngangs- og utgangsargumentene som utgjør denne funksjonen, og en teoretisk forklaring av hvordan den fungerer. Deretter vil vi se på et eksempel som viser trinn-for-trinn-prosess for hvordan du lager og kobler til en stikkontakt.

Siden bruk av denne funksjonen krever kunnskap om datastrukturene som utgjør inngangsargumentene, vil vi i en spesiell seksjon se på dens sammensetning, datatypen til medlemmene og parametrene som definerer den i hver.

Syntaks for Connect () -funksjonen på C -språk

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

Beskrivelse av tilkoblingsfunksjonen på C -språk

Connect () -funksjonen etablerer tilkoblingen til en stikkontakt mellom en klient og en server.

Denne funksjonen kobler stikkontakten, hvis deskriptor er SOCKFD, til serveren og hvis adresse er lagret i Serv_addr -strukturen, som har en lengde på addrlen.

Hvis forbindelsen er vellykket, returnerer Connect () 0 som resultat og hvis tilkoblingen ikke kunne etableres, -1.

Nedenfor er en detaljert beskrivelse av hvert inngangsargument og dens formål i Connect () -funksjonen.

SOCKFD: Dette er et heltall med socketbeskrivelsen. Denne beskrivelsen er resultatet som returneres av socket () -funksjonen og brukes til å koble til, sende og motta data fra serveren.

serv_addr: Dette er pekeren til en struktur av typen sockaddr som lagrer adressen til serveren å koble til.

addrlen: Dette er størrelsen på matrisemedlemmet sa_data av strukturen Sockaddr, hvor adressen, portnummeret osv. lagres.

Trinn før du kaller Connect () -funksjonen for å koble til en server.

Oppfordringen til Connect () -funksjonen er den siste av en serie trinn som er nødvendig for å etablere en vellykket forbindelse. Disse trinnene består av. Vi forklarer i fem trinn hvordan du oppretter en stikkontakt og kobler den til en server ved hjelp av Connect () -funksjonen.

Hvordan lage, konfigurere og koble til et stikkontakt trinn for trinn fra bunnen av på C -språket

Trinn 1: I det første trinnet vil vi inkludere følgende overskrifter og definere følgende variabler:

#inkludere
#inkludere
#inkludere
#inkludere
#inkludere
#inkludere
#inkludere
#inkludere
int socket_id;
int port = 80;
Int feil;
Char Buffer [1025);

Heltallet socket_id er identifikatoren til stikkontakten som en tilkobling blir opprettet gjennom og som data sendes og mottas. Variabelen havn Angir portnummeret på kontakten. I dette tilfellet 80 for service HTTP og heltall feil brukes til å oppdage feil i de forskjellige funksjonene.

Deretter vil vi definere pekeren til en struktur av typen Hostent navngitt server og en av typen Sockaddr_in navngitt klient. Disse strukturene lagrer informasjon som IP -adresser, tilkoblingstype osv. De av typen hostent lagrer serverinformasjonen, mens de av typen SOCKADRR_IN Lagre tilkoblingsdata. Vi bruker memcpy () -funksjonen for å fjerne alle dataene i den vertsstrukturen.

Struktur Hostent *Server;
struct Sockaddr_in Client;
memcpy (& server, 0, sizeof (server));

Steg 2: Når vertsstrukturen er definert, er neste trinn å bestemme IP -adressen til vertsnavnet vi ønsker å koble til. For dette gir C flere funksjoner som kan løse en adresse. I dette eksemplet vil vi bruke GethostByName (). Denne funksjonen returnerer en Hostent struktur med domenedataene som er gitt i inngangsargumentet som en streng eller en peker til det. De hvis Tilstanden vil bryte forbindelsen i tilfelle en feil, for eksempel et ikke-eksisterende domenenavn.

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

printf ("\ nerror får domenedata.\ n ");
retur 1;

Trinn 3: Lag en stikkontakt SOCKket_ID og få identifikatoren. Socket () -funksjonen returnerer identifikatoren til den opprettede stikkontakten basert på adressefamilien, typen og tilkoblingsprotokollen. I dette tilfellet, AF _inet, Sock _Stream for en IP4- og TCP -tilkobling.

socket_id = socket (af_inet, sock_stream, 0);

Trinn 4: Angi tilkoblingskonfigurasjonen i Sockaddr_in struktur. For å gjøre dette, få tilgang til medlemmene og tilordne dem verdier for å spesifisere tjeneste- og adressefamilien. Portnummeret er spesifisert i direkte binært format og må derfor konverteres ved hjelp av Htons () -funksjonen.

I dette eksemplet skal vi sette AF_inet i SIN_FAMILY felt for IPv4 -adresser og i Sin_port Vi tildeler port 80 for "HTTP" -tjenesten.

klient.sin_family = af_inet;
klient.SIN_PORT = HTONS (port);

Trinn 5: Neste trinn er å kopiere adressen fra server struktur til klient struktur som skal brukes som tilkoblingsadresse for kontakten. En måte å gjøre dette på er å bruke BCOPY () -funksjonen som følger:

bcopy ((char *) server-> h_addr,
(char *) & klient.Sin_addr.S_addr,
sizeof (server-> h_length));

Kopier adressen til strukturen Sockaddr, som brukes av Connect () -funksjonen som inngangsargument for serv_addr.

Vi gjør dette av en støpe av strukturer og for å lagre kodelinjer. Vi vil gjøre dette i samtalen til Connect () -funksjonen i inngangsargumentet serv_addr.

Nedenfor kan du se hvordan du riktig konverterer informasjonen til klient struktur:

(Struct Sockaddr *) & Client, SizeOf (Client))

Neste, ring Connect () -funksjonen og pass identifikatoren socket_id Som det første argumentet. Som det andre argumentet, Sockaddr struktur og til slutt størrelsen på strukturen.

Heltallet feil sendes som inngangsargumentet, som vi bruker for å sjekke om forbindelsen var vellykket. Følgende utdrag viser hvordan du kaller Connect () -funksjonen og sjekk om det var vellykket:

Feil = Connect (Socket_id, (struct Sockaddr *) & Client, sizeof (client));
If (feil h_addr,
(char *) & klient.Sin_addr.S_addr,
sizeof (server-> h_length));
Feil = Connect (Socket_id, (struct Sockaddr *) & Client, sizeof (client));
hvis (feil <0)
printf ("\ ncould ikke etablere forbindelse til serveren \ n");
lukk (socket_id);
retur 1;

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

Bildet viser sammenstilling og utførelse av koden der den kobles til "www.Google.com "server. Denne koden etablerer tilkoblingen og lukker deretter applikasjonen ved å koble fra.

Følgende utdrag bruker Fgets () -funksjonene for å legge inn strenger via kommandokonsollen og Send () og Recv () -funksjonene for å sende HTTP -kommandoer til serveren og motta svaret:

mens (1)
printf ("For å avslutte trykk Ctrl+c \ nsend http -kommando:");
fgets (buffer, 1025, stdin);
send (socket_id, buffer, 1025, 0);
memset (& buffer, '\ 0', 1025);
RECV (socket_id, buffer, 1025, 0);
printf ("%s", buffer);
memset (& buffer, '\ 0', 1025);

Bildet vi ser nedenfor viser utførelsen av den komplette koden med sending av HTTP “Get” -kommandoen og svaret fra serveren:

Sockaddr_in -strukturen

Strukturer av type Sockaddr_in lagre konfigurasjonen av tilkoblingstypen og adressen. Medlemmene deres brukes til å spesifisere familien, adressen som skal brukes og portnummeret.

Nedenfor kan du se denne strukturtypen sammen med en detaljert liste over hvert medlem:

struct Sockaddr_in

kort int sin_family;
usignert kort int sin_port;
struct in_addr SIN_ADDR;
usignert char sin_zero [8];
;

SIN_FAMILY: Dette heltallet spesifiserer et av familiealternativene som skal returneres av serveren. Adressefamiliealternativene er:

Af_inet for IPv4 -adresser.

Af_inet6 for IPv6 -adresser.

Sin_port: Angir portnummeret til tjenesten som skal brukes.

Sin_addr: Dette er forkortelsen for internettadresse. Dette er en struktur av type in_addr der internettadressen er lagret.

Sin_zero: Dette er en rekke 8 usignerte tegn med verdien 0, som fungerer som polstring for å kompensere for 14 byte -størrelsen på sockaddr -strukturen.

Den hostente strukturen

Denne typen struktur lagrer nyttige data levert av serveren når en spørring er laget med funksjoner som Gethostbynam (). Disse prequeries for socket Connection løser adresser og returneringsinformasjon som domenenavnet, adressefamilien og en liste over adresser hvis mer enn en eksisterer. Nedenfor kan du se denne strukturen sammen med en detaljert beskrivelse av hvert element:

struktur 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: Dette er en peker til en streng med domenenavnet som den ble spurt.

H_aliases: Dette er en liste over alternative navn.

h_addrtype: Dette medlemmet spesifiserer adressefamilien som det ble spurt.

H_Lengde: Dette spesifiserer størrelsen på adressen.

h_addr_list: Dette er pekeren til en liste over adressepekere. Hvis serveren returnerer mer enn én adresse for det spørte navnet, er hver tilgang til via denne listepekeren.

H_addr : Denne strukturen definerer H_addr som en peker til den første adressen i h_addr_list, Så tilgang er gjennom denne definisjonen.

Konklusjon

I dette Linux hint artikkel, vi forklarte alt om koble() funksjon på C -språket.

Vi så på syntaks for denne funksjonen, så vel som hvilke typer argumenter og strukturer den bruker i inngangene. Vi har også forklart trinn for trinn hvordan du oppretter en stikkontakt og kobler til en ekstern server ved hjelp av denne funksjonen.

For at du skal ha en dypere kunnskap om stikkontakter på dette språket, har vi laget en spesiell seksjon som forklarer strukturene som brukes av sokkelfunksjoner, og beskriver hvert av medlemmene deres funksjonen de utfører i inngangsargumentene til de forskjellige funksjonene.