logo

Sockelprogrammering i C/C++

I dagens värld spelar datornätverk en viktig roll inom dataöverföringsområdet. Det är ett ämne som varje programmerare bör känna till. Under datornätverket är socketprogrammering ett av de viktigaste ämnena i programmeringsvärlden. I det här ämnet diskuterar vi socketprogrammering och de olika metoderna för socketprogrammering som är implementerade i C++.

I C++ är socketprogrammering en metod som kombinerar två eller flera noder med varandra över ett nätverk så att noderna kan dela data utan att förlora data. I detta sammanhang lyssnar en nod på en port som är ansluten till en viss IP-adress. När klienten når servern skapar servern socketavlyssnaren.

Vad är en Socket?

Låt oss förstå uttaget genom att tala om realtidsexemplet. Ett uttag är en typ av medium som ger en anslutning mellan två enheter. Uttaget kan antingen vara en telefonladdare som ger anslutningen mellan uttaget och telefonen eller telefonen och den bärbara datorn. Med hjälp av ett uttag kopplas olika applikationer till det lokala nätverket med olika portar. Varje gång när socket skapas anger servern programmet, och det programmet anger socket och domänadressen.

t flip flop

Socket är en typ av mekanism som används för att utbyta data mellan olika processer. Här finns dessa processer antingen i olika enheter eller samma enhet som är anslutna över ett nätverk. När anslutningen för socket har skapats kan data skickas i båda riktningarna och fortsätter tills en av ändpunkterna stänger anslutningen.

Sockelprogrammering i C/C++

Procedur i klient-serverkommunikation

Det finns några procedurer som vi måste följa för att upprätta klient-serverkommunikation. Dessa är följande.

    Uttag:Med hjälp av ett uttag kan vi skapa en ny kommunikation.Binda:Med hjälp av detta kan vi fästa den lokala adressen med uttaget.Lyssna:Med denna hjälp; vi kan acceptera anslutningen.Acceptera:Med denna hjälp; vi kan blockera den inkommande anslutningen tills begäran kommer.Ansluta:Med denna hjälp; vi kan försöka upprätta anslutningen.Skicka:Med hjälp av detta; vi kan skicka data över nätverket.Motta:Med denna hjälp; vi kan ta emot data över nätverket.Stänga:Med hjälp av detta kan vi frigöra anslutningen från nätverket.

Stadier för att skapa serversocket

Det finns några steg genom vilka vi kan skapa socket för servern. Dessa är följande.

    int socketcr:Socket (domän, typ, protokoll)Socketcr:Det är en heltalstyp och det är som en filhanterare.Domän:Det är en kommunikationsdomän och det är en heltalstyp.Typ:Det är en kommunikationstyp.SOCK_DGRAM:Det är en typ av UDP som är opålitlig och anslutningslös.Protokoll:Det används för att tilldela protokollvärdet för IP-adressen, vilket är 0. Protokollvärdet liknar värdet som visas i protokollfältet i IP-huvudet i fickan.

Vad är en anslutning?

En anslutning är en typ av relation mellan två maskiner där de två mjukvarorna är kända om varandra. Dessa två mjukvaror vet hur man upprättar en förbindelse med varandra; med andra ord kan vi säga att dessa två mjukvaror vet hur man skickar bitarna över nätverket. En anslutning av uttaget innebär att de två maskinerna bör känna till all information mellan varandra, som telefonnummer, IP-adress och TCP-porten.

En socket är en typ av objekt som liknar filen som gör att programmet kan acceptera den inkommande anslutningen och låta dem skicka eller ta emot den inkommande anslutningen. Det är också en typ av resurs som tilldelas serverns process.

