Comment écrire un client / serveur TCP simple en C
La réponse est que l'écriture d'un client et serveur TCP simples nécessite l'interface de programmation de socket fournie par le système d'exploitation. Le serveur termine la communication en créant des prises, des adresses de liaison, en écoutant les ports, en acceptant les connexions et en envoyant et recevant des données. Le client réalise l'interaction en créant des sockets, en se connectant aux serveurs, en envoyant des demandes et en recevant des réponses. L'exemple de code montre l'implémentation de base de l'utilisation de l'API Socket Berkeley sur Linux ou MacOS, y compris les fichiers d'en-tête nécessaires, les paramètres du port, la gestion des erreurs et la version des ressources. Après la compilation, exécutez d'abord le serveur, puis exécutez le client pour obtenir une communication bidirectionnelle. La plate-forme Windows doit initialiser la bibliothèque WinSock. Cet exemple est un modèle d'E / S de blocage, adapté à l'apprentissage de la programmation de base de socket.
L'écriture d'un client et serveur TCP simples en C implique l'utilisation de l'interface de programmation Socket fournie par le système d'exploitation (généralement l'API Berkeley Sockets sur les systèmes de type UNIX, ou WinSock sur Windows). Vous trouverez ci-dessous un exemple de base qui fonctionne sur Linux ou MacOS. Pour Windows, de légères modifications sont nécessaires (comme initialiser Winsock).
Serveur TCP de base en C
Le serveur écoute un port, accepte une connexion client, reçoit un message et envoie une réponse.
// server.cpp #include <iostream> #include <cstring> #include <sys / socket.h> #include <netinet / in.h> #include <unistd.h> int main () { int server_fd, new_socket; struct sockaddr_in adresse; int addRlen = sizeof (adresse); tampon char [1024] = {0}; const char * hello = "Hello from Server"; // Créer un descripteur de fichiers de socket if ((server_fd = socket (af_inet, sock_stream, 0)) == 0) { perror ("socket a échoué"); exit (exit_failure); } // Définir l'adresse du serveur adresse.sin_family = af_inet; adresse.sin_addr.s_addr = inaddr_any; adresse.sin_port = htons (8080); // lier la prise if (bind (server_fd, (struct sockaddr *) & adresse, sizeof (adresse)) <0) { perror ("Bind a échoué"); close (server_fd); exit (exit_failure); } // écoute les connexions entrantes if (écouter (server_fd, 3) <0) { Perror ("écouter"); close (server_fd); exit (exit_failure); } std :: cout << "Écoute du serveur sur le port 8080 ... \ n"; // accepte une connexion if ((new_socket = accepter (server_fd, (struct sockaddr *) & adresse, (socklen_t *) & addrlen)) <0) { Perror ("accepter"); close (server_fd); exit (exit_failure); } // Lire les données du client lire (new_socket, tampon, 1024); std :: cout << "Client:" << Buffer << std :: endl; // Envoyez la réponse envoyer (new_socket, bonjour, strlen (bonjour), 0); std :: cout << "bonjour message envoyé \ n"; // nettoyage close (new_socket); close (server_fd); retour 0; }
Client TCP de base en C
Le client se connecte au serveur, envoie un message et lit la réponse.
// client.cpp #include <iostream> #include <cstring> #include <sys / socket.h> #include <arpa / inet.h> #include <unistd.h> int main () { Int sock = 0; struct sockaddr_in sert_addr; const char * hello = "Hello from client"; tampon char [1024] = {0}; // Créer une prise if ((sock = socket (af_inet, sock_stream, 0)) <0) { Perror ("Erreur de création de socket"); retour -1; } serv_addr.sin_family = af_inet; serv_addr.sin_port = htons (8080); // convertir l'adresse IPv4 du texte en binaire if (inet_pton (af_inet, "127.0.0.1", & serv_addr.sin_addr) <= 0) { perror ("adresse / adresse non valide non prise en charge"); Fermer (chaussette); retour -1; } // Connectez-vous au serveur if (connect (sock, (struct sockaddr *) & serv_addr, sizeof (serv_addr)) <0) { perror ("Connexion a échoué"); Fermer (chaussette); retour -1; } // Envoyer un message au serveur Envoyer (Sock, bonjour, strlen (bonjour), 0); std :: cout << "bonjour message envoyé \ n"; // Lire la réponse lire (chaussette, tampon, 1024); std :: cout << "Server:" << buffer << std :: endl; // nettoyage Fermer (chaussette); retour 0; }
Comment compiler et courir
Sur Linux / macOS:
G serveur. g client.cpp -o client # Terminal 1 ./serveur # Terminal 2 (après l'exécution du serveur) ./client
Sortie attendue:
- Impressions du serveur:
Server listening on port 8080...
, puis le message client, puisHello message sent
. - Imprimés du client:
Hello message sent
, puisServer: Hello from server
.
Points clés
- En-têtes :
sys/socket.h
,netinet/in.h
,arpa/inet.h
,unistd.h
sont essentiels pour la programmation de socket sur Unix. - Port : Le serveur se lie au port 8080. Assurez-vous qu'il est gratuit.
- Adresse IP : le client utilise
127.0.0.1
(LocalHost). Modifier si vous connectez à un serveur distant. - Blocage E / S : Ces exemples utilisent des prises de blocage. Les applications réelles peuvent utiliser des E / S non bloquantes ou plusieurs threads.
- Gestion des erreurs : vérifiez toujours les valeurs de retour des fonctions de socket.
Notes pour Windows
Sur Windows, vous devez:
- Inclure
<winsock2.h>
et lien avecws2_32.lib
. - Appelez
WSAStartup()
avant d'utiliser des sockets. - Appelez
WSACleanup()
à la fin.
Exemple d'extrait:
Wsadata Wsadata; Wsastartup (makeword (2,2), & wsadata); // ... code de prise ... Wsacleanup ();
Il s'agit d'un exemple de travail minimal. En production, vous ajouteriez une récupération d'erreur, une prise en charge de plusieurs clients (en utilisant fork
, les threads ou les E / S asynchrones) et une meilleure cadrage de données.
Fondamentalement, les éléments essentiels pour faire parler une paire de douilles.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Stock Market GPT
Recherche d'investissement basée sur l'IA pour des décisions plus intelligentes

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds



