logo

Sokkelprogrammering i C/C++

I dagens verden spiller computernetværk en vigtig rolle inden for dataoverførsel. Det er et emne, som enhver programmør bør kende til. Under computernetværket er socket-programmering et af de vigtigste emner i programmeringsverdenen. I dette emne gør vi for at diskutere socket-programmering og den forskellige metode til socket-programmering, der er implementeret i C++.

I C++ er socket-programmering en metode, der kombinerer to eller flere noder med hinanden over et netværk, så noderne kan dele data uden tab af data. I den forbindelse lytter én node til én port, som er forbundet med en bestemt IP-adresse. Når klienten når serveren, opretter serveren socket-lytteren.

Hvad er en Socket?

Lad os forstå stikket ved at tale om realtidseksemplet. Et stik er en type medie, der giver forbindelse mellem to enheder. Stikkontakten kan enten være en telefonoplader, der giver forbindelsen mellem stikkontakten og telefonen eller telefonen og den bærbare computer. Ved hjælp af et stik tilsluttes forskellige applikationer til det lokale netværk med forskellige porte. Hver gang, når socket oprettes, specificerer serveren programmet, og det program specificerer socket og domæneadressen.

Sokkelen er en type mekanisme, der bruges til at udveksle data mellem forskellige processer. Her er disse processer enten til stede i forskellige enheder eller den samme enhed, som er forbundet over et netværk. Når forbindelsen til stikket er oprettet, så kan dataene sendes i begge retninger og fortsætter, indtil et af endepunkterne lukker forbindelsen.

Sokkelprogrammering i C/C++

Procedure i klient-server kommunikation

Der er nogle procedurer, som vi skal følge for at etablere klient-server-kommunikation. Disse er som følger.

    Stikkontakt:Ved hjælp af en stikkontakt kan vi skabe en ny kommunikation.Binde:Ved hjælp af dette kan vi, vi kan vedhæfte den lokale adresse med stikkontakten.Hør efter:Med denne hjælp; vi kan acceptere forbindelsen.Acceptere:Med denne hjælp; vi kan blokere den indgående forbindelse, indtil anmodningen kommer.Forbinde:Med denne hjælp; vi kan forsøge at etablere forbindelsen.Sende:Ved hjælp af dette; vi kan sende data over netværket.Modtage:Med denne hjælp; vi kan modtage dataene over netværket.Tæt:Ved hjælp af dette kan vi frigive forbindelsen fra netværket.

Stadier til oprettelse af serversocket

Der er nogle trin, hvorved vi kan oprette socket til serveren. Disse er som følger.

    int socketcr:Socket (domæne, type, protokol)Socketcr:Det er en heltalstype, og det er ligesom en filbehandler.Domæne:Det er et kommunikationsdomæne, og det er en heltalstype.Type:Det er en kommunikationstype.SOCK_DGRAM:Det er en type UDP, som er upålidelig og forbindelsesløs.Protokol:Den bruges til at tildele protokolværdien for IP-adressen, som er 0. Protokolværdien svarer til den værdi, der vises i protokolfeltet i lommens IP-header.

Hvad er en forbindelse?

En forbindelse er en type forhold mellem to maskiner, hvor de to software er kendt om hinanden. Disse to software ved, hvordan man etablerer en forbindelse med hinanden; med andre ord kan vi sige, at disse to software ved, hvordan man sender bits over netværket. En tilslutning af stikket betyder, at de to maskiner skal kende alle oplysninger mellem hinanden, såsom telefonnummer, IP-adresse og TCP-porten.

En socket er en type objekt, der ligner den fil, der tillader programmet at acceptere den indgående forbindelse og give dem mulighed for at sende eller modtage den indgående forbindelse. Det er også en type ressource, der er tildelt serverens proces.

