logo

Socketprogrammering in C/C++

In de wereld van vandaag spelen computernetwerken een belangrijke rol op het gebied van gegevensoverdracht. Het is een onderwerp dat elke programmeur zou moeten kennen. Onder het computernetwerk is socketprogrammering een van de belangrijkste onderwerpen in de programmeerwereld. In dit onderwerp bespreken we socketprogrammering en de verschillende methoden voor socketprogrammering die in C++ zijn geïmplementeerd.

In C++ is socketprogrammering een methode die twee of meer knooppunten met elkaar combineert via een netwerk, zodat de knooppunten de gegevens kunnen delen zonder enig verlies van gegevens. Hierbij luistert één knooppunt naar één poort die is verbonden met een bepaald IP-adres. Wanneer de client de server bereikt, maakt de server de socket-listener aan.

Wat is een stopcontact?

Laten we de socket begrijpen door het realtime voorbeeld te bespreken. Een stopcontact is een soort medium dat zorgt voor een verbinding tussen twee apparaten. Het stopcontact kan een telefoonoplader zijn die zorgt voor de verbinding tussen het stopcontact en de telefoon, of tussen de telefoon en die laptop. Met behulp van een socket worden verschillende applicaties met verschillende poorten op het lokale netwerk aangesloten. Elke keer dat de socket wordt aangemaakt, specificeert de server het programma, en dat programma specificeert de socket en het domeinadres.

De socket is een soort mechanisme dat wordt gebruikt om gegevens tussen verschillende processen uit te wisselen. Hier zijn deze processen aanwezig op verschillende apparaten of op hetzelfde apparaat dat via een netwerk is verbonden. Zodra de verbinding voor de socket tot stand is gebracht, kunnen de gegevens in beide richtingen worden verzonden, totdat een van de eindpunten de verbinding verbreekt.

tekenreeks Java
Socketprogrammering in C/C++

Procedure bij client-servercommunicatie

Er zijn enkele procedures die we moeten volgen om client-server-communicatie tot stand te brengen. Deze zijn als volgt.

    Stopcontact:Met behulp van een stopcontact kunnen we een nieuwe communicatie creëren.Binden:Met behulp hiervan kunnen we het lokale adres aan het stopcontact koppelen.Luisteren:Met deze hulp; we kunnen de verbinding accepteren.Aanvaarden:Met deze hulp; we kunnen de inkomende verbinding blokkeren totdat het verzoek binnenkomt.Aansluiten:Met deze hulp; we kunnen proberen de verbinding tot stand te brengen.Versturen:Met behulp hiervan; we kunnen de gegevens over het netwerk verzenden.Ontvangen:Met deze hulp; we kunnen de gegevens via het netwerk ontvangen.Dichtbij:Met behulp hiervan kunnen we de verbinding van het netwerk vrijgeven.

Fasen voor het maken van serversockets

Er zijn enkele fasen waarmee we de socket voor de server kunnen maken. Deze zijn als volgt.

    int socketcr:Socket(domein, type, protocol)Socketcr:Het is een geheel getal en lijkt op een bestandshandler.Domein:Het is een communicatiedomein en het is een geheel getal.Type:Het is een communicatietype.SOCK_DGRAM:Het is een type UDP dat onbetrouwbaar en verbindingsloos is.Protocol:Het wordt gebruikt om de protocolwaarde voor het IP-adres toe te wijzen, namelijk 0. De protocolwaarde is vergelijkbaar met de waarde die verschijnt in het protocolveld van de IP-header van de pocket.

Wat is een verbinding?

Een verbinding is een soort relatie tussen twee machines waarbij de twee software over elkaar bekend zijn. Deze twee software weten hoe ze een verbinding met elkaar tot stand moeten brengen; met andere woorden, we kunnen zeggen dat deze twee software weten hoe de bits over het netwerk moeten worden verzonden. Een verbinding van de socket betekent dat de twee machines alle informatie van elkaar moeten kennen, zoals het telefoonnummer, het IP-adres en de TCP-poort.

Een socket is een type object dat vergelijkbaar is met het bestand waarmee het programma de inkomende verbinding kan accepteren en de inkomende verbinding kan verzenden of ontvangen. Het is ook een type bron dat wordt toegewezen aan het proces van de server.

