logo

Socket programmēšana C/C++

Mūsdienu pasaulē datortīkliem ir liela nozīme datu pārraides jomā. Tas ir priekšmets, kas jāzina katram programmētājam. Datortīklā ligzdas programmēšana ir viena no svarīgākajām tēmām programmēšanas pasaulē. Šajā tēmā mēs runājam par ligzdu programmēšanu un atšķirīgo ligzdu programmēšanas metodi, kas tiek ieviesta C++.

C++ valodā ligzdu programmēšana ir metode, kas tīklā apvieno divus vai vairākus mezglus, lai mezgli varētu koplietot datus, nezaudējot datus. Šajā sakarā viens mezgls klausās vienu portu, kas ir savienots ar noteiktu IP adresi. Kad klients sasniedz serveri, serveris izveido ligzdas klausītāju.

Kas ir ligzda?

Sapratīsim par kontaktligzdu, runājot reāllaika piemēru. Kontaktligzda ir datu nesēja veids, kas nodrošina savienojumu starp divām ierīcēm. Kontaktligzda var būt vai nu tālruņa lādētājs, kas nodrošina savienojumu starp ligzdu un tālruni vai tālruni un šo klēpjdatoru. Ar ligzdas palīdzību lokālajam tīklam tiek pievienotas dažādas lietojumprogrammas ar dažādiem portiem. Katru reizi, kad tiek izveidota ligzda, serveris norāda programmu, un šī programma norāda ligzdu un domēna adresi.

java rakstzīme uz virkni

Socket ir mehānisma veids, ko izmanto datu apmaiņai starp dažādiem procesiem. Šeit šie procesi notiek dažādās ierīcēs vai tajā pašā ierīcē, kas ir savienota tīklā. Kad savienojums ligzdai ir izveidots, datus var nosūtīt abos virzienos un turpināt, līdz viens no gala punktiem aizver savienojumu.

Socket programmēšana C/C++

Klienta un servera komunikācijas procedūra

Ir dažas procedūras, kas mums jāievēro, lai izveidotu klienta un servera saziņu. Tie ir šādi.

    Kontaktligzda:Ar kontaktligzdas palīdzību varam izveidot jaunu komunikāciju.Saistīt:Ar tā palīdzību mēs varam pievienot vietējo adresi ar ligzdu.Klausieties:Ar šo palīdzību; mēs varam pieņemt savienojumu.Pieņemt:Ar šo palīdzību; mēs varam bloķēt ienākošo savienojumu, līdz tiek saņemts pieprasījums.Savienot:Ar šo palīdzību; mēs varam mēģināt izveidot savienojumu.Sūtīt:Ar šo palīdzību; mēs varam nosūtīt datus pa tīklu.Saņemt:Ar šo palīdzību; mēs varam saņemt datus tīklā.Aizvērt:Ar tā palīdzību mēs varam atbrīvot savienojumu no tīkla.

Servera ligzdas izveides posmi

Ir daži posmi, kuros mēs varam izveidot servera ligzdu. Tie ir šādi.

    int socketcr:Socket (domēns, tips, protokols)Socketcr:Tas ir vesela skaitļa tips, un tas ir kā failu apstrādātājs.Domēns:Tas ir saziņas domēns, un tas ir vesela skaitļa veids.Veids:Tas ir komunikācijas veids.SOCK_DGRAM:Tas ir UDP veids, kas ir neuzticams un bez savienojuma.Protokols:To izmanto, lai piešķirtu protokola vērtību IP adresei, kas ir 0. Protokola vērtība ir līdzīga vērtībai, kas parādās kabatas IP galvenes protokola laukā.

Kas ir savienojums?

Savienojums ir attiecību veids starp divām mašīnām, kur abas programmatūras ir zināmas viena par otru. Šīs divas programmatūras zina, kā izveidot savienojumu viena ar otru; citiem vārdiem sakot, mēs varam teikt, ka šīs divas programmatūras zina, kā nosūtīt bitus tīklā. Kontaktligzdas savienojums nozīmē, ka abām iekārtām ir jāzina visa savstarpējā informācija, piemēram, tālruņa numurs, IP adrese un TCP ports.

romiešu ciparu diagramma 1100

Socket ir objekta veids, kas ir līdzīgs failam, kas ļauj programmai pieņemt ienākošo savienojumu un ļaut tai nosūtīt vai saņemt ienākošo savienojumu. Tas ir arī servera procesam piešķirtais resursa veids.

