<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?action=history&amp;feed=atom&amp;title=Sockets_C</id>
	<title>Sockets C - Historique des versions</title>
	<link rel="self" type="application/atom+xml" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?action=history&amp;feed=atom&amp;title=Sockets_C"/>
	<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Sockets_C&amp;action=history"/>
	<updated>2026-05-19T12:57:31Z</updated>
	<subtitle>Historique des versions pour cette page sur le wiki</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Sockets_C&amp;diff=812&amp;oldid=prev</id>
		<title>Jpinon : Page créée avec « En C programmer les sockets est assez simple même si un peu verbeux.  === Serveur === &lt;syntaxhighlight lang=&quot;c&quot; line=&quot;1&quot;&gt; #include &lt;unistd.h&gt; #include &lt;stdio.h&gt; #include &lt;sys/socket.h&gt; #include &lt;stdlib.h&gt; #include &lt;netinet/in.h&gt; #include &lt;string.h&gt; #include &lt;errno.h&gt; #include &lt;arpa/inet.h&gt; #include &lt;fcntl.h&gt;  // Port d&#039;écoute de la socket #define PORT 8080 // Adresse d&#039;écoute (toutes les adresses) #define IP INADDR_ANY // Taille de la file d&#039;attente #define BA... »</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Sockets_C&amp;diff=812&amp;oldid=prev"/>
		<updated>2024-12-05T20:20:11Z</updated>

		<summary type="html">&lt;p&gt;Page créée avec « En C programmer les sockets est assez simple même si un peu verbeux.  === Serveur === &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt; #include &amp;lt;unistd.h&amp;gt; #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;sys/socket.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; #include &amp;lt;netinet/in.h&amp;gt; #include &amp;lt;string.h&amp;gt; #include &amp;lt;errno.h&amp;gt; #include &amp;lt;arpa/inet.h&amp;gt; #include &amp;lt;fcntl.h&amp;gt;  // Port d&amp;#039;écoute de la socket #define PORT 8080 // Adresse d&amp;#039;écoute (toutes les adresses) #define IP INADDR_ANY // Taille de la file d&amp;#039;attente #define BA... »&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nouvelle page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;En C programmer les sockets est assez simple même si un peu verbeux.&lt;br /&gt;