De server kan de socket maken met behulp van socket(). Deze socket kan niet worden gedeeld met een andere processor.

    Setsockopt:Met behulp van Setsockopt kunnen we de verschillende opties van de socket manipuleren, waarnaar wordt verwezen door de bestandsdescriptor van de socket. Dit proces is volledig optioneel. Met behulp van Setsockopt kunnen we de poort en het adres van de client en de server hergebruiken. Wanneer de server de foutmelding 'adres al in gebruik' geeft, kunnen we dit voorkomen met behulp van Setsockopt.Binden:Met behulp van de bindfunctie kunnen we de socket met het adres en de poort binden. Deze bewerking wordt uitgevoerd nadat de socket is gemaakt. Als we bijvoorbeeld proberen de server aan de lokale host te binden, gebruiken we INADDR_ANY om het IP-adres van de server te definiëren.Luisteren:We kunnen een aansluiting voor verbindingsmodus maken met behulp van de functie luisteren naar (). Een voorbeeld van een socket voor verbindingsmodus is SOCK_STREAM. Dit kan worden gedefinieerd door het socket-argument. Dit wordt gebruikt om de inkomende verbinding te accepteren, de wachtrijbewerking voor de inkomende verbinding uit te voeren en de achterstand van de inkomende verbinding uit te voeren. Wanneer een inkomende verbinding de server om bevestiging vraagt, wordt de socket in passieve modus gezet. De backlog-parameter van de server verwijst naar het feit dat deze niet meer dan één verbinding tegelijk met de server kan toestaan. Als er een inkomende verbinding is gekomen en de wachtrij vol is, geeft de server de foutmelding met de indicatie ' ECONNREFUSED.' Met behulp van listen() wordt de inkomende verbinding in de wacht gezet en als de wachtrij leeg is, worden alle inkomende verbindingen naar de server gebeld.Aanvaarden:Met behulp van accept() systeemaanroep; we kunnen de op verbindingen gebaseerde socket maken. Sommige op verbindingen gebaseerde sockets zijn SOCK_STREAM en SOCK_SEQPACKET. Het extraheert alle inkomende verbindingen die als eerste binnenkomen en zorgt ervoor dat hun verzoek naar de server gaat. De nieuw verbonden lijst kan niet luisteren met behulp van een ander argument voor het maken van de nieuwe socket.

Fasen voor klant

    Stopcontactaansluiting:Het is precies hetzelfde als de methode voor het maken van de server.Aansluiten:We kunnen een verbinding met de socket tot stand brengen met behulp van de connect() systeemaanroep. Als de parameter voor de socket een type SOCK_DGRAM is, kunnen we het datagram als permanent definiëren met behulp van connect(). Als de socket van het type SOCK_STREAM is, kunnen we proberen een andere verbinding voor de server tot stand te brengen. Met behulp van de connect()-functie kunnen we ook een verbinding tot stand brengen voor de buitenlandse vereniging. Als de socket ongebonden is, wijst het systeem de unieke waarde toe aan de lokale associatie. Wanneer het systeem de oproep met succes heeft voltooid, is de socket klaar om elk type gegevens te verzenden of te ontvangen.Verzenden/ontvangen:De functies send() en recv() kunnen de onderstaande bewerking uitvoeren.
  • Het stopcontact waarop de gegevens met elkaar kunnen worden gecommuniceerd.
  • De opslagbuffer kan gegevens over het adres opslaan, zoals addr_of_data en addr_of_buffer.
  • Het gaat over de grootte van de buffer, zoals len_of_data en len_of_buffer.
  • Het gaat over de vlag die aangeeft hoe de gegevens worden verzonden.

Stappen om de verbinding in de socket tot stand te brengen

Het brengt een verbinding tot stand tussen de verschillende clients en de server. Maar zowel de client als de server kunnen de socketverbinding aan. Elk proces moet een verbinding tot stand brengen voor zijn eigen socket.

De stappen die betrokken zijn bij het opzetten van een socket aan de clientzijde zijn als volgt:

  • Het creëert een socket met behulp van een socket() systeemaanroep.
  • Vervolgens moeten we verbinding maken met het socketadres van de server met behulp van een system()-aanroep.
  • Vervolgens moeten wij de gegevens verzenden en ontvangen. Dit kunnen wij op verschillende manieren doen. we kunnen deze lees() en schrijf() functie uitvoeren.

De stappen die betrokken zijn bij het tot stand brengen van een socket aan de serverzijde zijn als volgt:

wat zit er in python
  • Het maakt eerst een socket aan met behulp van een socket() systeemaanroep.
  • Vervolgens bindt het de socket aan een adres met behulp van de systeemaanroep bind(). Een adres bestaat uit een poortnummer voor de serversocket in de hostmachine.
  • Vervolgens luistert het naar de verbinding met behulp van de luisterende () systeemoproep.
  • Vervolgens accepteert de server de inkomende verbinding met behulp van de accept() systeemaanroep. Het blokkeert ook alle inkomende opdrachten totdat een client is verbonden met een server.
  • Vervolgens begint het proces van het verzenden en ontvangen van gegevens.

Meerdere clients verbinden zonder multithreading

Er zijn verschillende voorbeelden waarin we zien hoe een enkele gebruiker verbinding kan maken met de server. In de hedendaagse programmeerwereld zijn meerdere gebruikers via verschillende sockets met de server verbonden.

Er zijn verschillende manieren om dit te bereiken. Eén daarvan is multithreading. Met behulp van multithreading kunnen we dit bereiken. We kunnen een multithreading-proces implementeren met behulp van de select() functie.

Voorbeeld:

Code voor de klant:

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