Serveris var izveidot ligzdu ar ligzdas () palīdzību. Šo ligzdu nevar koplietot ne ar vienu citu procesoru.

    Setsockopt:Ar Setsockopt palīdzību mēs varam manipulēt ar dažādām ligzdas opcijām, uz kurām atsaucas ligzdas faila deskriptors. Šis process ir pilnīgi neobligāts. Ar Setsockopt palīdzību mēs varam atkārtoti izmantot klienta un servera portu un adresi. Kad serveris norāda kļūdu 'adrese jau tiek izmantota', mēs varam to novērst ar Setsockopt palīdzību.Saistīt:Mēs varam saistīt ligzdu ar adresi un portu ar saistīšanas funkcijas palīdzību. Šī darbība tiek veikta pēc kontaktligzdas izveides. Piemēram, ja mēs mēģinām saistīt serveri ar vietējo resursdatoru, mēs izmantojam INADDR_ANY, lai definētu servera IP adresi.Klausieties:Savienojuma režīma ligzdu varam izveidot ar klausīšanās () funkcijas palīdzību. Savienojuma režīma ligzdas piemērs ir SOCK_STREAM. To var definēt ar ligzdas argumentu. To izmanto, lai pieņemtu ienākošo savienojumu, veiktu rindas darbību ienākošajam savienojumam un veiktu ienākošā savienojuma aizkavēšanos. Kad ienākošais savienojums pieprasa serverim apstiprinājumu, ligzda tiek pārslēgta pasīvā režīmā. Servera atpalicības parametrs attiecas uz faktu, ka tas vienlaikus nevar atļaut serverim vairāk nekā vienu savienojumu. Ja ir izveidots ienākošais savienojums un rinda ir pilna, serveris parāda kļūdu ar norādi “ECONNREFUSED”. Ar listen() palīdzību ienākošais savienojums tiek aizturēts, un, kad rinda ir tukša, tas izsauc visus ienākošos savienojumus uz serveri.Pieņemt:Ar pieņemt() sistēmas izsaukuma palīdzību; mēs varam izveidot uz savienojumu balstītu ligzdu. Dažas uz savienojumu balstītas ligzdas ir SOCK_STREAMan un SOCK_SEQPACKET. Tas izvelk visus ienākošos savienojumus, kas tiek ievadīti pirmie, un ļauj to pieprasījumam pāriet uz serveri. Jaunpieslēgtais saraksts nespēj noklausīties ar cita argumenta palīdzību jaunās ligzdas izveidei.

Posmi klientam

    Kontaktligzdas savienojums:Tā ir tieši tāda pati kā servera izveides metode.Savienot:Mēs varam izveidot savienojumu ar ligzdu, izmantojot connect() sistēmas zvanu. Ja ligzdas parametrs ir SOCK_DGRAM tips, tad mēs varam definēt datagrammu kā pastāvīgu ar connect() palīdzību. Ja ligzdas tips ir SOCK_STREAM, mēs varam mēģināt izveidot citu savienojumu serverim. Ar funkcijas connect() palīdzību mēs varam izveidot savienojumu arī ārzemju asociācijai. Ja ligzda nav saistīta, sistēma piešķir unikālo vērtību vietējai asociācijai. Kad sistēma veiksmīgi zvana, ligzda ir gatava nosūtīt vai saņemt jebkāda veida datus.Sūtīt/saņemt:Funkcijas send() un recv() var veikt tālāk norādīto darbību.
  • Kontaktligzda, kurā datus var sazināties savā starpā.
  • Krātuves buferis var saglabāt datus par adresi, piemēram, addr_of_data un addr_of_buffer.
  • Tas attiecas uz bufera lielumu, piemēram, len_of_data un len_of_buffer.
  • Tas attiecas uz karogu, kas norāda, kā dati tiks nosūtīti.

Darbības, lai izveidotu savienojumu ligzdā

Tas izveido savienojumu starp dažādiem klientiem un serveri. Bet gan klients, gan serveris var apstrādāt ligzdas savienojumu. Katram procesam ir jāizveido savienojums savai ligzdai.

Darbības, kas saistītas ar kontaktligzdas izveidi klienta pusē, ir šādas:

  • Tas izveido ligzdu ar socket() sistēmas izsaukuma palīdzību.
  • Pēc tam mums ir jāizveido savienojums ar servera ligzdas adresi ar sistēmas() izsaukuma palīdzību.
  • Tad mums ir jānosūta un jāsaņem dati. Mēs to varam izdarīt dažādos veidos. mēs varam veikt šo lasīšanas () un rakstīšanas () funkciju.

Darbības, kas jāveic, lai izveidotu ligzdu servera pusē, ir šādas:

vaicājuma atlasītājs
  • Vispirms tas izveido ligzdu ar sistēmas izsaukuma socket() palīdzību.
  • Pēc tam tas saista ligzdu ar adresi, izmantojot bind() sistēmas izsaukumu. Adrese sastāv no resursdatora servera ligzdas porta numura.
  • Pēc tam tas klausās savienojumu, izmantojot klausīšanās () sistēmas zvanu.
  • Pēc tam serveris pieņem ienākošo savienojumu ar sistēmas izsaukuma accept() palīdzību. Tas arī bloķē visas ienākošās komandas, līdz klients ir savienots ar serveri.
  • Pēc tam sākas datu nosūtīšanas un saņemšanas process.

Vairāku klientu savienošana bez vairāku pavedienu izveides

Ir dažādi piemēri, kuros redzams, kā viens lietotājs var izveidot savienojumu ar serveri. Mūsdienu programmēšanas pasaulē vairāki lietotāji ir savienoti ar serveri ar dažādām ligzdām.

Ir dažādi veidi, kā to panākt. Viens no tiem ir daudzpavedienu veidošana. Ar daudzpavedienu palīdzību mēs to varam sasniegt. Mēs varam īstenot vairāku pavedienu procesu ar funkcijas select() palīdzību.

Piemērs:

Kods klientam:

 // 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)>