Programiranje utičnica u C++

Programiranje Uticnica U C



Programiranje utičnica postalo je važan predmet u području računalnih mreža. Uključuje uspostavljanje veze između dva čvora, poslužitelja i klijenta kako bi međusobno komunicirali bez ikakvih prekida. Poslužitelj djeluje kao slušatelj u komunikacijskom kanalu i sluša klijenta na određenom portu na IP adresi. S druge strane, klijent djeluje kao komunikator u komunikacijskom kanalu. Klijent kontaktira poslužitelj kako bi uspostavio vezu i uspostavio kontakt s poslužiteljem. Cilj ovog članka je pružiti opsežan i detaljan vodič za programiranje utičnica u C++, pokrivajući osnove, predstavljajući praktične primjere i pružajući detaljno objašnjenje koda.

Uspostavljanje modela klijent-poslužitelj

Programiranje utičnica je proces koji gradi komunikacijski kanal između poslužitelja i klijenta pomoću utičnica. U sljedećem primjeru koda, klijent započinje kontakt s poslužiteljem, a poslužitelj je postavljen za prihvaćanje veza klijenta. Dopustite nam da razumijemo segmente koda poslužitelja i klijenta demonstrirajući njihovu jezgru koja radi unutar mrežne komunikacije. Slijedi kôd na strani poslužitelja. Pogledajmo prvo kôd, a zatim ga detaljno objasnimo, točku po točku.

1. Strana poslužitelja







Kod za poslužiteljsku stranu modela dan je u nastavku. Pogledajmo što se događa u kodu:



#include
#include
#include
#include

korištenjem imenski prostor std ;

#definiraj PORT 8080
#define MAX_BUF_SIZE 1024

int glavni ( ) {
int ser_socket, cli_socket ;
strukturirati sockaddr_in ser_adresa, cli_adresa ;
char buf [ MAX_BUF_SIZE ] = { 0 } ;

ako ( ( ser_socket = utičnica ( AF_INET, SOCK_STREAM, 0 ) ) == - 1 ) {
užas ( 'Greška u kreiranju utičnice' ) ;
Izlaz ( EXIT_FAILURE ) ;
}

ser_adresa. grijeh_obitelj = OF_INET ;
ser_adresa. sin_addr . s_addr = INADDR_ANY ;
ser_adresa. luka_grijeha = htons ( LUKA ) ;

ako ( vezati ( be_socket, ( strukturirati sockaddr * ) i ser_adresa, veličina ( ser_adresa ) ) == - 1 ) {
užas ( 'Neuspjeh u vezanju' ) ;
Izlaz ( EXIT_FAILURE ) ;
}

ako ( slušati ( be_socket, 3 ) == - 1 ) {
užas ( 'Nije uspjelo poslušati' ) ;
Izlaz ( EXIT_FAILURE ) ;
}

cout << 'Poslužitelj sluša na portu' << LUKA << '... \n ' ;

socklen_t cli_adresa_len = veličina ( cli_adresa ) ;
ako ( ( cli_socket = prihvatiti ( be_socket, ( strukturirati sockaddr * ) i cli_adresa, i cli_adresa_len ) ) == - 1 ) {
užas ( 'Nije uspjelo prihvatiti' ) ;
Izlaz ( EXIT_FAILURE ) ;
}

čitati ( cli_socket, buf, MAX_BUF_SIZE ) ;
cout << 'Klijentova poruka je: ' << buf << endl ;

poslati ( cli_socket, 'Poruka poslužitelja' , strlen ( 'Poruka poslužitelja' ) , 0 ) ;

Zatvoriti ( cli_socket ) ;
Zatvoriti ( ser_socket ) ;

povratak 0 ;
}

Navedeni primjer je poslužiteljski kod C++ programa. Ovaj kod radi za jednostavan TCP poslužitelj koji osluškuje veze na jednom specifičnom portu. Kada se veza uspješno stvori, poslužitelj će primiti poruku koju šalje klijent. Nakon toga ga ispisuje na konzoli i klijentu šalje odgovor. Razumijmo svaki red koda.



Program počinje uključivanjem biblioteka: “iostream” za standardne ulazno/izlazne definicije, “cstring” za funkcije rukovanja nizovima, “unistd.h” za omogućavanje pristupa API-ju operacijskog sustava POSIX i “arpa/inet.h” za obavljati internetske operacije. Naredba “#define PORT 8080” znači da definira broj porta 8080 na kojem će poslužitelj slušati. “#define MAX_BUF_SIZE 1024” znači maksimalnu veličinu međuspremnika za dolazne podatke koja je 1024.





U glavnoj funkciji inicijaliziraju se dvije varijable, “ser_socket” i “cli_socket”, koje predstavljaju i poslužitelja i klijenta. Ostale tri varijable koje su “sockaddr_in”, “ser_address” i “cli_address” tipa “struct” inicijalizirane su kao adresne strukture za poslužitelj i klijent. Nakon toga se inicijalizira međuspremnik pod nazivom “buf” koji pohranjuje podatke koji dolaze od klijenta.

