logo

Programmation de sockets en C/C++

Dans le monde d'aujourd'hui, les réseaux informatiques jouent un rôle important dans le domaine du transfert de données. C'est un sujet que tout programmeur devrait connaître. Dans le cadre du réseau informatique, la programmation des sockets est l'un des sujets les plus importants dans le monde de la programmation. Dans cette rubrique, nous discutons de la programmation socket et des différentes méthodes de programmation socket implémentées en C++.

En C++, la programmation socket est une méthode qui combine deux nœuds ou plus entre eux sur un réseau afin que les nœuds puissent partager les données sans aucune perte de données. Dans cette connexion, un nœud écoute un port qui est connecté à une adresse IP particulière. Lorsque le client atteint le serveur, le serveur crée l'écouteur de socket.

Qu'est-ce qu'une prise ?

Comprenons le socket en parlant de l'exemple en temps réel. Une prise est un type de support qui assure une connexion entre deux appareils. La prise peut être soit un chargeur de téléphone qui assure la connexion entre la prise et le téléphone, soit le téléphone et cet ordinateur portable. A l'aide d'un socket, différentes applications sont connectées au réseau local avec différents ports. Chaque fois que le socket est créé, le serveur spécifie le programme, et ce programme spécifie le socket et l'adresse du domaine.

Le socket est un type de mécanisme utilisé pour échanger des données entre différents processus. Ici, ces processus sont soit présents dans différents appareils, soit dans le même appareil connecté via un réseau. Une fois la connexion pour le socket créée, les données peuvent être envoyées dans les deux sens et se poursuivent jusqu'à ce que l'un des points de terminaison ferme la connexion.

Programmation de sockets en C/C++

Procédure dans la communication client-serveur

Nous devons suivre certaines procédures pour établir une communication client-serveur. Ce sont les suivants.

    Prise:A l'aide d'une socket, nous pouvons créer une nouvelle communication.Lier:Avec l'aide de cela, nous pouvons attacher l'adresse locale au socket.Écouter:Avec cette aide ; nous pouvons accepter la connexion.Accepter:Avec cette aide ; nous pouvons bloquer la connexion entrante jusqu'à ce que la demande arrive.Connecter:Avec cette aide ; nous pouvons tenter d'établir la connexion.Envoyer:Avec l'aide de ceci ; nous pouvons envoyer les données sur le réseau.Recevoir:Avec cette aide ; nous pouvons recevoir les données sur le réseau.Fermer:Avec l'aide de cela, nous pouvons libérer la connexion du réseau.

Étapes de création de socket serveur

Il existe certaines étapes par lesquelles nous pouvons créer le socket pour le serveur. Ce sont les suivants.

    int socketcr :Socket (domaine, type, protocole)Prisecr :Il s’agit d’un type entier et ressemble à un gestionnaire de fichiers.Domaine:C'est un domaine de communication et c'est un type entier.Taper:C'est un type de communication.SOCK_DGRAM :Il s'agit d'un type d'UDP peu fiable et sans connexion.Protocole:Il permet d'attribuer la valeur de protocole à l'adresse IP, qui est 0. La valeur de protocole est similaire à la valeur apparaissant dans le champ protocole de l'en-tête IP de la poche.

Qu'est-ce qu'une connexion ?

Une connexion est un type de relation entre deux machines où les deux logiciels se connaissent. Ces deux logiciels savent établir une connexion entre eux ; autrement dit, on peut dire que ces deux logiciels savent envoyer les bits sur le réseau. Une connexion du socket signifie que les deux machines doivent connaître toutes les informations entre elles, comme le numéro de téléphone, l'adresse IP et le port TCP.

Un socket est un type d'objet similaire au fichier qui permet au programme d'accepter la connexion entrante et de lui permettre d'envoyer ou de recevoir la connexion entrante. Il s'agit également d'un type de ressource affectée au processus du serveur.