L'utilisation de base de STD :: Vector comprend: 1. Declare Vector; 2. Ajouter des éléments avec push_back (); 3. Initialiser avec la liste d'initialisation; 4. Transfert de boucle avec portée pour; 5. Éléments d'accès via l'index ou le dos (); 6. Affectation directe des valeurs pour modifier les éléments; 7. Supprimer les éléments finaux avec pop_back (); 8. Appelez la taille () pour obtenir le nombre d'éléments; Il est recommandé d'utiliser Constauto et d'éviter de copier, de pré-alloquer la réserve () pour améliorer les performances et faire attention à la vérification qu'il n'est pas vide avant l'accès. Cette structure de données est un moyen efficace et préféré de gérer les listes de chaînes.

Pour lier les bibliothèques en C, vous devez utiliser -L pour spécifier le chemin de la bibliothèque lors de la compilation, -l pour spécifier le nom de la bibliothèque et utiliser -I pour inclure le chemin du fichier d'en-tête pour vous assurer que les fichiers de bibliothèque statique ou dynamique existent et sont nommés correctement. Si nécessaire, intégrez le chemin de la bibliothèque d'exécution via -wl, -rpath, afin que le compilateur puisse trouver la déclaration, le linker peut trouver l'implémentation et que le programme puisse être construit avec succès et exécuter.

Pour convertir une chaîne en majuscules ou en minuscules, utilisez la transformée STD :: combinée avec :: toupper ou :: Tolower Fonctions. 1. Inclure les fichiers d'en-tête et; 2. Appelez STD :: Transformer, transmettez l'itérateur de démarrage et de fin de la chaîne et spécifiez l'itérateur de sortie à str.begin () pour le modifier en place; 3. Utilisez :: Toupper pour convertir chaque caractère en majuscules, ou utilisez :: Tolower en minuscules. Cette méthode convient aux chaînes ASCII et le code est simple et efficace. Pour le texte non ASCII ou UNICODE, les bibliothèques telles que les soins intensifs doivent être utilisées pour assurer un traitement approprié. Bien que le cycle manuel soit très lisible, il est moins efficace. Par conséquent, il est recommandé d'utiliser STD ::

En C, la méthode de passage des paramètres affecte les performances, la sécurité et la modification des données d'origine: utilisez la valeur lors du passage des types de base ou en cas de modification, utilisez la référence lorsque vous modifiez les objets et lorsque vous modifiez, utilisez la référence lorsque vous lisez de grands objets et utilisez la référence const lorsque vous lisez de grands objets, évitez de retourner les références vers des variables locales pour assurer l'efficacité et la sécurité.

Useraiitotièreresourcemangation deobjecterlifetimes, assurant que les effets de la réadaptation

Pour appeler les fonctions C en C, vous devez utiliser le "C" externe pour éviter la modification du nom. Les étapes spécifiques sont: 1. Écrivez le fichier d'en-tête de fonction C Hello.h et enveloppez l'extern "C" avec #ifdef__cplusplus pour assurer la compatibilité; 2. Implémentez la fonction c say_hello () et incluez le fichier d'en-tête dans le programme principal main.cpp de c; 3. Utilisez G pour compiler le fichier C et lier le fichier cible C ou compiler directement le lien; 4. Exécutez le programme pour sortir correctement les résultats, indiquant que la fonction C était appelée avec succès. L'ensemble du processus doit s'assurer que la méthode de la déclaration et de la compilation est correcte, et le programme peut s'exécuter normalement et sortir "Callingcfunc

Contenu Qu'est-ce que Cronos (CRO) Combien de pièces de crocro y a-t-il des fonctions principales CRO et Solana Comparaison de l'équipe technique derrière CRO et les nouvelles et les événements importants sont CRO un bon investissement CRO prévoient des prix à long terme CRO2031-2036 Prévision des prix FAQ CRONOS (CRO) Le projet est bien connu pour sa position à l'intersection des blockchains Ethereum et Cosmos. Comme base

InlineNamespace est principalement utilisé pour le contrôle de version et l'exposition transparente des symboles, et ses membres peuvent être directement accessibles par l'espace de noms extérieur. ① Le nom dans InlineNamespace est considéré comme un membre direct de l'espace de noms extérieur et peut être utilisé sans spécifier l'espace de noms intérieur; ② Il est couramment utilisé pour la gestion de la version de la bibliothèque. Si V1 est défini sur Inline et est modifié en V2 pendant la mise à niveau, l'ancienne version est toujours accessible via un espace de noms explicite; ③ Prise en charge de la conception de compatibilité ABI, le nouveau type de version est exposé par défaut et l'ancienne interface binaire est conservée dans des espaces de noms non en ligne; ④ peut être imbriqué et existence multiple, mais généralement un seul est élargi par défaut; ⑤ Notez qu'un espace de noms extérieur ne peut avoir qu'un seul espace de sous-nom en ligne par défaut, et les utilisateurs doivent être évités
