{"version":"1.1","schema_version":"1.1.0","plugin_version":"1.1.2","url":"https://tutos-gameserver.fr/2020/04/24/exemple-de-serveur-et-client-avec-sockets-c-sous-linux-binarytides-serveur-dimpression/","llm_html_url":"https://tutos-gameserver.fr/2020/04/24/exemple-de-serveur-et-client-avec-sockets-c-sous-linux-binarytides-serveur-dimpression/llm","llm_json_url":"https://tutos-gameserver.fr/2020/04/24/exemple-de-serveur-et-client-avec-sockets-c-sous-linux-binarytides-serveur-dimpression/llm.json","manifest_url":"https://tutos-gameserver.fr/llm-endpoints-manifest.json","language":"fr-FR","locale":"fr_FR","title":"Exemple de serveur et client avec sockets C sous Linux &#8211; BinaryTides\n\n &#8211; Serveur d&rsquo;impression","site":{"name":"Tutos GameServer","url":"https://tutos-gameserver.fr/"},"author":{"id":1,"name":"Titanfall","url":"https://tutos-gameserver.fr/author/titanfall/"},"published_at":"2020-04-24T18:23:33+00:00","modified_at":"2020-04-24T18:23:33+00:00","word_count":1191,"reading_time_seconds":358,"summary":"Dans un exemple précédent, nous avons appris les bases de la programmation de socket en C. Dans cet exemple, nous allons construire un client et un serveur ECHO de base. Le serveur / client illustré ici utilise des sockets TCP ou SOCK_STREAM. Les sockets TCP sont orientées connexion, ce qui signifie qu&#39;elles ont un concept [&hellip;]","summary_points":["Dans un exemple précédent, nous avons appris les bases de la programmation de socket en C.","Dans cet exemple, nous allons construire un client et un serveur ECHO de base.","Le serveur / client illustré ici utilise des sockets TCP ou SOCK_STREAM.","Les sockets TCP sont orientées connexion, ce qui signifie qu&#39;elles ont un concept de connexion indépendante sur un certain port qu&#39;une application peut utiliser à la fois."],"topics":["Serveur d'impression"],"entities":[],"entities_metadata":[{"id":10,"name":"Serveur d'impression","slug":"serveur-dimpression","taxonomy":"category","count":3907,"url":"https://tutos-gameserver.fr/category/serveur-dimpression/"}],"tags":["Serveur d'impression"],"content_hash":"06c6782e3a37de10156612db7088ab46","plain_text":"Dans un exemple précédent, nous avons appris les bases de la programmation de socket en C. Dans cet exemple, nous allons construire un client et un serveur ECHO de base. Le serveur / client illustré ici utilise des sockets TCP ou SOCK_STREAM. \n\nLes sockets TCP sont orientées connexion, ce qui signifie qu&#39;elles ont un concept de connexion indépendante sur un certain port qu&#39;une application peut utiliser à la fois. Le concept de connexion fait de TCP un flux &quot;fiable&quot; tel que si des erreurs se produisent, elles peuvent être détectées et compensées en renvoyant les paquets en échec.\nServeur\nPermet de construire un serveur Web très simple. Les étapes pour créer un serveur Web sont les suivantes:\n1. Créer un socket2. Lier à l&#39;adresse et au port3. Mettez en mode d&#39;écoute4. Acceptez les connexions et procédez-y ensuite.\nExemple rapide\n/ *\r\nExemple de serveur de socket C\r\n* /\r\n\r\n#comprendre\r\n#comprendre\t// strlen\r\n#comprendre\r\n#comprendre\t// inet_addr\r\n#comprendre\t//écrire\r\n\r\nint main (int argc, char * argv[])\r\n\r\nint socket_desc, client_sock, c, read_size;\r\nstruct sockaddr_in serveur, client;\r\nchar client_message[2000];\r\n\r\n// Créer un socket\r\nsocket_desc = socket (AF_INET, SOCK_STREAM, 0);\r\nif (socket_desc == -1)\r\n\r\nprintf (&quot;Impossible de créer un socket&quot;);\r\n\r\nmet (&quot;Socket créé&quot;);\r\n\r\n// Préparez la structure sockaddr_in\r\nserver.sin_family = AF_INET;\r\nserver.sin_addr.s_addr = INADDR_ANY;\r\nserver.sin_port = htons (8888);\r\n\r\n//Lier\r\nif (bind (socket_desc, (struct sockaddr *) &amp; server, sizeof (server)) &lt;0)\r\n\r\n// affiche le message d&#39;erreur\r\nperror (&quot;Échec de la liaison. Erreur&quot;);\r\nretour 1;\r\n\r\nmet (&quot;bind done&quot;);\r\n\r\n//Ecoutez\r\nécouter (socket_desc, 3);\r\n\r\n// Accepter et connexion entrante\r\nmet (&quot;En attente de connexions entrantes ...&quot;);\r\nc = sizeof (struct sockaddr_in);\r\n\r\n// accepte la connexion d&#39;un client entrant\r\nclient_sock = accepter (socket_desc, (struct sockaddr *) &amp; client, (socklen_t *) &amp; c);\r\nif (client_sock < 0)\r\n\t\r\n\t\tperror(\"accept failed\");\r\n\t\treturn 1;\r\n\t\r\n\tputs(\"Connection accepted\");\r\n\t\r\n\t//Receive a message from client\r\n\twhile( (read_size = recv(client_sock , client_message , 2000 , 0)) > 0)\r\n\r\n// Renvoie le message au client\r\nwrite (client_sock, client_message, strlen (client_message));\r\n\r\n\r\nif (read_size == 0)\r\n\r\nmet (&quot;Client déconnecté&quot;);\r\nfflush (stdout);\r\n\r\nsinon si (read_size == -1)\r\n\r\nperror (&quot;recv failed&quot;);\r\n\r\n\r\nretourner 0;\r\n\n\nL&#39;exemple de code ci-dessus démarrera un serveur sur le port 8888 de l&#39;hôte local (127.0.0.1)Une fois qu&#39;il reçoit une connexion, il lira certaines entrées du client et répondra avec le même message.Pour tester le serveur, exécutez le serveur, puis connectez-vous à partir d&#39;un autre terminal à l&#39;aide de la commande telnet comme celle-ci\n$ telnet localhost 8888\n\nClient\nMaintenant, au lieu d&#39;utiliser le programme telnet en tant que client, pourquoi ne pas écrire notre propre programme client. Encore assez simple\n/ *\r\nExemple de client C ECHO utilisant des sockets\r\n* /\r\n#comprendre\t// printf\r\n#comprendre\t// strlen\r\n#comprendre\t//prise\r\n#comprendre\t// inet_addr\r\n\r\nint main (int argc, char * argv[])\r\n\r\nchaussette int;\r\nserveur struct sockaddr_in;\r\nmessage char[1000] , server_reply[2000];\r\n\r\n// Créer un socket\r\nchaussette = socket (AF_INET, SOCK_STREAM, 0);\r\nif (chaussette == -1)\r\n\r\nprintf (&quot;Impossible de créer un socket&quot;);\r\n\r\nmet (&quot;Socket créé&quot;);\r\n\r\nserver.sin_addr.s_addr = inet_addr (&quot;127.0.0.1&quot;);\r\nserver.sin_family = AF_INET;\r\nserver.sin_port = htons (8888);\r\n\r\n// Se connecter au serveur distant\r\nif (connect (sock, (struct sockaddr *) &amp; server, sizeof (server)) &lt;0)\r\n\r\nperror (&quot;échec de connexion. Erreur&quot;);\r\nretour 1;\r\n\r\n\r\nmet (&quot;Connecté  n&quot;);\r\n\r\n// continue de communiquer avec le serveur\r\ntandis que (1)\r\n\r\nprintf (&quot;Entrez le message:&quot;);\r\nscanf (&quot;% s&quot;, message);\r\n\r\n// Envoyer des données\r\nif (envoyer (chaussette, message, strlen (message), 0) &lt;0)\r\n\r\nmet (&quot;Échec de l&#39;envoi&quot;);\r\nretour 1;\r\n\r\n\r\n// Recevoir une réponse du serveur\r\nif (recv (sock, server_reply, 2000, 0) &lt;0)\r\n\r\nmet (&quot;recv a échoué&quot;);\r\nPause;\r\n\r\n\r\nmet (&quot;Réponse du serveur:&quot;);\r\nmet (server_reply);\r\n\r\n\r\nfermer (chaussette);\r\nretourner 0;\r\n\nLe programme ci-dessus se connectera au port localhost 8888 et demandera ensuite des commandes à envoyer. Voici un exemple, à quoi ressemblerait la sortie\n\n$ gcc client.c &amp;&amp; ./a.out\nPrise créée\nLié\nEntrez le message: salutRéponse du serveur:salutEntrez un message: comment allez-vous\n\n\nServeur pour gérer plusieurs connexions\nLe serveur dans l&#39;exemple ci-dessus présente un inconvénient. Il peut gérer la communication avec un seul client. Ce n&#39;est pas très utile. Une façon de contourner ce problème consiste à utiliser des threads. Un thread peut être attribué à chaque client connecté qui gérera la communication avec le client.\nExemple de code\n/ *\r\nExemple de serveur de socket C, gère plusieurs clients à l&#39;aide de threads\r\n* /\r\n\r\n#comprendre\r\n#comprendre\t// strlen\r\n#comprendre\t// strlen\r\n#comprendre\r\n#comprendre\t// inet_addr\r\n#comprendre\t//écrire\r\n#comprendre // pour le filetage, lien avec lpthread\r\n\r\n// la fonction thread\r\nvoid * connection_handler (void *);\r\n\r\nint main (int argc, char * argv[])\r\n\r\nint socket_desc, client_sock, c, * new_sock;\r\nstruct sockaddr_in serveur, client;\r\n\r\n// Créer un socket\r\nsocket_desc = socket (AF_INET, SOCK_STREAM, 0);\r\nif (socket_desc == -1)\r\n\r\nprintf (&quot;Impossible de créer un socket&quot;);\r\n\r\nmet (&quot;Socket créé&quot;);\r\n\r\n// Préparez la structure sockaddr_in\r\nserver.sin_family = AF_INET;\r\nserver.sin_addr.s_addr = INADDR_ANY;\r\nserver.sin_port = htons (8888);\r\n\r\n//Lier\r\nif (bind (socket_desc, (struct sockaddr *) &amp; server, sizeof (server)) &lt;0)\r\n\r\n// affiche le message d&#39;erreur\r\nperror (&quot;Échec de la liaison. Erreur&quot;);\r\nretour 1;\r\n\r\nmet (&quot;bind done&quot;);\r\n\r\n//Ecoutez\r\nécouter (socket_desc, 3);\r\n\r\n// Accepter et connexion entrante\r\nmet (&quot;En attente de connexions entrantes ...&quot;);\r\nc = sizeof (struct sockaddr_in);\r\n\r\n\r\n// Accepter et connexion entrante\r\nmet (&quot;En attente de connexions entrantes ...&quot;);\r\nc = sizeof (struct sockaddr_in);\r\nwhile ((client_sock = accept (socket_desc, (struct sockaddr *) &amp; client, (socklen_t *) &amp; c))))\r\n\r\nmet (&quot;Connexion acceptée&quot;);\r\n\r\npthread_t sniffer_thread;\r\nnew_sock = malloc (1);\r\n* new_sock = client_sock;\r\n\r\nif (pthread_create (&amp; sniffer_thread, NULL, connection_handler, (void *) new_sock) &lt;0)\r\n\r\nperror (&quot;impossible de créer un thread&quot;);\r\nretour 1;\r\n\r\n\r\n// Rejoignez maintenant le thread, afin de ne pas terminer avant le thread\r\n// pthread_join (sniffer_thread, NULL);\r\nmet (&quot;Gestionnaire affecté&quot;);\r\n\r\n\r\nif (client_sock < 0)\r\n\t\r\n\t\tperror(\"accept failed\");\r\n\t\treturn 1;\r\n\t\r\n\t\r\n\treturn 0;\r\n\r\n\r\n/*\r\n * This will handle connection for each client\r\n * */\r\nvoid *connection_handler(void *socket_desc)\r\n\r\n\t//Get the socket descriptor\r\n\tint sock = *(int*)socket_desc;\r\n\tint read_size;\r\n\tchar *message , client_message[2000];\r\n\t\r\n\t//Send some messages to the client\r\n\tmessage = \"Greetings! I am your connection handlern\";\r\n\twrite(sock , message , strlen(message));\r\n\t\r\n\tmessage = \"Now type something and i shall repeat what you type n\";\r\n\twrite(sock , message , strlen(message));\r\n\t\r\n\t//Receive a message from client\r\n\twhile( (read_size = recv(sock , client_message , 2000 , 0)) > 0)\r\n\r\n// Renvoie le message au client\r\nwrite (sock, client_message, strlen (client_message));\r\n\r\n\r\nif (read_size == 0)\r\n\r\nmet (&quot;Client déconnecté&quot;);\r\nfflush (stdout);\r\n\r\nsinon si (read_size == -1)\r\n\r\nperror (&quot;recv failed&quot;);\r\n\r\n\r\n// Libère le pointeur de socket\r\ngratuit (socket_desc);\r\n\r\nretourner 0;\r\n\nExécutez le serveur ci-dessus et connectez-vous à partir de plusieurs clients et il les gérera tous. Il existe d&#39;autres façons de gérer plusieurs clients, comme la sélection, le sondage, etc. Nous en parlerons dans un autre article. Till puis pratiquez les exemples de code ci-dessus et profitez-en.\nDernière mise à jour le: 27 novembre 2012\n\nClick to rate this post!\r\n                                   \r\n                               [Total: 0  Average: 0]","paragraphs":["Dans un exemple précédent, nous avons appris les bases de la programmation de socket en C. Dans cet exemple, nous allons construire un client et un serveur ECHO de base. Le serveur / client illustré ici utilise des sockets TCP ou SOCK_STREAM.","Les sockets TCP sont orientées connexion, ce qui signifie qu&#39;elles ont un concept de connexion indépendante sur un certain port qu&#39;une application peut utiliser à la fois. Le concept de connexion fait de TCP un flux &quot;fiable&quot; tel que si des erreurs se produisent, elles peuvent être détectées et compensées en renvoyant les paquets en échec.\nServeur\nPermet de construire un serveur Web très simple. Les étapes pour créer un serveur Web sont les suivantes:\n1. Créer un socket2. Lier à l&#39;adresse et au port3. Mettez en mode d&#39;écoute4. Acceptez les connexions et procédez-y ensuite.\nExemple rapide\n/ *\nExemple de serveur de socket C\n* /","#comprendre\n#comprendre\t// strlen\n#comprendre\n#comprendre\t// inet_addr\n#comprendre\t//écrire","int main (int argc, char * argv[])","int socket_desc, client_sock, c, read_size;\nstruct sockaddr_in serveur, client;\nchar client_message[2000];","// Créer un socket\nsocket_desc = socket (AF_INET, SOCK_STREAM, 0);\nif (socket_desc == -1)","printf (&quot;Impossible de créer un socket&quot;);","met (&quot;Socket créé&quot;);","// Préparez la structure sockaddr_in\nserver.sin_family = AF_INET;\nserver.sin_addr.s_addr = INADDR_ANY;\nserver.sin_port = htons (8888);","//Lier\nif (bind (socket_desc, (struct sockaddr *) &amp; server, sizeof (server)) &lt;0)","// affiche le message d&#39;erreur\nperror (&quot;Échec de la liaison. Erreur&quot;);\nretour 1;","met (&quot;bind done&quot;);","//Ecoutez\nécouter (socket_desc, 3);","// Accepter et connexion entrante\nmet (&quot;En attente de connexions entrantes ...&quot;);\nc = sizeof (struct sockaddr_in);","// accepte la connexion d&#39;un client entrant\nclient_sock = accepter (socket_desc, (struct sockaddr *) &amp; client, (socklen_t *) &amp; c);\nif (client_sock < 0)\n\t\n\t\tperror(\"accept failed\");\n\t\treturn 1;\n\t\n\tputs(\"Connection accepted\");\n\t\n\t//Receive a message from client\n\twhile( (read_size = recv(client_sock , client_message , 2000 , 0)) > 0)","// Renvoie le message au client\nwrite (client_sock, client_message, strlen (client_message));","if (read_size == 0)","met (&quot;Client déconnecté&quot;);\nfflush (stdout);","sinon si (read_size == -1)","perror (&quot;recv failed&quot;);","retourner 0;","L&#39;exemple de code ci-dessus démarrera un serveur sur le port 8888 de l&#39;hôte local (127.0.0.1)Une fois qu&#39;il reçoit une connexion, il lira certaines entrées du client et répondra avec le même message.Pour tester le serveur, exécutez le serveur, puis connectez-vous à partir d&#39;un autre terminal à l&#39;aide de la commande telnet comme celle-ci\n$ telnet localhost 8888","Client\nMaintenant, au lieu d&#39;utiliser le programme telnet en tant que client, pourquoi ne pas écrire notre propre programme client. Encore assez simple\n/ *\nExemple de client C ECHO utilisant des sockets\n* /\n#comprendre\t// printf\n#comprendre\t// strlen\n#comprendre\t//prise\n#comprendre\t// inet_addr","int main (int argc, char * argv[])","chaussette int;\nserveur struct sockaddr_in;\nmessage char[1000] , server_reply[2000];","// Créer un socket\nchaussette = socket (AF_INET, SOCK_STREAM, 0);\nif (chaussette == -1)","printf (&quot;Impossible de créer un socket&quot;);","met (&quot;Socket créé&quot;);","server.sin_addr.s_addr = inet_addr (&quot;127.0.0.1&quot;);\nserver.sin_family = AF_INET;\nserver.sin_port = htons (8888);","// Se connecter au serveur distant\nif (connect (sock, (struct sockaddr *) &amp; server, sizeof (server)) &lt;0)","perror (&quot;échec de connexion. Erreur&quot;);\nretour 1;","met (&quot;Connecté  n&quot;);","// continue de communiquer avec le serveur\ntandis que (1)","printf (&quot;Entrez le message:&quot;);\nscanf (&quot;% s&quot;, message);","// Envoyer des données\nif (envoyer (chaussette, message, strlen (message), 0) &lt;0)","met (&quot;Échec de l&#39;envoi&quot;);\nretour 1;","// Recevoir une réponse du serveur\nif (recv (sock, server_reply, 2000, 0) &lt;0)","met (&quot;recv a échoué&quot;);\nPause;","met (&quot;Réponse du serveur:&quot;);\nmet (server_reply);","fermer (chaussette);\nretourner 0;","Le programme ci-dessus se connectera au port localhost 8888 et demandera ensuite des commandes à envoyer. Voici un exemple, à quoi ressemblerait la sortie","$ gcc client.c &amp;&amp; ./a.out\nPrise créée\nLié\nEntrez le message: salutRéponse du serveur:salutEntrez un message: comment allez-vous","Serveur pour gérer plusieurs connexions\nLe serveur dans l&#39;exemple ci-dessus présente un inconvénient. Il peut gérer la communication avec un seul client. Ce n&#39;est pas très utile. Une façon de contourner ce problème consiste à utiliser des threads. Un thread peut être attribué à chaque client connecté qui gérera la communication avec le client.\nExemple de code\n/ *\nExemple de serveur de socket C, gère plusieurs clients à l&#39;aide de threads\n* /","#comprendre\n#comprendre\t// strlen\n#comprendre\t// strlen\n#comprendre\n#comprendre\t// inet_addr\n#comprendre\t//écrire\n#comprendre // pour le filetage, lien avec lpthread","// la fonction thread\nvoid * connection_handler (void *);","int main (int argc, char * argv[])","int socket_desc, client_sock, c, * new_sock;\nstruct sockaddr_in serveur, client;","// Créer un socket\nsocket_desc = socket (AF_INET, SOCK_STREAM, 0);\nif (socket_desc == -1)","printf (&quot;Impossible de créer un socket&quot;);","met (&quot;Socket créé&quot;);","// Préparez la structure sockaddr_in\nserver.sin_family = AF_INET;\nserver.sin_addr.s_addr = INADDR_ANY;\nserver.sin_port = htons (8888);","//Lier\nif (bind (socket_desc, (struct sockaddr *) &amp; server, sizeof (server)) &lt;0)","// affiche le message d&#39;erreur\nperror (&quot;Échec de la liaison. Erreur&quot;);\nretour 1;","met (&quot;bind done&quot;);","//Ecoutez\nécouter (socket_desc, 3);","// Accepter et connexion entrante\nmet (&quot;En attente de connexions entrantes ...&quot;);\nc = sizeof (struct sockaddr_in);","// Accepter et connexion entrante\nmet (&quot;En attente de connexions entrantes ...&quot;);\nc = sizeof (struct sockaddr_in);\nwhile ((client_sock = accept (socket_desc, (struct sockaddr *) &amp; client, (socklen_t *) &amp; c))))","met (&quot;Connexion acceptée&quot;);","pthread_t sniffer_thread;\nnew_sock = malloc (1);\n* new_sock = client_sock;","if (pthread_create (&amp; sniffer_thread, NULL, connection_handler, (void *) new_sock) &lt;0)","perror (&quot;impossible de créer un thread&quot;);\nretour 1;","// Rejoignez maintenant le thread, afin de ne pas terminer avant le thread\n// pthread_join (sniffer_thread, NULL);\nmet (&quot;Gestionnaire affecté&quot;);","if (client_sock < 0)\n\t\n\t\tperror(\"accept failed\");\n\t\treturn 1;\n\t\n\t\n\treturn 0;","/*\n * This will handle connection for each client\n * */\nvoid *connection_handler(void *socket_desc)","//Get the socket descriptor\n\tint sock = *(int*)socket_desc;\n\tint read_size;\n\tchar *message , client_message[2000];\n\t\n\t//Send some messages to the client\n\tmessage = \"Greetings! I am your connection handlern\";\n\twrite(sock , message , strlen(message));\n\t\n\tmessage = \"Now type something and i shall repeat what you type n\";\n\twrite(sock , message , strlen(message));\n\t\n\t//Receive a message from client\n\twhile( (read_size = recv(sock , client_message , 2000 , 0)) > 0)","// Renvoie le message au client\nwrite (sock, client_message, strlen (client_message));","if (read_size == 0)","met (&quot;Client déconnecté&quot;);\nfflush (stdout);","sinon si (read_size == -1)","perror (&quot;recv failed&quot;);","// Libère le pointeur de socket\ngratuit (socket_desc);","retourner 0;","Exécutez le serveur ci-dessus et connectez-vous à partir de plusieurs clients et il les gérera tous. Il existe d&#39;autres façons de gérer plusieurs clients, comme la sélection, le sondage, etc. Nous en parlerons dans un autre article. Till puis pratiquez les exemples de code ci-dessus et profitez-en.\nDernière mise à jour le: 27 novembre 2012","Click to rate this post!\n                                   \n                               [Total: 0  Average: 0]"],"content_blocks":[{"id":"text-1","type":"text","heading":"","plain_text":"Dans un exemple précédent, nous avons appris les bases de la programmation de socket en C. Dans cet exemple, nous allons construire un client et un serveur ECHO de base. Le serveur / client illustré ici utilise des sockets TCP ou SOCK_STREAM.","html":"<p>Dans un exemple précédent, nous avons appris les bases de la programmation de socket en C. Dans cet exemple, nous allons construire un client et un serveur ECHO de base. Le serveur / client illustré ici utilise des sockets TCP ou SOCK_STREAM.</p>"},{"id":"text-2","type":"text","heading":"","plain_text":"Les sockets TCP sont orientées connexion, ce qui signifie qu&#39;elles ont un concept de connexion indépendante sur un certain port qu&#39;une application peut utiliser à la fois. Le concept de connexion fait de TCP un flux &quot;fiable&quot; tel que si des erreurs se produisent, elles peuvent être détectées et compensées en renvoyant les paquets en échec.\nServeur\nPermet de construire un serveur Web très simple. Les étapes pour créer un serveur Web sont les suivantes:\n1. Créer un socket2. Lier à l&#39;adresse et au port3. Mettez en mode d&#39;écoute4. Acceptez les connexions et procédez-y ensuite.\nExemple rapide\n/ *\nExemple de serveur de socket C\n* /","html":"<p>Les sockets TCP sont orientées connexion, ce qui signifie qu&#039;elles ont un concept de connexion indépendante sur un certain port qu&#039;une application peut utiliser à la fois. Le concept de connexion fait de TCP un flux &quot;fiable&quot; tel que si des erreurs se produisent, elles peuvent être détectées et compensées en renvoyant les paquets en échec.\nServeur\nPermet de construire un serveur Web très simple. Les étapes pour créer un serveur Web sont les suivantes:\n1. Créer un socket2. Lier à l&#039;adresse et au port3. Mettez en mode d&#039;écoute4. Acceptez les connexions et procédez-y ensuite.\nExemple rapide\n/ *\nExemple de serveur de socket C\n* /</p>"},{"id":"text-3","type":"text","heading":"","plain_text":"#comprendre\n#comprendre\t// strlen\n#comprendre\n#comprendre\t// inet_addr\n#comprendre\t//écrire","html":"<p>#comprendre\n#comprendre\t// strlen\n#comprendre\n#comprendre\t// inet_addr\n#comprendre\t//écrire</p>"},{"id":"text-4","type":"text","heading":"","plain_text":"int main (int argc, char * argv[])","html":"<p>int main (int argc, char * argv[])</p>"},{"id":"text-5","type":"text","heading":"","plain_text":"int socket_desc, client_sock, c, read_size;\nstruct sockaddr_in serveur, client;\nchar client_message[2000];","html":"<p>int socket_desc, client_sock, c, read_size;\nstruct sockaddr_in serveur, client;\nchar client_message[2000];</p>"},{"id":"text-6","type":"text","heading":"","plain_text":"// Créer un socket\nsocket_desc = socket (AF_INET, SOCK_STREAM, 0);\nif (socket_desc == -1)","html":"<p>// Créer un socket\nsocket_desc = socket (AF_INET, SOCK_STREAM, 0);\nif (socket_desc == -1)</p>"},{"id":"text-7","type":"text","heading":"","plain_text":"printf (&quot;Impossible de créer un socket&quot;);","html":"<p>printf (&quot;Impossible de créer un socket&quot;);</p>"},{"id":"text-8","type":"text","heading":"","plain_text":"met (&quot;Socket créé&quot;);","html":"<p>met (&quot;Socket créé&quot;);</p>"},{"id":"text-9","type":"text","heading":"","plain_text":"// Préparez la structure sockaddr_in\nserver.sin_family = AF_INET;\nserver.sin_addr.s_addr = INADDR_ANY;\nserver.sin_port = htons (8888);","html":"<p>// Préparez la structure sockaddr_in\nserver.sin_family = AF_INET;\nserver.sin_addr.s_addr = INADDR_ANY;\nserver.sin_port = htons (8888);</p>"},{"id":"text-10","type":"text","heading":"","plain_text":"//Lier\nif (bind (socket_desc, (struct sockaddr *) &amp; server, sizeof (server)) &lt;0)","html":"<p>//Lier\nif (bind (socket_desc, (struct sockaddr *) &amp; server, sizeof (server)) &lt;0)</p>"},{"id":"text-11","type":"text","heading":"","plain_text":"// affiche le message d&#39;erreur\nperror (&quot;Échec de la liaison. Erreur&quot;);\nretour 1;","html":"<p>// affiche le message d&#039;erreur\nperror (&quot;Échec de la liaison. Erreur&quot;);\nretour 1;</p>"},{"id":"text-12","type":"text","heading":"","plain_text":"met (&quot;bind done&quot;);","html":"<p>met (&quot;bind done&quot;);</p>"},{"id":"text-13","type":"text","heading":"","plain_text":"//Ecoutez\nécouter (socket_desc, 3);","html":"<p>//Ecoutez\nécouter (socket_desc, 3);</p>"},{"id":"text-14","type":"text","heading":"","plain_text":"// Accepter et connexion entrante\nmet (&quot;En attente de connexions entrantes ...&quot;);\nc = sizeof (struct sockaddr_in);","html":"<p>// Accepter et connexion entrante\nmet (&quot;En attente de connexions entrantes ...&quot;);\nc = sizeof (struct sockaddr_in);</p>"},{"id":"text-15","type":"text","heading":"","plain_text":"// accepte la connexion d&#39;un client entrant\nclient_sock = accepter (socket_desc, (struct sockaddr *) &amp; client, (socklen_t *) &amp; c);\nif (client_sock < 0)\n\t\n\t\tperror(\"accept failed\");\n\t\treturn 1;\n\t\n\tputs(\"Connection accepted\");\n\t\n\t//Receive a message from client\n\twhile( (read_size = recv(client_sock , client_message , 2000 , 0)) > 0)","html":"<p>// accepte la connexion d&#039;un client entrant\nclient_sock = accepter (socket_desc, (struct sockaddr *) &amp; client, (socklen_t *) &amp; c);\nif (client_sock &lt; 0)\n\t\n\t\tperror(&quot;accept failed&quot;);\n\t\treturn 1;\n\t\n\tputs(&quot;Connection accepted&quot;);\n\t\n\t//Receive a message from client\n\twhile( (read_size = recv(client_sock , client_message , 2000 , 0)) &gt; 0)</p>"},{"id":"text-16","type":"text","heading":"","plain_text":"// Renvoie le message au client\nwrite (client_sock, client_message, strlen (client_message));","html":"<p>// Renvoie le message au client\nwrite (client_sock, client_message, strlen (client_message));</p>"},{"id":"text-17","type":"text","heading":"","plain_text":"if (read_size == 0)","html":"<p>if (read_size == 0)</p>"},{"id":"text-18","type":"text","heading":"","plain_text":"met (&quot;Client déconnecté&quot;);\nfflush (stdout);","html":"<p>met (&quot;Client déconnecté&quot;);\nfflush (stdout);</p>"},{"id":"text-19","type":"text","heading":"","plain_text":"sinon si (read_size == -1)","html":"<p>sinon si (read_size == -1)</p>"},{"id":"text-20","type":"text","heading":"","plain_text":"perror (&quot;recv failed&quot;);","html":"<p>perror (&quot;recv failed&quot;);</p>"},{"id":"text-21","type":"text","heading":"","plain_text":"retourner 0;","html":"<p>retourner 0;</p>"},{"id":"text-22","type":"text","heading":"","plain_text":"L&#39;exemple de code ci-dessus démarrera un serveur sur le port 8888 de l&#39;hôte local (127.0.0.1)Une fois qu&#39;il reçoit une connexion, il lira certaines entrées du client et répondra avec le même message.Pour tester le serveur, exécutez le serveur, puis connectez-vous à partir d&#39;un autre terminal à l&#39;aide de la commande telnet comme celle-ci\n$ telnet localhost 8888","html":"<p>L&#039;exemple de code ci-dessus démarrera un serveur sur le port 8888 de l&#039;hôte local (127.0.0.1)Une fois qu&#039;il reçoit une connexion, il lira certaines entrées du client et répondra avec le même message.Pour tester le serveur, exécutez le serveur, puis connectez-vous à partir d&#039;un autre terminal à l&#039;aide de la commande telnet comme celle-ci\n$ telnet localhost 8888</p>"},{"id":"text-23","type":"text","heading":"","plain_text":"Client\nMaintenant, au lieu d&#39;utiliser le programme telnet en tant que client, pourquoi ne pas écrire notre propre programme client. Encore assez simple\n/ *\nExemple de client C ECHO utilisant des sockets\n* /\n#comprendre\t// printf\n#comprendre\t// strlen\n#comprendre\t//prise\n#comprendre\t// inet_addr","html":"<p>Client\nMaintenant, au lieu d&#039;utiliser le programme telnet en tant que client, pourquoi ne pas écrire notre propre programme client. Encore assez simple\n/ *\nExemple de client C ECHO utilisant des sockets\n* /\n#comprendre\t// printf\n#comprendre\t// strlen\n#comprendre\t//prise\n#comprendre\t// inet_addr</p>"},{"id":"text-24","type":"text","heading":"","plain_text":"int main (int argc, char * argv[])","html":"<p>int main (int argc, char * argv[])</p>"},{"id":"text-25","type":"text","heading":"","plain_text":"chaussette int;\nserveur struct sockaddr_in;\nmessage char[1000] , server_reply[2000];","html":"<p>chaussette int;\nserveur struct sockaddr_in;\nmessage char[1000] , server_reply[2000];</p>"},{"id":"text-26","type":"text","heading":"","plain_text":"// Créer un socket\nchaussette = socket (AF_INET, SOCK_STREAM, 0);\nif (chaussette == -1)","html":"<p>// Créer un socket\nchaussette = socket (AF_INET, SOCK_STREAM, 0);\nif (chaussette == -1)</p>"},{"id":"text-27","type":"text","heading":"","plain_text":"printf (&quot;Impossible de créer un socket&quot;);","html":"<p>printf (&quot;Impossible de créer un socket&quot;);</p>"},{"id":"text-28","type":"text","heading":"","plain_text":"met (&quot;Socket créé&quot;);","html":"<p>met (&quot;Socket créé&quot;);</p>"},{"id":"text-29","type":"text","heading":"","plain_text":"server.sin_addr.s_addr = inet_addr (&quot;127.0.0.1&quot;);\nserver.sin_family = AF_INET;\nserver.sin_port = htons (8888);","html":"<p>server.sin_addr.s_addr = inet_addr (&quot;127.0.0.1&quot;);\nserver.sin_family = AF_INET;\nserver.sin_port = htons (8888);</p>"},{"id":"text-30","type":"text","heading":"","plain_text":"// Se connecter au serveur distant\nif (connect (sock, (struct sockaddr *) &amp; server, sizeof (server)) &lt;0)","html":"<p>// Se connecter au serveur distant\nif (connect (sock, (struct sockaddr *) &amp; server, sizeof (server)) &lt;0)</p>"},{"id":"text-31","type":"text","heading":"","plain_text":"perror (&quot;échec de connexion. Erreur&quot;);\nretour 1;","html":"<p>perror (&quot;échec de connexion. Erreur&quot;);\nretour 1;</p>"},{"id":"text-32","type":"text","heading":"","plain_text":"met (&quot;Connecté  n&quot;);","html":"<p>met (&quot;Connecté  n&quot;);</p>"},{"id":"text-33","type":"text","heading":"","plain_text":"// continue de communiquer avec le serveur\ntandis que (1)","html":"<p>// continue de communiquer avec le serveur\ntandis que (1)</p>"},{"id":"text-34","type":"text","heading":"","plain_text":"printf (&quot;Entrez le message:&quot;);\nscanf (&quot;% s&quot;, message);","html":"<p>printf (&quot;Entrez le message:&quot;);\nscanf (&quot;% s&quot;, message);</p>"},{"id":"text-35","type":"text","heading":"","plain_text":"// Envoyer des données\nif (envoyer (chaussette, message, strlen (message), 0) &lt;0)","html":"<p>// Envoyer des données\nif (envoyer (chaussette, message, strlen (message), 0) &lt;0)</p>"},{"id":"text-36","type":"text","heading":"","plain_text":"met (&quot;Échec de l&#39;envoi&quot;);\nretour 1;","html":"<p>met (&quot;Échec de l&#039;envoi&quot;);\nretour 1;</p>"},{"id":"text-37","type":"text","heading":"","plain_text":"// Recevoir une réponse du serveur\nif (recv (sock, server_reply, 2000, 0) &lt;0)","html":"<p>// Recevoir une réponse du serveur\nif (recv (sock, server_reply, 2000, 0) &lt;0)</p>"},{"id":"text-38","type":"text","heading":"","plain_text":"met (&quot;recv a échoué&quot;);\nPause;","html":"<p>met (&quot;recv a échoué&quot;);\nPause;</p>"},{"id":"text-39","type":"text","heading":"","plain_text":"met (&quot;Réponse du serveur:&quot;);\nmet (server_reply);","html":"<p>met (&quot;Réponse du serveur:&quot;);\nmet (server_reply);</p>"},{"id":"text-40","type":"text","heading":"","plain_text":"fermer (chaussette);\nretourner 0;","html":"<p>fermer (chaussette);\nretourner 0;</p>"},{"id":"text-41","type":"text","heading":"","plain_text":"Le programme ci-dessus se connectera au port localhost 8888 et demandera ensuite des commandes à envoyer. Voici un exemple, à quoi ressemblerait la sortie","html":"<p>Le programme ci-dessus se connectera au port localhost 8888 et demandera ensuite des commandes à envoyer. Voici un exemple, à quoi ressemblerait la sortie</p>"},{"id":"text-42","type":"text","heading":"","plain_text":"$ gcc client.c &amp;&amp; ./a.out\nPrise créée\nLié\nEntrez le message: salutRéponse du serveur:salutEntrez un message: comment allez-vous","html":"<p>$ gcc client.c &amp;&amp; ./a.out\nPrise créée\nLié\nEntrez le message: salutRéponse du serveur:salutEntrez un message: comment allez-vous</p>"},{"id":"text-43","type":"text","heading":"","plain_text":"Serveur pour gérer plusieurs connexions\nLe serveur dans l&#39;exemple ci-dessus présente un inconvénient. Il peut gérer la communication avec un seul client. Ce n&#39;est pas très utile. Une façon de contourner ce problème consiste à utiliser des threads. Un thread peut être attribué à chaque client connecté qui gérera la communication avec le client.\nExemple de code\n/ *\nExemple de serveur de socket C, gère plusieurs clients à l&#39;aide de threads\n* /","html":"<p>Serveur pour gérer plusieurs connexions\nLe serveur dans l&#039;exemple ci-dessus présente un inconvénient. Il peut gérer la communication avec un seul client. Ce n&#039;est pas très utile. Une façon de contourner ce problème consiste à utiliser des threads. Un thread peut être attribué à chaque client connecté qui gérera la communication avec le client.\nExemple de code\n/ *\nExemple de serveur de socket C, gère plusieurs clients à l&#039;aide de threads\n* /</p>"},{"id":"text-44","type":"text","heading":"","plain_text":"#comprendre\n#comprendre\t// strlen\n#comprendre\t// strlen\n#comprendre\n#comprendre\t// inet_addr\n#comprendre\t//écrire\n#comprendre // pour le filetage, lien avec lpthread","html":"<p>#comprendre\n#comprendre\t// strlen\n#comprendre\t// strlen\n#comprendre\n#comprendre\t// inet_addr\n#comprendre\t//écrire\n#comprendre // pour le filetage, lien avec lpthread</p>"},{"id":"text-45","type":"text","heading":"","plain_text":"// la fonction thread\nvoid * connection_handler (void *);","html":"<p>// la fonction thread\nvoid * connection_handler (void *);</p>"},{"id":"text-46","type":"text","heading":"","plain_text":"int main (int argc, char * argv[])","html":"<p>int main (int argc, char * argv[])</p>"},{"id":"text-47","type":"text","heading":"","plain_text":"int socket_desc, client_sock, c, * new_sock;\nstruct sockaddr_in serveur, client;","html":"<p>int socket_desc, client_sock, c, * new_sock;\nstruct sockaddr_in serveur, client;</p>"},{"id":"text-48","type":"text","heading":"","plain_text":"// Créer un socket\nsocket_desc = socket (AF_INET, SOCK_STREAM, 0);\nif (socket_desc == -1)","html":"<p>// Créer un socket\nsocket_desc = socket (AF_INET, SOCK_STREAM, 0);\nif (socket_desc == -1)</p>"},{"id":"text-49","type":"text","heading":"","plain_text":"printf (&quot;Impossible de créer un socket&quot;);","html":"<p>printf (&quot;Impossible de créer un socket&quot;);</p>"},{"id":"text-50","type":"text","heading":"","plain_text":"met (&quot;Socket créé&quot;);","html":"<p>met (&quot;Socket créé&quot;);</p>"},{"id":"text-51","type":"text","heading":"","plain_text":"// Préparez la structure sockaddr_in\nserver.sin_family = AF_INET;\nserver.sin_addr.s_addr = INADDR_ANY;\nserver.sin_port = htons (8888);","html":"<p>// Préparez la structure sockaddr_in\nserver.sin_family = AF_INET;\nserver.sin_addr.s_addr = INADDR_ANY;\nserver.sin_port = htons (8888);</p>"},{"id":"text-52","type":"text","heading":"","plain_text":"//Lier\nif (bind (socket_desc, (struct sockaddr *) &amp; server, sizeof (server)) &lt;0)","html":"<p>//Lier\nif (bind (socket_desc, (struct sockaddr *) &amp; server, sizeof (server)) &lt;0)</p>"},{"id":"text-53","type":"text","heading":"","plain_text":"// affiche le message d&#39;erreur\nperror (&quot;Échec de la liaison. Erreur&quot;);\nretour 1;","html":"<p>// affiche le message d&#039;erreur\nperror (&quot;Échec de la liaison. Erreur&quot;);\nretour 1;</p>"},{"id":"text-54","type":"text","heading":"","plain_text":"met (&quot;bind done&quot;);","html":"<p>met (&quot;bind done&quot;);</p>"},{"id":"text-55","type":"text","heading":"","plain_text":"//Ecoutez\nécouter (socket_desc, 3);","html":"<p>//Ecoutez\nécouter (socket_desc, 3);</p>"},{"id":"text-56","type":"text","heading":"","plain_text":"// Accepter et connexion entrante\nmet (&quot;En attente de connexions entrantes ...&quot;);\nc = sizeof (struct sockaddr_in);","html":"<p>// Accepter et connexion entrante\nmet (&quot;En attente de connexions entrantes ...&quot;);\nc = sizeof (struct sockaddr_in);</p>"},{"id":"text-57","type":"text","heading":"","plain_text":"// Accepter et connexion entrante\nmet (&quot;En attente de connexions entrantes ...&quot;);\nc = sizeof (struct sockaddr_in);\nwhile ((client_sock = accept (socket_desc, (struct sockaddr *) &amp; client, (socklen_t *) &amp; c))))","html":"<p>// Accepter et connexion entrante\nmet (&quot;En attente de connexions entrantes ...&quot;);\nc = sizeof (struct sockaddr_in);\nwhile ((client_sock = accept (socket_desc, (struct sockaddr *) &amp; client, (socklen_t *) &amp; c))))</p>"},{"id":"text-58","type":"text","heading":"","plain_text":"met (&quot;Connexion acceptée&quot;);","html":"<p>met (&quot;Connexion acceptée&quot;);</p>"},{"id":"text-59","type":"text","heading":"","plain_text":"pthread_t sniffer_thread;\nnew_sock = malloc (1);\n* new_sock = client_sock;","html":"<p>pthread_t sniffer_thread;\nnew_sock = malloc (1);\n* new_sock = client_sock;</p>"},{"id":"text-60","type":"text","heading":"","plain_text":"if (pthread_create (&amp; sniffer_thread, NULL, connection_handler, (void *) new_sock) &lt;0)","html":"<p>if (pthread_create (&amp; sniffer_thread, NULL, connection_handler, (void *) new_sock) &lt;0)</p>"},{"id":"text-61","type":"text","heading":"","plain_text":"perror (&quot;impossible de créer un thread&quot;);\nretour 1;","html":"<p>perror (&quot;impossible de créer un thread&quot;);\nretour 1;</p>"},{"id":"text-62","type":"text","heading":"","plain_text":"// Rejoignez maintenant le thread, afin de ne pas terminer avant le thread\n// pthread_join (sniffer_thread, NULL);\nmet (&quot;Gestionnaire affecté&quot;);","html":"<p>// Rejoignez maintenant le thread, afin de ne pas terminer avant le thread\n// pthread_join (sniffer_thread, NULL);\nmet (&quot;Gestionnaire affecté&quot;);</p>"},{"id":"text-63","type":"text","heading":"","plain_text":"if (client_sock < 0)\n\t\n\t\tperror(\"accept failed\");\n\t\treturn 1;\n\t\n\t\n\treturn 0;","html":"<p>if (client_sock &lt; 0)\n\t\n\t\tperror(&quot;accept failed&quot;);\n\t\treturn 1;\n\t\n\t\n\treturn 0;</p>"},{"id":"text-64","type":"text","heading":"","plain_text":"/*\n * This will handle connection for each client\n * */\nvoid *connection_handler(void *socket_desc)","html":"<p>/*\n * This will handle connection for each client\n * */\nvoid *connection_handler(void *socket_desc)</p>"},{"id":"text-65","type":"text","heading":"","plain_text":"//Get the socket descriptor\n\tint sock = *(int*)socket_desc;\n\tint read_size;\n\tchar *message , client_message[2000];\n\t\n\t//Send some messages to the client\n\tmessage = \"Greetings! I am your connection handlern\";\n\twrite(sock , message , strlen(message));\n\t\n\tmessage = \"Now type something and i shall repeat what you type n\";\n\twrite(sock , message , strlen(message));\n\t\n\t//Receive a message from client\n\twhile( (read_size = recv(sock , client_message , 2000 , 0)) > 0)","html":"<p>//Get the socket descriptor\n\tint sock = *(int*)socket_desc;\n\tint read_size;\n\tchar *message , client_message[2000];\n\t\n\t//Send some messages to the client\n\tmessage = &quot;Greetings! I am your connection handlern&quot;;\n\twrite(sock , message , strlen(message));\n\t\n\tmessage = &quot;Now type something and i shall repeat what you type n&quot;;\n\twrite(sock , message , strlen(message));\n\t\n\t//Receive a message from client\n\twhile( (read_size = recv(sock , client_message , 2000 , 0)) &gt; 0)</p>"},{"id":"text-66","type":"text","heading":"","plain_text":"// Renvoie le message au client\nwrite (sock, client_message, strlen (client_message));","html":"<p>// Renvoie le message au client\nwrite (sock, client_message, strlen (client_message));</p>"},{"id":"text-67","type":"text","heading":"","plain_text":"if (read_size == 0)","html":"<p>if (read_size == 0)</p>"},{"id":"text-68","type":"text","heading":"","plain_text":"met (&quot;Client déconnecté&quot;);\nfflush (stdout);","html":"<p>met (&quot;Client déconnecté&quot;);\nfflush (stdout);</p>"},{"id":"text-69","type":"text","heading":"","plain_text":"sinon si (read_size == -1)","html":"<p>sinon si (read_size == -1)</p>"},{"id":"text-70","type":"text","heading":"","plain_text":"perror (&quot;recv failed&quot;);","html":"<p>perror (&quot;recv failed&quot;);</p>"},{"id":"text-71","type":"text","heading":"","plain_text":"// Libère le pointeur de socket\ngratuit (socket_desc);","html":"<p>// Libère le pointeur de socket\ngratuit (socket_desc);</p>"},{"id":"text-72","type":"text","heading":"","plain_text":"retourner 0;","html":"<p>retourner 0;</p>"},{"id":"text-73","type":"text","heading":"","plain_text":"Exécutez le serveur ci-dessus et connectez-vous à partir de plusieurs clients et il les gérera tous. Il existe d&#39;autres façons de gérer plusieurs clients, comme la sélection, le sondage, etc. Nous en parlerons dans un autre article. Till puis pratiquez les exemples de code ci-dessus et profitez-en.\nDernière mise à jour le: 27 novembre 2012","html":"<p>Exécutez le serveur ci-dessus et connectez-vous à partir de plusieurs clients et il les gérera tous. Il existe d&#039;autres façons de gérer plusieurs clients, comme la sélection, le sondage, etc. Nous en parlerons dans un autre article. Till puis pratiquez les exemples de code ci-dessus et profitez-en.\nDernière mise à jour le: 27 novembre 2012</p>"},{"id":"text-74","type":"text","heading":"","plain_text":"Click to rate this post!\n                                   \n                               [Total: 0  Average: 0]","html":"<p>Click to rate this post!\n                                   \n                               [Total: 0  Average: 0]</p>"}],"sections":[{"id":"text-1","heading":"Text","content":"Dans un exemple précédent, nous avons appris les bases de la programmation de socket en C. Dans cet exemple, nous allons construire un client et un serveur ECHO de base. Le serveur / client illustré ici utilise des sockets TCP ou SOCK_STREAM."},{"id":"text-2","heading":"Text","content":"Les sockets TCP sont orientées connexion, ce qui signifie qu&#39;elles ont un concept de connexion indépendante sur un certain port qu&#39;une application peut utiliser à la fois. Le concept de connexion fait de TCP un flux &quot;fiable&quot; tel que si des erreurs se produisent, elles peuvent être détectées et compensées en renvoyant les paquets en échec.\nServeur\nPermet de construire un serveur Web très simple. Les étapes pour créer un serveur Web sont les suivantes:\n1. Créer un socket2. Lier à l&#39;adresse et au port3. Mettez en mode d&#39;écoute4. Acceptez les connexions et procédez-y ensuite.\nExemple rapide\n/ *\nExemple de serveur de socket C\n* /"},{"id":"text-3","heading":"Text","content":"#comprendre\n#comprendre\t// strlen\n#comprendre\n#comprendre\t// inet_addr\n#comprendre\t//écrire"},{"id":"text-4","heading":"Text","content":"int main (int argc, char * argv[])"},{"id":"text-5","heading":"Text","content":"int socket_desc, client_sock, c, read_size;\nstruct sockaddr_in serveur, client;\nchar client_message[2000];"},{"id":"text-6","heading":"Text","content":"// Créer un socket\nsocket_desc = socket (AF_INET, SOCK_STREAM, 0);\nif (socket_desc == -1)"},{"id":"text-7","heading":"Text","content":"printf (&quot;Impossible de créer un socket&quot;);"},{"id":"text-8","heading":"Text","content":"met (&quot;Socket créé&quot;);"},{"id":"text-9","heading":"Text","content":"// Préparez la structure sockaddr_in\nserver.sin_family = AF_INET;\nserver.sin_addr.s_addr = INADDR_ANY;\nserver.sin_port = htons (8888);"},{"id":"text-10","heading":"Text","content":"//Lier\nif (bind (socket_desc, (struct sockaddr *) &amp; server, sizeof (server)) &lt;0)"},{"id":"text-11","heading":"Text","content":"// affiche le message d&#39;erreur\nperror (&quot;Échec de la liaison. Erreur&quot;);\nretour 1;"},{"id":"text-12","heading":"Text","content":"met (&quot;bind done&quot;);"},{"id":"text-13","heading":"Text","content":"//Ecoutez\nécouter (socket_desc, 3);"},{"id":"text-14","heading":"Text","content":"// Accepter et connexion entrante\nmet (&quot;En attente de connexions entrantes ...&quot;);\nc = sizeof (struct sockaddr_in);"},{"id":"text-15","heading":"Text","content":"// accepte la connexion d&#39;un client entrant\nclient_sock = accepter (socket_desc, (struct sockaddr *) &amp; client, (socklen_t *) &amp; c);\nif (client_sock < 0)\n\t\n\t\tperror(\"accept failed\");\n\t\treturn 1;\n\t\n\tputs(\"Connection accepted\");\n\t\n\t//Receive a message from client\n\twhile( (read_size = recv(client_sock , client_message , 2000 , 0)) > 0)"},{"id":"text-16","heading":"Text","content":"// Renvoie le message au client\nwrite (client_sock, client_message, strlen (client_message));"},{"id":"text-17","heading":"Text","content":"if (read_size == 0)"},{"id":"text-18","heading":"Text","content":"met (&quot;Client déconnecté&quot;);\nfflush (stdout);"},{"id":"text-19","heading":"Text","content":"sinon si (read_size == -1)"},{"id":"text-20","heading":"Text","content":"perror (&quot;recv failed&quot;);"},{"id":"text-21","heading":"Text","content":"retourner 0;"},{"id":"text-22","heading":"Text","content":"L&#39;exemple de code ci-dessus démarrera un serveur sur le port 8888 de l&#39;hôte local (127.0.0.1)Une fois qu&#39;il reçoit une connexion, il lira certaines entrées du client et répondra avec le même message.Pour tester le serveur, exécutez le serveur, puis connectez-vous à partir d&#39;un autre terminal à l&#39;aide de la commande telnet comme celle-ci\n$ telnet localhost 8888"},{"id":"text-23","heading":"Text","content":"Client\nMaintenant, au lieu d&#39;utiliser le programme telnet en tant que client, pourquoi ne pas écrire notre propre programme client. Encore assez simple\n/ *\nExemple de client C ECHO utilisant des sockets\n* /\n#comprendre\t// printf\n#comprendre\t// strlen\n#comprendre\t//prise\n#comprendre\t// inet_addr"},{"id":"text-24","heading":"Text","content":"int main (int argc, char * argv[])"},{"id":"text-25","heading":"Text","content":"chaussette int;\nserveur struct sockaddr_in;\nmessage char[1000] , server_reply[2000];"},{"id":"text-26","heading":"Text","content":"// Créer un socket\nchaussette = socket (AF_INET, SOCK_STREAM, 0);\nif (chaussette == -1)"},{"id":"text-27","heading":"Text","content":"printf (&quot;Impossible de créer un socket&quot;);"},{"id":"text-28","heading":"Text","content":"met (&quot;Socket créé&quot;);"},{"id":"text-29","heading":"Text","content":"server.sin_addr.s_addr = inet_addr (&quot;127.0.0.1&quot;);\nserver.sin_family = AF_INET;\nserver.sin_port = htons (8888);"},{"id":"text-30","heading":"Text","content":"// Se connecter au serveur distant\nif (connect (sock, (struct sockaddr *) &amp; server, sizeof (server)) &lt;0)"},{"id":"text-31","heading":"Text","content":"perror (&quot;échec de connexion. Erreur&quot;);\nretour 1;"},{"id":"text-32","heading":"Text","content":"met (&quot;Connecté  n&quot;);"},{"id":"text-33","heading":"Text","content":"// continue de communiquer avec le serveur\ntandis que (1)"},{"id":"text-34","heading":"Text","content":"printf (&quot;Entrez le message:&quot;);\nscanf (&quot;% s&quot;, message);"},{"id":"text-35","heading":"Text","content":"// Envoyer des données\nif (envoyer (chaussette, message, strlen (message), 0) &lt;0)"},{"id":"text-36","heading":"Text","content":"met (&quot;Échec de l&#39;envoi&quot;);\nretour 1;"},{"id":"text-37","heading":"Text","content":"// Recevoir une réponse du serveur\nif (recv (sock, server_reply, 2000, 0) &lt;0)"},{"id":"text-38","heading":"Text","content":"met (&quot;recv a échoué&quot;);\nPause;"},{"id":"text-39","heading":"Text","content":"met (&quot;Réponse du serveur:&quot;);\nmet (server_reply);"},{"id":"text-40","heading":"Text","content":"fermer (chaussette);\nretourner 0;"},{"id":"text-41","heading":"Text","content":"Le programme ci-dessus se connectera au port localhost 8888 et demandera ensuite des commandes à envoyer. Voici un exemple, à quoi ressemblerait la sortie"},{"id":"text-42","heading":"Text","content":"$ gcc client.c &amp;&amp; ./a.out\nPrise créée\nLié\nEntrez le message: salutRéponse du serveur:salutEntrez un message: comment allez-vous"},{"id":"text-43","heading":"Text","content":"Serveur pour gérer plusieurs connexions\nLe serveur dans l&#39;exemple ci-dessus présente un inconvénient. Il peut gérer la communication avec un seul client. Ce n&#39;est pas très utile. Une façon de contourner ce problème consiste à utiliser des threads. Un thread peut être attribué à chaque client connecté qui gérera la communication avec le client.\nExemple de code\n/ *\nExemple de serveur de socket C, gère plusieurs clients à l&#39;aide de threads\n* /"},{"id":"text-44","heading":"Text","content":"#comprendre\n#comprendre\t// strlen\n#comprendre\t// strlen\n#comprendre\n#comprendre\t// inet_addr\n#comprendre\t//écrire\n#comprendre // pour le filetage, lien avec lpthread"},{"id":"text-45","heading":"Text","content":"// la fonction thread\nvoid * connection_handler (void *);"},{"id":"text-46","heading":"Text","content":"int main (int argc, char * argv[])"},{"id":"text-47","heading":"Text","content":"int socket_desc, client_sock, c, * new_sock;\nstruct sockaddr_in serveur, client;"},{"id":"text-48","heading":"Text","content":"// Créer un socket\nsocket_desc = socket (AF_INET, SOCK_STREAM, 0);\nif (socket_desc == -1)"},{"id":"text-49","heading":"Text","content":"printf (&quot;Impossible de créer un socket&quot;);"},{"id":"text-50","heading":"Text","content":"met (&quot;Socket créé&quot;);"},{"id":"text-51","heading":"Text","content":"// Préparez la structure sockaddr_in\nserver.sin_family = AF_INET;\nserver.sin_addr.s_addr = INADDR_ANY;\nserver.sin_port = htons (8888);"},{"id":"text-52","heading":"Text","content":"//Lier\nif (bind (socket_desc, (struct sockaddr *) &amp; server, sizeof (server)) &lt;0)"},{"id":"text-53","heading":"Text","content":"// affiche le message d&#39;erreur\nperror (&quot;Échec de la liaison. Erreur&quot;);\nretour 1;"},{"id":"text-54","heading":"Text","content":"met (&quot;bind done&quot;);"},{"id":"text-55","heading":"Text","content":"//Ecoutez\nécouter (socket_desc, 3);"},{"id":"text-56","heading":"Text","content":"// Accepter et connexion entrante\nmet (&quot;En attente de connexions entrantes ...&quot;);\nc = sizeof (struct sockaddr_in);"},{"id":"text-57","heading":"Text","content":"// Accepter et connexion entrante\nmet (&quot;En attente de connexions entrantes ...&quot;);\nc = sizeof (struct sockaddr_in);\nwhile ((client_sock = accept (socket_desc, (struct sockaddr *) &amp; client, (socklen_t *) &amp; c))))"},{"id":"text-58","heading":"Text","content":"met (&quot;Connexion acceptée&quot;);"},{"id":"text-59","heading":"Text","content":"pthread_t sniffer_thread;\nnew_sock = malloc (1);\n* new_sock = client_sock;"},{"id":"text-60","heading":"Text","content":"if (pthread_create (&amp; sniffer_thread, NULL, connection_handler, (void *) new_sock) &lt;0)"},{"id":"text-61","heading":"Text","content":"perror (&quot;impossible de créer un thread&quot;);\nretour 1;"},{"id":"text-62","heading":"Text","content":"// Rejoignez maintenant le thread, afin de ne pas terminer avant le thread\n// pthread_join (sniffer_thread, NULL);\nmet (&quot;Gestionnaire affecté&quot;);"},{"id":"text-63","heading":"Text","content":"if (client_sock < 0)\n\t\n\t\tperror(\"accept failed\");\n\t\treturn 1;\n\t\n\t\n\treturn 0;"},{"id":"text-64","heading":"Text","content":"/*\n * This will handle connection for each client\n * */\nvoid *connection_handler(void *socket_desc)"},{"id":"text-65","heading":"Text","content":"//Get the socket descriptor\n\tint sock = *(int*)socket_desc;\n\tint read_size;\n\tchar *message , client_message[2000];\n\t\n\t//Send some messages to the client\n\tmessage = \"Greetings! I am your connection handlern\";\n\twrite(sock , message , strlen(message));\n\t\n\tmessage = \"Now type something and i shall repeat what you type n\";\n\twrite(sock , message , strlen(message));\n\t\n\t//Receive a message from client\n\twhile( (read_size = recv(sock , client_message , 2000 , 0)) > 0)"},{"id":"text-66","heading":"Text","content":"// Renvoie le message au client\nwrite (sock, client_message, strlen (client_message));"},{"id":"text-67","heading":"Text","content":"if (read_size == 0)"},{"id":"text-68","heading":"Text","content":"met (&quot;Client déconnecté&quot;);\nfflush (stdout);"},{"id":"text-69","heading":"Text","content":"sinon si (read_size == -1)"},{"id":"text-70","heading":"Text","content":"perror (&quot;recv failed&quot;);"},{"id":"text-71","heading":"Text","content":"// Libère le pointeur de socket\ngratuit (socket_desc);"},{"id":"text-72","heading":"Text","content":"retourner 0;"},{"id":"text-73","heading":"Text","content":"Exécutez le serveur ci-dessus et connectez-vous à partir de plusieurs clients et il les gérera tous. Il existe d&#39;autres façons de gérer plusieurs clients, comme la sélection, le sondage, etc. Nous en parlerons dans un autre article. Till puis pratiquez les exemples de code ci-dessus et profitez-en.\nDernière mise à jour le: 27 novembre 2012"},{"id":"text-74","heading":"Text","content":"Click to rate this post!\n                                   \n                               [Total: 0  Average: 0]"}],"media":{"primary_image":""},"relations":[{"rel":"canonical","href":"https://tutos-gameserver.fr/2020/04/24/exemple-de-serveur-et-client-avec-sockets-c-sous-linux-binarytides-serveur-dimpression/"},{"rel":"alternate","href":"https://tutos-gameserver.fr/2020/04/24/exemple-de-serveur-et-client-avec-sockets-c-sous-linux-binarytides-serveur-dimpression/llm","type":"text/html"},{"rel":"alternate","href":"https://tutos-gameserver.fr/2020/04/24/exemple-de-serveur-et-client-avec-sockets-c-sous-linux-binarytides-serveur-dimpression/llm.json","type":"application/json"},{"rel":"llm-manifest","href":"https://tutos-gameserver.fr/llm-endpoints-manifest.json","type":"application/json"}],"http_headers":{"X-LLM-Friendly":"1","X-LLM-Schema":"1.1.0","Content-Security-Policy":"default-src 'none'; img-src * data:; style-src 'unsafe-inline'"},"license":"CC BY-ND 4.0","attribution_required":true,"allow_cors":false}