Un socket POSIX sau pur și simplu un socket este definit ca un punct final de comunicare. De exemplu, dacă două părți, A și B, intenționează să comunice între ele, atunci va fi necesar ca ambele părți să stabilească o conexiune între punctele lor finale respective. O priză oferă părților care comunică un gateway prin care călătoresc mesajele. Dacă vorbim în termeni de client și server, atunci socket-ul de pe server va fi să asculte conexiunile primite, în timp ce socket-ul de pe client va fi responsabil pentru conectarea la socket-ul de pe server. Acest articol este destinat să facă conceptul de soclu POSIX cu programare C mult mai clar.
Exemplu de utilizare a socketului Posix cu programarea C în Linux Mint 20
Exemplul prezentat în această secțiune va demonstra o interacțiune între un client și un server. Clientul și serverul sunt cele două entități principale ale modelului client / server din lumea computerelor. În exemplul nostru, atât clientul, cât și serverul vor trimite și primi mesaje către și de la celălalt în timp ce utilizează POSIX Socket cu programare C în Linux Mint 20. Pentru a aduce claritate în înțelegerea codului, am separat codul din partea clientului și codul din partea serverului și vă vom explica ambele separat separat mai jos.
Codul de pe partea serverului
Pentru codul din partea serverului, am creat pur și simplu un document gol în Directorul principal al sistemului nostru Linux Mint 20 și l-am numit server.c. În acel document gol, trebuie să scrieți fragmentele de cod afișate în cele trei imagini de mai jos:
Codul afișat în imaginile de mai sus poate părea lung, totuși, să încercăm să-l înțelegem într-un mod extrem de ușor. În primul rând, am creat un soclu și l-am atașat cu numărul de port dorit, care în cazul nostru este 8080. Apoi am scris o funcție de ascultare, care este acolo pentru a căuta toate conexiunile primite de la clienți. Practic, clientul reușește să se conecteze la server doar datorită prezenței acestei funcții de ascultare. Și odată ce această conexiune este stabilită, serverul este setat să trimită și să primească date către și de la client.
Funcțiile de citire și trimitere servesc scopurilor de a primi și a trimite mesaje clienților, respectiv. Am definit deja un cod implicit în codul nostru pe care intenționăm să îl trimitem clientului nostru și care este „Bună ziua de la server”. După trimiterea acestui mesaj către client, acesta va fi afișat în partea clientului, în timp ce un mesaj care spune „Bună ziua a fost trimis” va fi afișat pe partea serverului. Aici este vorba despre codul nostru de pe server.
Codul parte client
Acum, pentru codul client, din nou, am creat un document gol în Directorul principal al sistemului nostru Linux Mint 20 și l-am numit client.c. În acel document gol, trebuie să scrieți fragmentele de cod afișate în cele două imagini de mai jos:
În codul din partea clientului prezentat în imaginile de mai sus, am creat un socket în același mod ca și pentru codul din partea serverului. Apoi, există o funcție de conectare care va încerca să facă o conexiune cu serverul prin portul specificat. Și odată ce această conexiune este acceptată de server, clientul și serverul vor fi setate să trimită și să primească mesaje către și de la celălalt.
Din nou, la fel ca codul din partea serverului, funcțiile de trimitere și citire sunt acolo pentru a trimite și primi mesaje de la server, respectiv. De asemenea, am menționat un mesaj implicit pe care dorim să îl trimitem la server și care este „Bună ziua de la client”. După trimiterea acestui mesaj către server, acest mesaj va fi afișat pe partea serverului, în timp ce pe partea clientului va fi afișat un mesaj care spune „Bună ziua mesajul trimis”. Și acest lucru ne aduce la sfârșitul explicației codului nostru din partea clientului.
Compilarea și rularea codurilor client și server
Evident, vom salva atât fișierele noastre client, cât și cele de pe server, după ce am scris aceste programe, apoi vom fi pregătiți să compilăm și să rulăm aceste coduri. Prin urmare, vom putea vizualiza interacțiunea dintre clientul nou creat și server. Pentru a atinge acest obiectiv, trebuie să lansăm două terminale diferite, deoarece ar trebui să rulăm două programe separate. Un terminal va fi dedicat executării codului de pe partea serverului, iar celălalt pentru codul de pe partea clientului.
Deci, pentru a compila codul nostru de pe server, vom executa următoarea comandă în primul terminal:
server $ gcc.server c -oDupă executarea acestei comenzi, dacă nu vor exista erori în codul dvs. de pe server, atunci nimic nu va fi afișat pe terminal, ceea ce va fi o indicație a unei compilări reușite.
În același mod, vom compila codul din partea clientului cu comanda prezentată mai jos, executându-l în al doilea terminal:
client $ gcc.c -o client
Odată ce ambele coduri sunt compilate, le vom rula unul câte unul. Cu toate acestea, trebuie să rulăm mai întâi codul de pe server, deoarece acesta ar trebui să asculte cererile de conexiune. Codul de pe server poate fi rulat cu următoarea comandă:
$ ./Server
După rularea codului de pe server, putem rula codul de pe partea de client cu comanda prezentată mai jos:
$ ./client
Odată ce atât clientul, cât și serverul vor fi în funcțiune, veți fi martori la ieșirile afișate în următoarele imagini de pe ambele terminale:
Concluzie
Sperăm că, după ce ați parcurs exemplul împărtășit cu dvs. în acest articol, veți putea utiliza soclurile POSIX eficient pentru trimiterea și primirea de date între un client și un server. Acest exemplu este doar o demonstrație de bază a soclurilor Posix cu programare C, cu toate acestea, puteți chiar să faceți aceste programe mai complexe conform cerințelor dvs.