Serveren kan oprette socket ved hjælp af socket(). Denne socket kan ikke deles med nogen anden processor.

    Setsockopt:Ved hjælp af Setsockopt kan vi manipulere de forskellige muligheder for socket, som refereres til af sockets filbeskrivelse. Denne proces er helt valgfri. Ved hjælp af Setsockopt kan vi genbruge porten og adressen på klienten og serveren. Når serveren giver fejlen 'adresse allerede i brug', kan vi forhindre det ved hjælp af Setsockopt.Binde:Vi kan binde stikket med adressen og porten ved hjælp af bindefunktionen. Denne operation udføres efter oprettelsen af ​​stikket. For eksempel, hvis vi forsøger at binde serveren med den lokale vært, så bruger vi INADDR_ANY til at definere serverens IP-adresse.Hør efter:Vi kan lave en forbindelsestilstand ved hjælp af funktionen lytte til () . Et eksempel på en forbindelsestilstand er SOCK_STREAM. Dette kan defineres af socket-argumentet. Dette bruges til at acceptere den indgående forbindelse til at udføre køoperationen for den indgående forbindelse og udføre efterslæbet for den indgående forbindelse. Når en indgående forbindelse anmoder serveren om bekræftelse, sættes stikket i passiv tilstand. Serverens backlog-parameter henviser til, at den ikke kan tillade mere end én forbindelse til serveren ad gangen. Hvis der er kommet en indgående forbindelse, og køen er fuld, giver serveren fejlen med en indikation af 'ECONNREFUSED'. Ved hjælp af listen() er den indgående forbindelse i venteposition, og når køen er tom, kalder den alle de indgående forbindelser til serveren.Acceptere:Ved hjælp af accept() systemkald; vi kan lave den forbindelsesbaserede stikkontakt. Nogle forbindelsesbaserede stik er SOCK_STREAM og SOCK_SEQPACKET. Det udtrækker alle de indgående forbindelser, der kommer først og tillader deres anmodning at gå til serveren. Den nyligt tilsluttede liste er ikke i stand til at lytte ved hjælp af et andet argument for oprettelsen af ​​den nye socket.

Stadier til klient

    Stikforbindelse:Det er nøjagtigt det samme som metoden til oprettelse af serveren.Forbinde:Vi kan starte en forbindelse til socket ved hjælp af connect() systemkald. Hvis parameteren for socket er en type SOCK_DGRAM, så kan vi definere datagrammet som permanent ved hjælp af connect(). Hvis socket er af typen SOCK_STREAM, kan vi forsøge at oprette en anden forbindelse til serveren. Ved hjælp af connect()-funktionen kan vi også oprette en forbindelse til den udenlandske forening. Hvis socket er ubundet, så tildeler systemet den unikke værdi til lokalforeningen. Når systemet opkald er afsluttet, er stikket klar til at sende eller modtage enhver form for data.Send/modtag:Send() og recv() funktionerne kan udføre nedenstående handling.
  • Den stikdåse, hvorpå data kan kommunikeres med hinanden.
  • Lagerbufferen kan gemme data om adressen, som addr_of_data og addr_of_buffer.
  • Det omhandler størrelsen af ​​bufferen, som len_of_data og len_of_buffer.
  • Det omhandler flaget, der siger, hvordan dataene vil blive sendt.

Trin til at etablere forbindelsen i stikket

Det etablerer en forbindelse mellem de forskellige klienter og serveren. Men både klienten og serveren kan håndtere socketforbindelsen. Hver proces skal etablere en forbindelse til sit eget stik.

De trin, der er involveret i etablering af en stikkontakt på klientsiden, er som følger:

  • Det opretter en socket ved hjælp af et socket() systemkald.
  • Så skal vi forbinde med serverens socket-adresse ved hjælp af et system()-kald.
  • Så skal vi sende og modtage dataene. Det kan vi gøre på forskellige måder. vi kan gøre denne read() og write() funktion.

De trin, der er involveret i at etablere en socket på serversiden, er som følger:

  • Den opretter først en socket ved hjælp af et socket() systemkald.
  • Derefter binder den socket til en adresse ved hjælp af bind() systemkaldet. En adresse består af et portnummer til serversocket i værtsmaskinen.
  • Derefter lytter den efter forbindelsen ved hjælp af det lyttende () systemkald.
  • Så accepterer serveren den indgående forbindelse ved hjælp af accept() systemkald. Det blokerer også alle indgående kommandoer, indtil en klient er forbundet til en server.
  • Derefter starter processen med at sende og modtage data.

Tilslutning af flere klienter uden multithreading

Der er forskellige eksempler, hvor vi ser, hvordan en enkelt bruger kan oprette forbindelse til serveren. I nutidens programmeringsverden er flere brugere forbundet til serveren med forskellige sockets.

Der er forskellige måder at opnå dette på. En af dem er multithreading. Ved hjælp af multithreading kan vi opnå dette. Vi kan implementere en multithreading-proces ved hjælp af ved hjælp af select()-funktionen.

Eksempel:

Kode til klienten:

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