Le serveur peut créer le socket à l’aide de socket(). Ce socket ne peut être partagé avec aucun autre processeur.

    Options de sélection :Avec l'aide de Setsockopt, nous pouvons manipuler les différentes options du socket, auxquelles fait référence le descripteur de fichier du socket. Ce processus est totalement facultatif. Avec l'aide de Setsockopt, nous pouvons réutiliser le port et l'adresse du client et du serveur. Lorsque le serveur donne l'erreur « adresse déjà utilisée », nous pouvons l'empêcher à l'aide de Setsockopt.Lier:Nous pouvons lier le socket avec l'adresse et le port à l'aide de la fonction bind. Cette opération se fait après la création du socket. Par exemple, si nous essayons de lier le serveur à l'hôte local, nous utilisons INADDR_ANY pour définir l'adresse IP du serveur.Écouter:Nous pouvons créer une prise en mode connexion à l’aide de la fonction listening to (). Un exemple de socket en mode connexion est SOCK_STREAM. Cela peut être défini par l'argument socket. Ceci est utilisé pour accepter la connexion entrante, effectuer l'opération de file d'attente pour la connexion entrante et effectuer le backlog de la connexion entrante. Lorsqu'une connexion entrante demande un accusé de réception au serveur, le socket est mis en mode passif. Le paramètre backlog du serveur fait référence au fait qu'il ne peut pas autoriser plus d'une connexion à la fois au serveur. Si une connexion entrante est établie et que la file d'attente est pleine, le serveur fournit l'erreur avec l'indication « ECONNREFUSED ». Avec l'aide de Listen(), la connexion entrante est en attente et lorsque la file d'attente est vide, elle appelle toutes les connexions entrantes au serveur.Accepter:Avec l'aide de l'appel système accept() ; nous pouvons créer le socket basé sur la connexion. Certaines sockets basées sur la connexion sont SOCK_STREAM et SOCK_SEQPACKET. Il extrait toutes les connexions entrantes qui arrivent en premier et permet à leur demande d'être transmise au serveur. La liste nouvellement connectée n'est pas capable d'écouter à l'aide d'un autre argument pour la création du nouveau socket.

Étapes pour le client

    Connexion de prise :C'est exactement la même que la méthode de création du serveur.Connecter:Nous pouvons initier une connexion au socket à l’aide de l’appel système connect(). Si le paramètre du socket est un type de SOCK_DGRAM, alors nous pouvons définir le datagramme comme permanent à l'aide de connect(). Si le socket est de type SOCK_STREAM, alors nous pouvons tenter d'établir une autre connexion pour le serveur. Avec l'aide de la fonction connect(), nous pouvons également créer une connexion pour l'association étrangère. Si le socket n'est pas lié, le système attribue la valeur unique à l'association locale. Lorsque l'appel du système est terminé avec succès, le socket est prêt à envoyer ou à recevoir tout type de données.Envoyer recevoir:Les fonctions send() et recv() peuvent effectuer l'opération ci-dessous.
  • Le socket sur lequel les données peuvent être communiquées entre elles.
  • Le tampon de stockage peut stocker des données sur l'adresse, comme addr_of_data et addr_of_buffer.
  • Il traite de la taille du tampon, comme len_of_data et len_of_buffer.
  • Il s'agit du drapeau qui indique comment les données seront envoyées.

Étapes pour établir la connexion dans le socket

Il établit une connexion entre les différents clients et le serveur. Mais le client et le serveur peuvent gérer la connexion socket. Chaque processus doit établir une connexion pour son propre socket.

Les étapes impliquées dans l'établissement d'un socket côté client sont les suivantes :

  • Il crée une socket à l’aide d’un appel système socket().
  • Ensuite, nous devons nous connecter avec l'adresse socket du serveur à l'aide d'un appel system().
  • Ensuite, nous devons envoyer et recevoir les données. Nous pouvons le faire de différentes manières. nous pouvons faire cette fonction read() et write().

Les étapes impliquées dans l'établissement d'un socket côté serveur sont les suivantes :

  • Il crée d’abord une socket à l’aide d’un appel système socket().
  • Ensuite, il lie le socket à une adresse à l’aide de l’appel système bind(). Une adresse consiste en un numéro de port pour le socket serveur de la machine hôte.
  • Ensuite, il écoute la connexion à l'aide de l'appel système listening ().
  • Ensuite, le serveur accepte la connexion entrante à l’aide de l’appel système accept(). Il bloque également toutes les commandes entrantes jusqu'à ce qu'un client soit connecté à un serveur.
  • Ensuite, le processus d’envoi et de réception des données commence.

Connexion de plusieurs clients sans multithreading

Il existe différents exemples dans lesquels nous voyons comment un seul utilisateur peut se connecter au serveur. Dans le monde de la programmation d'aujourd'hui, plusieurs utilisateurs sont connectés au serveur avec différents sockets.

Il existe différentes manières d’y parvenir. L'un d'eux est le multithread. Avec l’aide du multithreading, nous pouvons y parvenir. Nous pouvons implémenter un processus multithreading à l’aide de la fonction select().

Exemple:

Code pour le client :

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