logo

Soketové programovanie v C/C++

V dnešnom svete zohrávajú počítačové siete dôležitú úlohu v oblasti prenosu dát. Je to téma, ktorú by mal poznať každý programátor. V rámci počítačovej siete je programovanie zásuviek jednou z najdôležitejších tém vo svete programovania. V tejto téme sa zaoberáme programovaním soketov a rôznymi metódami programovania soketov, ktoré sú implementované v C++.

V C++ je programovanie soketov metóda, ktorá kombinuje dva alebo viac uzlov navzájom cez sieť, takže uzly môžu zdieľať údaje bez akejkoľvek straty údajov. V tomto spojení jeden uzol počúva jeden port, ktorý je pripojený k určitej IP adrese. Keď klient dosiahne server, server vytvorí načúvač soketu.

Čo je to zásuvka?

Poďme pochopiť zásuvku na príklade v reálnom čase. Zásuvka je typ média, ktoré poskytuje spojenie medzi dvoma zariadeniami. Zásuvka môže byť buď nabíjačka telefónu, ktorá poskytuje spojenie medzi zásuvkou a telefónom, alebo telefónom a daným notebookom. Pomocou zásuvky sú k lokálnej sieti pripojené rôzne aplikácie s rôznymi portami. Zakaždým, keď je vytvorený soket, server špecifikuje program a tento program špecifikuje soket a adresu domény.

Zásuvka je typ mechanizmu, ktorý sa používa na výmenu údajov medzi rôznymi procesmi. Tu sú tieto procesy prítomné buď v rôznych zariadeniach, alebo v tom istom zariadení, ktoré sú pripojené cez sieť. Po vytvorení pripojenia pre soket je možné odosielať údaje oboma smermi a pokračovať, kým jeden z koncových bodov neuzavrie spojenie.

Soketové programovanie v C/C++

Postup v komunikácii klient-server

Existuje niekoľko postupov, ktoré musíme dodržiavať, aby sme nadviazali komunikáciu medzi klientom a serverom. Tie sú nasledovné.

    Zásuvka:Pomocou zásuvky môžeme vytvoriť novú komunikáciu.Zviazať:Pomocou toho môžeme pripojiť lokálnu adresu so soketom.Počúvaj:S touto pomocou; môžeme akceptovať spojenie.Súhlasiť:S touto pomocou; môžeme blokovať prichádzajúce spojenie, kým nepríde požiadavka.Pripojiť:S touto pomocou; môžeme sa pokúsiť nadviazať spojenie.Odoslať:S pomocou tohto; môžeme posielať dáta cez sieť.Prijať:S touto pomocou; môžeme prijímať dáta cez sieť.Zavrieť:Pomocou toho môžeme uvoľniť spojenie zo siete.

Fázy vytvorenia serverového soketu

Existuje niekoľko fáz, pomocou ktorých môžeme vytvoriť soket pre server. Tie sú nasledovné.

    int socketcr:Socket (doména, typ, protokol)Socketcr:Je to celočíselný typ a je ako obslužný program súboru.doména:Je to komunikačná doména a je to celočíselný typ.Typ:Je to komunikačný typ.SOCK_DGRAM:Je to typ UDP, ktorý je nespoľahlivý a bez spojenia.Protokol:Používa sa na priradenie hodnoty protokolu pre adresu IP, ktorá je 0. Hodnota protokolu je podobná hodnote zobrazenej v poli protokolu v hlavičke IP vrecka.

Čo je to spojenie?

Spojenie je typ vzťahu medzi dvoma strojmi, kde sú dva softvéry o sebe známe. Tieto dva softvéry vedia, ako nadviazať vzájomné spojenie; inými slovami, môžeme povedať, že tieto dva softvéry vedia posielať bity cez sieť. Spojenie soketu znamená, že dva stroje by mali poznať všetky informácie medzi sebou, ako je telefónne číslo, IP adresa a TCP port.

Soket je typ objektu, ktorý je podobný súboru, ktorý umožňuje programu akceptovať prichádzajúce pripojenie a umožniť mu odosielať alebo prijímať prichádzajúce pripojenie. Je to tiež typ zdroja priradeného k procesu servera.

