logo

Socket-programmering i C/C++

I dagens verden spiller datanettverk en viktig rolle i dataoverføringsfeltet. Det er et emne som hver programmerer bør kjenne til. Under datanettverket er socket-programmering et av de viktigste temaene i programmeringsverdenen. I dette emnet gjør vi for å diskutere socket-programmering og den forskjellige metoden for socket-programmering som er implementert i C++.

I C++ er socket-programmering en metode som kombinerer to eller flere noder med hverandre over et nettverk slik at nodene kan dele dataene uten tap av data. I denne forbindelse lytter én node til én port som er koblet til en bestemt IP-adresse. Når klienten når serveren, oppretter serveren socket-lytteren.

Hva er en socket?

La oss forstå om stikkontakten ved å snakke om sanntidseksemplet. En stikkontakt er en type medium som gir en forbindelse mellom to enheter. Kontakten kan enten være en telefonlader som gir forbindelsen mellom stikkontakten og telefonen eller telefonen og den bærbare datamaskinen. Ved hjelp av en socket kobles forskjellige applikasjoner til det lokale nettverket med forskjellige porter. Hver gang socket opprettes, spesifiserer serveren programmet, og det programmet spesifiserer socket og domeneadressen.

Socket er en type mekanisme som brukes til å utveksle data mellom ulike prosesser. Her er disse prosessene enten tilstede i forskjellige enheter eller samme enhet som er koblet over et nettverk. Når forbindelsen for stikkontakten er opprettet, kan dataene sendes i begge retninger og fortsetter til et av endepunktene lukker forbindelsen.

Socket-programmering i C/C++

Prosedyre i klient-serverkommunikasjon

Det er noen prosedyrer vi må følge for å etablere klient-server-kommunikasjon. Disse er som følger.

    Stikkontakt:Ved hjelp av en stikkontakt kan vi lage en ny kommunikasjon.Binde:Ved hjelp av dette kan vi feste den lokale adressen med stikkontakten.Lytte:Med denne hjelpen; vi kan godta forbindelsen.Aksepterer:Med denne hjelpen; vi kan blokkere den innkommende tilkoblingen til forespørselen kommer.Koble:Med denne hjelpen; vi kan forsøke å etablere forbindelsen.Sende:Ved hjelp av dette; vi kan sende dataene over nettverket.Motta:Med denne hjelpen; vi kan motta dataene over nettverket.Lukk:Ved hjelp av dette kan vi frigjøre forbindelsen fra nettverket.

Stadier for opprettelse av serversocket

Det er noen stadier der vi kan opprette kontakten for serveren. Disse er som følger.

    int socketcr:Socket (domene, type, protokoll)Socketcr:Det er en heltallstype, og det er som en filbehandler.Domene:Det er et kommunikasjonsdomene og det er en heltallstype.Type:Det er en kommunikasjonstype.SOCK_DGRAM:Det er en type UDP som er upålitelig og uten forbindelse.Protokoll:Den brukes til å tildele protokollverdien for IP-adressen, som er 0. Protokollverdien er lik verdien som vises i protokollfeltet til IP-overskriften til lommen.

Hva er en tilkobling?

En forbindelse er en type forhold mellom to maskiner der de to programvarene er kjent om hverandre. Disse to programvarene vet hvordan de oppretter en forbindelse med hverandre; med andre ord kan vi si at denne to programvaren vet hvordan de skal sende bitene over nettverket. En tilkobling av stikkontakten betyr at de to maskinene skal vite all informasjonen mellom hverandre, som telefonnummer, IP-adresse og TCP-porten.

En socket er en type objekt som ligner på filen som lar programmet godta den innkommende tilkoblingen og tillate dem å sende eller motta den innkommende tilkoblingen. Det er også en type ressurs som er tilordnet serverens prosess.

