Socket cpp

Soyez le premier à donner votre avis sur cette source.

Snippet vu 8 194 fois - Téléchargée 17 fois

Contenu du snippet

Petit serveur qui permet de recevoir un message via ethernet grâce à des socket. source commentée.
Le client se connecte sur le réseau local et sélectionne un port.
Le serveur permet de réceptionner une trame composée de caractères. Dans mon cas (source modifié) m'a permis de traiter des commande machines.

Source / Exemple :


// $Id: udp-server.cc 1473 2010-03-03 23:03:07Z latu $
#include <arpa/inet.h>
#include <netdb.h>
#include <netinet/in.h>
#include <unistd.h>
#include <iostream>
#include <cstdlib>
#include <cstring>
#define MAX_MSG 100
// 3 caractères pour les codes ASCII 'cr', 'lf' et '\0'
#define MSG_ARRAY_SIZE (MAX_MSG+3)
using namespace std;
int main()
{
system("clear");
system("echo Connecté en tant que $USER");
cout<< "\n************* SERVEUR ************\n";
int listenSocket, i;
unsigned short int listenPort, msgLength;
socklen_t clientAddressLength;
struct sockaddr_in clientAddress, serverAddress;
char msg[MSG_ARRAY_SIZE];
memset(msg, 0x0, MSG_ARRAY_SIZE); // Mise à zéro du tampon
cout << "Entrez le numéro de port utilisé en écoute (entre 1500 et 65000) : ";
cin >> listenPort;
// Création de socket en écoute et attente des requêtes des clients
listenSocket = socket(AF_INET, SOCK_DGRAM, 0);
if (listenSocket < 0) {
cerr << "Impossible de créer le socket en écoute\n";
exit(1);
}
// On relie le socket au port en écoute.
// On commence par initialiser les champs de la structure serverAddress puis
// on appelle bind(). Les fonctions htonl() et htons() convertissent
// respectivement les entiers longs et les entiers courts du rangement hôte
// (sur x86 on trouve l'octet de poids faible en premier) vers le rangement
// réseau (octet de poids fort en premier).
serverAddress.sin_family = AF_INET;
serverAddress.sin_addr.s_addr = htonl(INADDR_ANY);
serverAddress.sin_port = htons(listenPort);
if (bind(listenSocket,
(struct sockaddr *) &serverAddress,
sizeof(serverAddress)) < 0) {
cerr << "Impossible de lier le socket en écoute\n";
exit(1);
}
// Attente des requêtes des clients.
// C'est un appel non-bloquant ; c'est-à-dire qu'il enregistre ce programme
// auprès du système comme devant attendre des connexions sur ce socket avec
// cette tâche. Ensuite, l'exécution se poursuit.
listen(listenSocket, 5);
cout << "Attente de requête sur le port " << listenPort << "\n";
while (1) {
clientAddressLength = sizeof(clientAddress);
// Mise à zéro du tampon de façon à connaître le délimiteur
// de fin de chaîne.
memset(msg, 0x0, MSG_ARRAY_SIZE);
if (recvfrom(listenSocket, msg, MSG_ARRAY_SIZE, 0,
(struct sockaddr *) &clientAddress,
&clientAddressLength) < 0) {
cerr << " Problème de réception du messsage\n";
exit(1);
}
// Affichage de l'adresse IP du client.
cout << " Depuis " << inet_ntoa(clientAddress.sin_addr);
// Affichage du numéro de port du client.
cout << ":" << ntohs(clientAddress.sin_port) << "\n";
// Affichage de la ligne reçue
cout << " Message reçu : " << msg << "\n";
msgLength = strlen(msg);
// Conversion de cette ligne en majuscules.
for (i = 0; i < msgLength; i++)
msg[i] = toupper(msg[i]);
// Renvoi de la ligne convertie au client.
if (sendto(listenSocket, msg, msgLength + 1, 0,
(struct sockaddr *) &clientAddress,
sizeof(clientAddress)) < 0)
cerr << "Émission du message modifié impossible\n";
}
}

A voir également

Ajouter un commentaire

Commentaires

cs_Stutu
Messages postés
37
Date d'inscription
mercredi 5 janvier 2011
Statut
Membre
Dernière intervention
26 avril 2011

Un code veritablement excellent aucun defaut il est parfait un grand merci a baptchr55
troctsch
Messages postés
6
Date d'inscription
vendredi 4 décembre 2009
Statut
Membre
Dernière intervention
28 janvier 2011

Très bon code. Merci.
cs_victorjung
Messages postés
7
Date d'inscription
dimanche 9 janvier 2011
Statut
Membre
Dernière intervention
15 février 2011

Question vous les avez trouvées ou les libs a inclure?
baptchr55
Messages postés
34
Date d'inscription
vendredi 26 septembre 2008
Statut
Membre
Dernière intervention
6 avril 2011

Ce sont les librairies systèmes Linux !

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.