Server môže vytvoriť soket pomocou funkcie socket(). Tento socket nie je možné zdieľať so žiadnym iným procesorom.

    Setsockopt:Pomocou Setsockopt môžeme manipulovať s rôznymi možnosťami soketu, na ktoré odkazuje deskriptor súboru soketu. Tento proces je úplne voliteľný. S pomocou Setsockopt môžeme opätovne použiť port a adresu klienta a servera. Keď server zobrazí chybu „adresa sa už používa“, môžeme tomu zabrániť pomocou Setsockopt.Zviazať:Soket s adresou a portom môžeme zviazať pomocou funkcie bind. Táto operácia sa vykoná po vytvorení zásuvky. Napríklad, ak sa pokúsime spojiť server s lokálnym hostiteľom, potom použijeme INADDR_ANY na definovanie IP adresy servera.Počúvaj:Pomocou funkcie počúvania () môžeme vytvoriť zásuvku režimu pripojenia. Príkladom zásuvky režimu pripojenia je SOCK_STREAM. To môže byť definované argumentom socket. Používa sa na prijatie prichádzajúceho pripojenia, vykonanie operácie frontu pre prichádzajúce pripojenie a vykonanie nevybavených prichádzajúcich pripojení. Keď prichádzajúce spojenie požiada server o potvrdenie, soket sa prepne do pasívneho režimu. Parameter backlog servera odkazuje na skutočnosť, že nemôže povoliť viac ako jedno pripojenie k serveru naraz. Ak prišlo nejaké prichádzajúce spojenie a front je plný, server zobrazí chybu s označením „ECONNREFUSED“. Pomocou funkcie listen() je prichádzajúce spojenie podržané a keď je front prázdny, zavolá všetky prichádzajúce spojenia na server.Súhlasiť:S pomocou systémového volania accept(); môžeme vytvoriť zásuvku založenú na pripojení. Niektoré zásuvky založené na pripojení sú SOCK_STREAM a SOCK_SEQPACKET. Extrahuje všetky prichádzajúce pripojenia, ktoré prichádzajú ako prvé, a umožňuje ich požiadavku prejsť na server. Novo pripojený zoznam nie je schopný počúvať pomocou iného argumentu pre vytvorenie nového soketu.

Etapy pre klienta

    Zásuvkové pripojenie:Je to úplne rovnaké ako pri vytváraní servera.Pripojiť:Spojenie so soketom môžeme iniciovať pomocou systémového volania connect(). Ak je parameter pre socket typ SOCK_DGRAM, potom môžeme pomocou connect() definovať datagram ako trvalý. Ak je soket typu SOCK_STREAM, môžeme sa pokúsiť vytvoriť ďalšie pripojenie pre server. Pomocou funkcie connect() môžeme vytvoriť spojenie aj pre zahraničnú asociáciu. Ak je soket neviazaný, systém priradí jedinečnú hodnotu lokálnemu priradeniu. Po úspešnom dokončení volaní systému je soket pripravený na odosielanie alebo prijímanie akéhokoľvek typu údajov.Odoslať/prijať:Funkcie send() a recv() môžu vykonávať nižšie uvedené operácie.
  • Zásuvka, na ktorej je možné navzájom komunikovať.
  • Pamäťová vyrovnávacia pamäť môže uchovávať údaje o adrese, ako napríklad addr_of_data a addr_of_buffer.
  • Zaoberá sa veľkosťou vyrovnávacej pamäte, napríklad len_of_data a len_of_buffer.
  • Zaoberá sa príznakom, ktorý hovorí, ako sa budú údaje odosielať.

Kroky na vytvorenie pripojenia v zásuvke

Vytvára spojenie medzi rôznymi klientmi a serverom. Ale klient aj server môžu zvládnuť pripojenie soketu. Každý proces musí vytvoriť spojenie pre svoj vlastný soket.

Kroky potrebné na vytvorenie soketu na strane klienta sú nasledovné:

  • Vytvára soket pomocou systémového volania socket().
  • Potom sa musíme spojiť s adresou soketu servera pomocou volania system().
  • Potom musíme odosielať a prijímať údaje. Môžeme to urobiť rôznymi spôsobmi. môžeme urobiť túto funkciu read() a write().