Servern kan skapa socket med hjälp av socket(). Detta uttag kan inte delas med någon annan processor.

    Setsockopt:Med hjälp av Setsockopt kan vi manipulera de olika alternativen för socket, som refereras till av sockets fildeskriptor. Denna process är helt valfri. Med hjälp av Setsockopt kan vi återanvända porten och adressen till klienten och servern. När servern ger felet 'adress som redan används' kan vi förhindra det med hjälp av Setsockopt.Binda:Vi kan binda uttaget med adressen och porten med hjälp av bindfunktionen. Denna operation görs efter skapandet av uttaget. Till exempel, om vi försöker binda servern med den lokala värden, använder vi INADDR_ANY för att definiera serverns IP-adress.Lyssna:Vi kan göra ett anslutningslägesuttag med hjälp av funktionen för att lyssna på (). Ett exempel på ett anslutningslägesuttag är SOCK_STREAM. Detta kan definieras av socket-argumentet. Detta används för att acceptera den inkommande anslutningen för att utföra köoperationen för den inkommande anslutningen och utföra eftersläpningen av den inkommande anslutningen. När en inkommande anslutning begär bekräftelse från servern, sätts uttaget i passivt läge. Serverns backlog-parameter hänvisar till det faktum att den inte kan tillåta mer än en anslutning åt gången till servern. Om någon inkommande anslutning har kommit och kön är full, så ger servern felet med en indikation på ' ECONNREFUSED'. Med hjälp av listen() är den inkommande anslutningen pausad, och när kön är tom anropar den alla inkommande anslutningar till servern.Acceptera:Med hjälp av accept() systemanrop; vi kan göra det anslutningsbaserade uttaget. Vissa anslutningsbaserade uttag är SOCK_STREAM och SOCK_SEQPACKET. Den extraherar alla inkommande anslutningar som kommer in först och låter deras begäran gå till servern. Den nyanslutna listan kan inte lyssna med hjälp av ett annat argument för skapandet av den nya sockeln.

Stadier för klient

    Uttagsanslutning:Det är exakt samma som metoden för att skapa servern.Ansluta:Vi kan initiera en anslutning till socket med hjälp av connect() systemanrop. Om parametern för socket är en typ av SOCK_DGRAM, så kan vi definiera datagrammet som permanent med hjälp av connect(). Om uttaget är av typen SOCK_STREAM kan vi försöka göra en annan anslutning för servern. Med hjälp av connect()-funktionen kan vi även skapa en koppling för den utländska föreningen. Om socket är obundet tilldelar systemet det unika värdet till den lokala föreningen. När systemet har slutfört samtalet är uttaget redo att skicka eller ta emot alla typer av data.Skicka ta emot:Funktionerna send() och recv() kan utföra operationen nedan.
  • Uttaget där data kan kommuniceras med varandra.
  • Lagringsbufferten kan lagra data om adressen, som addr_of_data och addr_of_buffer.
  • Det handlar om storleken på bufferten, som len_of_data och len_of_buffer.
  • Den handlar om flaggan som säger hur data ska skickas.

Steg för att upprätta anslutningen i uttaget

Det upprättar en anslutning mellan de olika klienterna och servern. Men både klienten och servern kan hantera socketanslutningen. Varje process måste upprätta en anslutning för sitt eget uttag.

Stegen för att etablera ett uttag på klientsidan är följande:

oxe vs tjur
  • Den skapar en socket med hjälp av ett socket()-systemanrop.
  • Sedan måste vi ansluta till serverns socket-adress med hjälp av ett system()-anrop.
  • Sedan måste vi skicka och ta emot uppgifterna. Vi kan göra detta på olika sätt. vi kan göra den här funktionen read() och write().

Stegen som är involverade i att etablera en socket på serversidan är följande:

  • Den skapar först en socket med hjälp av ett socket()-systemanrop.
  • Sedan binder den socket till en adress med hjälp av bind()-systemanropet. En adress består av ett portnummer för serversocket i värddatorn.
  • Sedan lyssnar den efter anslutningen med hjälp av det lyssnande () systemanropet.
  • Sedan accepterar servern den inkommande anslutningen med hjälp av accept() systemanrop. Den blockerar också alla inkommande kommandon tills en klient är ansluten till en server.
  • Sedan startar processen att skicka och ta emot data.

Ansluta flera klienter utan Multithreading

Det finns olika exempel där vi ser hur en enskild användare kan ansluta till servern. I dagens programmeringsvärld är flera användare anslutna till servern med olika uttag.

Det finns olika sätt att uppnå detta. En av dem är multithreading. Med hjälp av multithreading kan vi uppnå detta. Vi kan implementera en multithreading-process med hjälp av med hjälp av select()-funktionen.

Exempel:

Kod för kunden:

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