&lt;br /&gt;
=== Serveur ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/socket.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;netinet/in.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;errno.h&amp;gt;&lt;br /&gt;
#include &amp;lt;arpa/inet.h&amp;gt;&lt;br /&gt;
#include &amp;lt;fcntl.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Port d&amp;#039;écoute de la socket&lt;br /&gt;
#define PORT 8080&lt;br /&gt;
// Adresse d&amp;#039;écoute (toutes les adresses)&lt;br /&gt;
#define IP INADDR_ANY&lt;br /&gt;
// Taille de la file d&amp;#039;attente&lt;br /&gt;
#define BACKLOG 3&lt;br /&gt;
// Nombre de connexions clients&lt;br /&gt;
#define NB_CLIENTS 2&lt;br /&gt;
// Taille du tampon de lecture des messages&lt;br /&gt;
#define BUFFER_LEN 200&lt;br /&gt;
// Commande pour arrêter le serveur&lt;br /&gt;
#define EXIT_WORD &amp;quot;exit&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void initAdresse(struct sockaddr_in * adresse);&lt;br /&gt;
int initSocket(struct sockaddr_in * adresse);&lt;br /&gt;
int waitForClient(int * serverSocket);&lt;br /&gt;
void addClientToTab(int clientSocket, int clients[]);&lt;br /&gt;
void manageClient(int clients[]);&lt;br /&gt;
&lt;br /&gt;
int main(void) {&lt;br /&gt;
   // Création et initialisation du tableau contenant les descripteurs des sockets clients&lt;br /&gt;
   int clients[NB_CLIENTS];&lt;br /&gt;
   for (int i = 0; i &amp;lt; NB_CLIENTS; i++) {&lt;br /&gt;
        clients[i] = -1;&lt;br /&gt;
   }&lt;br /&gt;
   // Structure contenant l&amp;#039;adresse&lt;br /&gt;
   struct sockaddr_in adresse;&lt;br /&gt;
   initAdresse(&amp;amp;adresse);&lt;br /&gt;
   // Descripteur de la socket du serveur&lt;br /&gt;
   int serverSocket = initSocket(&amp;amp;adresse);&lt;br /&gt;
   int clientSocket;&lt;br /&gt;
   while (1) {&lt;br /&gt;
        // Descripteur de la socket du client, on attend une connexion&lt;br /&gt;
        if ((clientSocket = waitForClient(&amp;amp;serverSocket)) != -1) {&lt;br /&gt;
                // On ajoute le nouveau client au tableau des descripteurs&lt;br /&gt;
                addClientToTab(clientSocket, clients);&lt;br /&gt;
        }&lt;br /&gt;
        manageClient(clients);&lt;br /&gt;
   }&lt;br /&gt;
   return EXIT_SUCCESS;&lt;br /&gt;
}&lt;br /&gt;
// Initialisation de la structure sockaddr_in&lt;br /&gt;
void initAdresse(struct sockaddr_in * adresse) {&lt;br /&gt;
   (*adresse).sin_family = AF_INET;&lt;br /&gt;
   (*adresse).sin_addr.s_addr = IP;&lt;br /&gt;
   (*adresse).sin_port = htons( PORT);&lt;br /&gt;
}&lt;br /&gt;
// Démarrage de la socket serveur&lt;br /&gt;
int initSocket(struct sockaddr_in * adresse) {&lt;br /&gt;
   // Descripteur de socket&lt;br /&gt;
   int fdsocket;&lt;br /&gt;
   // Nombre d&amp;#039;options&lt;br /&gt;
   int opt = 1;&lt;br /&gt;
   // Création de la socket en TCP&lt;br /&gt;
   if ((fdsocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) {&lt;br /&gt;
        printf(&amp;quot;Echéc de la création: %s\n&amp;quot;, strerror(errno));&lt;br /&gt;
        exit(EXIT_FAILURE);&lt;br /&gt;
   }&lt;br /&gt;
   printf(&amp;quot;Création de la socket\n&amp;quot;);&lt;br /&gt;
   // Paramètrage de la socket&lt;br /&gt;
   if (setsockopt(fdsocket, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &amp;amp;opt,&lt;br /&gt;
                sizeof(opt)) != 0) {&lt;br /&gt;
        printf(&amp;quot;Echéc de paramètrage: %s\n&amp;quot;, strerror(errno));&lt;br /&gt;
        exit(EXIT_FAILURE);&lt;br /&gt;
   }&lt;br /&gt;
   printf(&amp;quot;Paramètrage de la socket\n&amp;quot;);&lt;br /&gt;
   // Attachement de la socket sur le port et l&amp;#039;adresse IP&lt;br /&gt;
   if (bind(fdsocket, (struct sockaddr *) adresse, sizeof(*adresse)) != 0) {&lt;br /&gt;
        printf(&amp;quot;Echéc d&amp;#039;attachement: %s\n&amp;quot;, strerror(errno));&lt;br /&gt;
        exit(EXIT_FAILURE);&lt;br /&gt;
   }&lt;br /&gt;
   printf(&amp;quot;Attachement de la socket sur le port %i\n&amp;quot;, PORT);&lt;br /&gt;
   // Passage en écoute de la socket&lt;br /&gt;
   if (listen(fdsocket, BACKLOG) != 0) {&lt;br /&gt;
        printf(&amp;quot;Echéc de la mise en écoute: %s\n&amp;quot;, strerror(errno));&lt;br /&gt;
        exit(EXIT_FAILURE);&lt;br /&gt;
   }&lt;br /&gt;
   // Passage en mode non bloquant&lt;br /&gt;
   fcntl(fdsocket, F_SETFL, O_NONBLOCK);&lt;br /&gt;
   printf(&amp;quot;Mise en écoute de la socket\n&amp;quot;);&lt;br /&gt;
   return fdsocket;&lt;br /&gt;
}&lt;br /&gt;
// Attente de connexion d&amp;#039;un client&lt;br /&gt;
int waitForClient(int * serverSocket) {&lt;br /&gt;
   int clientSocket;&lt;br /&gt;
   // Structure contenant l&amp;#039;adresse du client&lt;br /&gt;
   struct sockaddr_in clientAdresse;&lt;br /&gt;
   int addrLen = sizeof(clientAdresse);&lt;br /&gt;
   if ((clientSocket = accept(*serverSocket, (struct sockaddr*) &amp;amp;clientAdresse,&lt;br /&gt;
                (socklen_t*) &amp;amp;addrLen)) != -1) {&lt;br /&gt;
        // Convertion de l&amp;#039;IP en texte&lt;br /&gt;
        char ip[INET_ADDRSTRLEN];&lt;br /&gt;
        inet_ntop(AF_INET, &amp;amp;(clientAdresse.sin_addr), ip, INET_ADDRSTRLEN);&lt;br /&gt;
        printf(&amp;quot;Connexion de %s:%i\n&amp;quot;, ip, clientAdresse.sin_port);&lt;br /&gt;
        // Passage en mode non bloquant&lt;br /&gt;
        int opt = 1;&lt;br /&gt;
        setsockopt(clientSocket, SOL_SOCKET, SO_KEEPALIVE, &amp;amp;opt, sizeof(1));&lt;br /&gt;
   }&lt;br /&gt;
   return clientSocket;&lt;br /&gt;
}&lt;br /&gt;
// Ajoute les clients au tableau&lt;br /&gt;
void addClientToTab(int clientSocket, int clients[]) {&lt;br /&gt;
   // On vérifie si on à de la place de libre&lt;br /&gt;
   int found = -1;&lt;br /&gt;
   for (int i = 0; i &amp;lt; NB_CLIENTS; i++) {&lt;br /&gt;
        // On cherche de la place&lt;br /&gt;
        if (clients[i] == -1) {&lt;br /&gt;
                // On ajoute le client&lt;br /&gt;
                printf(&amp;quot;Ajout du client à l&amp;#039;index %i\n&amp;quot;, i);&lt;br /&gt;
                clients[i] = clientSocket;&lt;br /&gt;
                // Nouvelle connexion, envoie du message de bienvenu&lt;br /&gt;
                send(clientSocket, &amp;quot;Entrez &amp;#039;exit&amp;#039; pour quitter\n&amp;quot;,      strlen(&amp;quot;Entrez &amp;#039;exit&amp;#039; pour quitter\n&amp;quot;),&lt;br /&gt;
                                MSG_DONTWAIT);&lt;br /&gt;
                found = 0;&lt;br /&gt;
                break;&lt;br /&gt;
        }&lt;br /&gt;
   }&lt;br /&gt;
   if (found == -1) {&lt;br /&gt;
        // On a plus de place de libre&lt;br /&gt;
        puts(&amp;quot;Plus de place, désolé&amp;quot;);&lt;br /&gt;
        close(clientSocket);&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
// On traite l&amp;#039;input des clients&lt;br /&gt;
void manageClient(int clients[]) {&lt;br /&gt;
   // Création d&amp;#039;un tampon pour stocker les messages des clients dans la heap&lt;br /&gt;
   static char buffer[BUFFER_LEN + 1];&lt;br /&gt;
   for (int i = 0; i &amp;lt; NB_CLIENTS; i++) {&lt;br /&gt;
        // On vérifie les messages&lt;br /&gt;
        int clientSocket = clients[i];&lt;br /&gt;
        if (clientSocket == -1) {&lt;br /&gt;
                continue;&lt;br /&gt;
        }&lt;br /&gt;
        int len = recv(clientSocket, buffer, BUFFER_LEN, MSG_DONTWAIT);&lt;br /&gt;
        // Booléen pour suivre l&amp;#039;état de la socket&lt;br /&gt;
        int isClosed = 0;&lt;br /&gt;
        if (len == -1 &amp;amp;&amp;amp; errno != EAGAIN) {&lt;br /&gt;
                // Une erreur est survenue&lt;br /&gt;
                printf(&amp;quot;Errno [%i] : %s\n&amp;quot;, errno, strerror(errno));&lt;br /&gt;
                isClosed = 1;&lt;br /&gt;
        } else if (len == 0) {&lt;br /&gt;
                // Le client s&amp;#039;est déconnecté (extrémité de la socket fermée)&lt;br /&gt;
                isClosed = 1;&lt;br /&gt;
        } else if (len &amp;gt; 0) {&lt;br /&gt;
                // Ajout du terminateur de chaîne&lt;br /&gt;
                buffer[len] = &amp;#039;\0&amp;#039;;&lt;br /&gt;
                if (strncmp(buffer, EXIT_WORD, 4) == 0) {&lt;br /&gt;
                        // Le client veut se déconnecter&lt;br /&gt;
                        send(clientSocket, &amp;quot;Bye\n&amp;quot;, strlen(&amp;quot;Bye\n&amp;quot;), 0);&lt;br /&gt;
                        isClosed = 1;&lt;br /&gt;
                } else {&lt;br /&gt;
                        // On renvoie le texte au client dans un buffer assez grand&lt;br /&gt;
                        int len = strlen(&amp;quot;Vous avez dit : &amp;quot;) + strlen(buffer) + 1;&lt;br /&gt;
                        char response[len];&lt;br /&gt;
                        strcpy(response, &amp;quot;Vous avez dit : &amp;quot;);&lt;br /&gt;
                        strcat(response, buffer);&lt;br /&gt;
                        // Un seul envoie permet de ne pas surcharger le réseau&lt;br /&gt;
                        send(clientSocket, response, strlen(response), 0);&lt;br /&gt;
                        printf(&amp;quot;Message: %s\n&amp;quot;,response);&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
        if (isClosed == 1) {&lt;br /&gt;
                // La socket est fermé ou le client veut quitter le serveur !&lt;br /&gt;
                printf(&amp;quot;Fermeture de la connexion avec le client\n&amp;quot;);&lt;br /&gt;
                // Fermeture de la socket&lt;br /&gt;
                close(clientSocket);&lt;br /&gt;
                // On fait de la place dans le tableau&lt;br /&gt;
                clients[i] = -1;&lt;br /&gt;
        }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Lignes 1&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
</feed>