Kroky potrebné na vytvorenie soketu na strane servera sú nasledovné:

  • Najprv vytvorí soket pomocou systémového volania socket().
  • Potom naviaže soket na adresu pomocou systémového volania bind(). Adresa pozostáva z čísla portu pre serverový soket v hostiteľskom počítači.
  • Potom počúva spojenie pomocou systémového volania počúvania ().
  • Potom server akceptuje prichádzajúce spojenie pomocou systémového volania accept(). Blokuje tiež všetky prichádzajúce príkazy, kým sa klient nepripojí k serveru.
  • Potom sa spustí proces odosielania a prijímania údajov.

Pripojenie viacerých klientov bez multithreadingu

Existujú rôzne príklady, v ktorých vidíme, ako sa jeden používateľ môže pripojiť k serveru. V dnešnom svete programovania je k serveru pripojených viacero používateľov s rôznymi zásuvkami.

Existujú rôzne spôsoby, ako to dosiahnuť. Jedným z nich je multithreading. Pomocou multithreadingu to môžeme dosiahnuť. Viacvláknový proces môžeme implementovať pomocou funkcie select().

Príklad:

Kód pre klienta:

 // Client side C/C++ program to demonstrate Socket // programming #include #include #include #include #include #define PORT 8080 int main(int argc, char const* argv[]) { int sock = 0, valread, client_fd; struct sockaddr_in serv_addr; char* hello = &apos;Hello from client&apos;; char buffer[1024] = { 0 }; if ((sock = socket(AF_INET, SOCK_STREAM, 0)) <0) 0 8080 { printf('
 socket creation error 
'); return -1; } serv_addr.sin_family="AF_INET;" serv_addr.sin_port="htons(PORT);" convert ipv4 and ipv6 addresses from text to binary form if (inet_pton(af_inet, '127.0.0.1', &serv_addr.sin_addr) <="0)" printf( '
invalid address not supported ((client_fd="connect(sock," (struct sockaddr*)&serv_addr, sizeof(serv_addr))) 0) printf('
connection failed send(sock, hello, strlen(hello), 0); printf('hello message sent
'); valread="read(sock," buffer, 1024); printf('%s
', buffer); closing the connected close(client_fd); 0; code for server: server side c c++ program demonstrate programming #include #define port int main(int argc, char const* argv[]) server_fd, new_socket, valread; struct sockaddr_in address; opt="1;" addrlen="sizeof(address);" buffer[1024]="{" }; char* hello="Hello from server" ; creating file descriptor ((server_fd="socket(AF_INET," sock_stream, 0)) perror('socket failed'); exit(exit_failure); forcefully attaching (setsockopt(server_fd, sol_socket, so_reuseaddr | so_reuseport, &opt, sizeof(opt))) perror('setsockopt'); address.sin_family="AF_INET;" address.sin_addr.s_addr="INADDR_ANY;" address.sin_port="htons(PORT);" (bind(server_fd, sockaddr*)&address, sizeof(address)) perror('bind (listen(server_fd, 3) perror('listen'); ((new_socket="accept(server_fd," (socklen_t*)&addrlen)) perror('accept'); send(new_socket, close(new_socket); listening shutdown(server_fd, shut_rdwr); pre> <p> <strong>Compiling:</strong> </p> <img src="//techcodeview.com/img/c-tutorial/33/socket-programming-c-c-2.webp" alt="Socket Programming in C/C++"> <p> <strong>Output:</strong> </p> <img src="//techcodeview.com/img/c-tutorial/33/socket-programming-c-c-3.webp" alt="Socket Programming in C/C++"> <h2>Uses of Socket Programming</h2> <p>Socket programs are used to communicate between various processes, usually running on different systems. It is mostly used to create a client-server environment. This post provides the various functions used to create the server and client program and an example program.</p> <p>In the example, the client program sends a file name to the server, and the server sends the contents of the file back to the client. Socket programming usually pertains to basic communication protocols like TCP/UDP and raw sockets like ICMP. These protocols have a small communication overhead when compared to underlying protocols such as HTTP/DHCP/SMTP etc.</p> <p> <strong>Some of the basic data communications between the client and server are:</strong> </p> <ul> <li>File Transfer: Sends name and gets a file.</li> <li>Web Page: Sends URL and gets a page.</li> <li>Echo: Sends a message and gets it back.</li> </ul> <h2>Disadvantages</h2> <ul> <li>C++ can establish communication only with the machine requested and not with any other machine on the network.</li> <li>Sockets allow only raw data to be sent. This means that the client and server need mechanisms to interpret the data.</li> </ul> <hr></0)>