Serveren kan lage socket ved hjelp av socket(). Denne kontakten kan ikke deles med noen annen prosessor.

    Setsockopt:Ved hjelp av Setsockopt kan vi manipulere de ulike alternativene til socket, som refereres til av sockets filbeskrivelse. Denne prosessen er helt valgfri. Ved hjelp av Setsockopt kan vi gjenbruke porten og adressen til klienten og serveren. Når serveren gir feilen 'adresse allerede i bruk', kan vi forhindre det ved hjelp av Setsockopt.Binde:Vi kan binde kontakten med adressen og porten ved hjelp av bindefunksjonen. Denne operasjonen gjøres etter opprettelsen av stikkontakten. For eksempel, hvis vi prøver å binde serveren med den lokale verten, bruker vi INADDR_ANY for å definere serverens IP-adresse.Lytte:Vi kan lage en tilkoblingsmodusuttak ved hjelp av lytting til ()-funksjonen. Et eksempel på en tilkoblingsmoduskontakt er SOCK_STREAM. Dette kan defineres av socket-argumentet. Dette brukes til å akseptere den innkommende tilkoblingen for å utføre køoperasjonen for den innkommende tilkoblingen, og utføre backlog for den innkommende tilkoblingen. Når en innkommende tilkobling ber serveren om bekreftelse, settes kontakten i passiv modus. Backlog-parameteren til serveren refererer til det faktum at den ikke kan tillate mer enn én tilkobling om gangen til serveren. Hvis en innkommende tilkobling har kommet og køen er full, gir serveren feilen med en indikasjon på 'ECONNREFUSED'. Ved hjelp av listen() er den innkommende tilkoblingen på vent, og når køen er tom kaller den alle innkommende tilkoblinger til serveren.Aksepterer:Ved hjelp av accept() systemkall; vi kan lage den tilkoblingsbaserte stikkontakten. Noen tilkoblingsbaserte stikkontakter er SOCK_STREAM og SOCK_SEQPACKET. Den trekker ut alle innkommende tilkoblinger som kommer inn først og lar forespørselen deres gå til serveren. Den nylig tilkoblede listen er ikke i stand til å lytte ved hjelp av et annet argument for opprettelsen av den nye kontakten.

Stadier for klient

    Stikkontakt:Det er nøyaktig det samme som metoden for å lage serveren.Koble:Vi kan starte en tilkobling til socket ved hjelp av connect() systemkall. Hvis parameteren for socket er en type SOCK_DGRAM, kan vi definere datagrammet som permanent ved hjelp av connect(). Hvis kontakten er av typen SOCK_STREAM, kan vi forsøke å opprette en annen tilkobling for serveren. Ved hjelp av connect()-funksjonen kan vi også opprette en forbindelse for den utenlandske foreningen. Hvis stikkontakten er ubundet, tildeler systemet den unike verdien til lokalforeningen. Når systemet er fullført, er kontakten klar til å sende eller motta alle typer data.Send motta:Send()- og recv()-funksjonene kan utføre operasjonen nedenfor.
  • Kontakten som dataene kan kommuniseres med hverandre på.
  • Lagringsbufferen kan lagre data om adressen, som addr_of_data og addr_of_buffer.
  • Den tar for seg størrelsen på bufferen, som len_of_data og len_of_buffer.
  • Den omhandler flagget som sier hvordan dataene skal sendes.

Trinn for å etablere tilkoblingen i stikkontakten

Den etablerer en forbindelse mellom de forskjellige klientene og serveren. Men både klienten og serveren kan håndtere socket-tilkoblingen. Hver prosess må etablere en tilkobling for sin egen stikkontakt.

Trinnene involvert i å etablere en stikkontakt på klientsiden er som følger:

  • Den lager en socket ved hjelp av et socket() systemkall.
  • Da må vi koble til socket-adressen til serveren ved hjelp av et system()-kall.
  • Da må vi sende og motta dataene. Dette kan vi gjøre på ulike måter. vi kan gjøre denne funksjonen read() og write().

Trinnene involvert i å etablere en socket på serversiden er som følger:

  • Den oppretter først en socket ved hjelp av et socket() systemkall.
  • Deretter binder den socket til en adresse ved hjelp av bind()-systemkallet. En adresse består av et portnummer for serverkontakten i vertsmaskinen.
  • Deretter lytter den etter forbindelsen ved hjelp av det lyttende () systemanropet.
  • Deretter aksepterer serveren den innkommende forbindelsen ved hjelp av accept() systemkall. Den blokkerer også alle innkommende kommandoer til en klient er koblet til en server.
  • Deretter starter prosessen med å sende og motta data.

Koble til flere klienter uten multithreading

Det er ulike eksempler der vi ser hvordan en enkelt bruker kan koble seg til serveren. I dagens programmeringsverden er flere brukere koblet til serveren med forskjellige sockets.

Det er ulike måter å oppnå dette på. En av dem er multithreading. Ved hjelp av multithreading kan vi oppnå dette. Vi kan implementere en multithreading-prosess ved hjelp av funksjonen select().

Eksempel:

Kode for 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)>