Funkcija socket() u uvjetu 'if' stvara novu TCP utičnicu. AF_INET označava IPv4, SOCK_STREAM predstavlja pouzdanu TCP utičnicu usmjerenu na vezu, posljednji argument koji je 0 daje se za odabir zadanog TCP protokola, INADDR_ANY prihvaća veze na bilo kojoj IP adresi, a htons (PORT) pretvara broj porta iz redoslijed bajtova hosta u mrežni poredak bajtova.



Budući da je sve ispravno definirano, sljedeći korak je postavljanje poslužitelja kao popisivača na danom portu i prihvaćanje veza na bilo kojem mrežnom sučelju. Utičnica se daje s informacijama u “ser_address” metodom bind(). Ispisujemo pogrešku i završavamo proces ako uvezivanje ne uspije. Funkcija accept() otvara novi socket za vezu s klijentom, dok funkcija listen() upućuje poslužitelj da čeka na dolazne veze. Ako funkcija accept() ne uspije, ispisuje se poruka o pogrešci i funkcija će izaći.

Zatim poslužitelj čita poruku klijenta s funkcijom read() u međuspremnik 'buf' i zatim je ispisuje na konzolu. Poslužitelj koristi funkciju send() za slanje poruke kao odgovor klijentu. Na kraju, korištenjem close(), poslužitelj zatvara klijentov socket, prekidajući program tako da su sve veze ispravno zatvorene i da ne postoji vjerojatnost povrede podataka.

2. Strana klijenta

Sada, da vidimo što se događa u modelu klijenta:

#include
#include
#include
#include

#definiraj PORT 8080
#define SERVER_IP '127.0.0.1'

int glavni ( ) {
int cli_socket ;
strukturirati sockaddr_in ser_adresa ;
konst char * poruka = 'Klijent šalje pozdrav!' ;

ako ( ( cli_socket = utičnica ( AF_INET, SOCK_STREAM, 0 ) ) == - 1 ) {
užas ( 'Greška u stvaranju utičnice' ) ;
Izlaz ( EXIT_FAILURE ) ;
}

ser_adresa. grijeh_obitelj = OF_INET ;
ser_adresa. luka_grijeha = htons ( LUKA ) ;

ako ( inet_pton ( AF_INET, SERVER_IP, i ser_adresa. sin_addr ) <= 0 ) {
užas ( 'Pogrešna adresa' ) ;
Izlaz ( EXIT_FAILURE ) ;
}

ako ( Spojiti ( cli_socket, ( strukturirati sockaddr * ) i ser_adresa, veličina ( ser_adresa ) ) == - 1 ) {
užas ( 'Kvar veze' ) ;
Izlaz ( EXIT_FAILURE ) ;
}
poslati ( cli_socket, poruka, strlen ( poruka ) , 0 ) ;

char buf [ 1024 ] = { 0 } ;
čitati ( cli_socket, buf, veličina ( buf ) ) ;
std :: cout << 'Odgovor poslužitelja: ' << buf << std :: endl ;

Zatvoriti ( cli_socket ) ;
povratak 0 ;
}

Pogledajmo svaki redak koda da bismo razumjeli kako program radi.

Iste četiri biblioteke – iostream, cstring, unistd.h i arpa/inet.h – također su uključene na strani klijenta. Broj priključka je također definiran zajedno s IP adresom lokalnog glavnog računala 127.0.0.1. Daje se poruka koja se mora isporučiti poslužitelju. Klijent i poslužitelj trebaju uspostaviti vezu kao sljedeći korak:

“if ((client_socket = socket(AF_INET, SOCK_STREAM, 0)) == -1);” stvara utičnicu za IPv4 s vrstom toka i zadanim protokolom TCP. Perror() ispisuje pojedinosti pogreške ako funkcija socket() ne uspije uspostaviti vezu i izlazi iz programa.

'server_address.sin_port = htons(PORT);' postavlja broj priključka nakon pretvorbe u mrežni poredak bajtova. Nakon toga, ovdje se daje još jedna poruka o neuspjehu, a to je 'Pogrešna adresa' koja se ispisuje ako nešto nije u redu s adresom. Lociranjem adrese u “ser_address”, klijent će se spojiti na poslužitelj. Ako veza ne uspije, ispisuju se detalji pogreške. Funkcija send() će prenijeti poruku na poslužitelj, osiguravajući da ne sadrži nikakvu oznaku.

Za primanje i pohranjivanje odgovora od poslužitelja, inicijalizira se međuspremnik pod nazivom 'buf' tipa 'char'. Funkcija read() čita odgovor poslužitelja u međuspremnik. Na kraju se odgovor poslužitelja ispisuje na konzoli. Konačno, veza se zatvara korištenjem close() naredbe za prekid utičnice. Sljedeći je izlaz programa:

Zaključak

Programiranje utičnica važan je dio mrežne komunikacije u računalnoj znanosti. Omogućuje razvoj aplikacija koje mogu komunicirati preko mreže, omogućujući širok raspon mogućnosti od jednostavnih arhitektura klijent-poslužitelj do strukturiranih distribuiranih sustava. Kada se socket kreira u kontekstu programiranja, program mora konfigurirati njegove karakteristike krajnje točke kao što su protokoli, TCP ili UDP i mrežnu adresu kao što su IP adresa i broj porta. Ove utičnice omogućuju poslužiteljima slanje i primanje podataka. Ovaj članak pokazuje praktičan primjer kako funkcionira model klijent-poslužitelj u programiranju utičnica.