begin process at 2012 05 27 19:22:02
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Réseaux & Internet

 > SOCKET CPP

SOCKET CPP


 Information sur la source

 Description

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

  • // $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";
  • }
  • }
// $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";
}
}



 Sources de la même categorie

Source avec Zip Source avec une capture MINI SERVEUR HTTP [WINDOWS] par ganjarasta
Source avec Zip Source avec une capture CLIENT DE TEST MODBUS TCP par brunovan
Source avec Zip Source avec une capture SCANIP [ARP / ICMP] par ganjarasta
Source avec Zip Source avec une capture TRACEROUTE [WINPCAP] par ganjarasta
Source avec Zip SERVEUR MULTITHREAD [LINUX/WIN] par nipepsinicolas

 Sources en rapport avec celle ci

Source avec Zip SERVEUR MULTITHREAD [LINUX/WIN] par nipepsinicolas
Source avec Zip Source avec une capture SECURE REMOTE SHELL [WIN32] par ganjarasta
Source avec Zip MINICHAT MULTI-CLIENT par wisar
SIMPLE SCANNER DE PORTS par Vb6Malade
Source avec Zip LIRE UNE IMAGE JPEG DEPUIS UNE ADRESSE IP par synopsism

Commentaires et avis

Commentaire de Stutu le 21/01/2011 08:43:23

Un code veritablement excellent aucun defaut il est parfait un grand merci a baptchr55

Commentaire de troctsch le 28/01/2011 21:52:02 9/10

Très bon code. Merci.

Commentaire de victorjung le 02/02/2011 18:00:41

Question vous les avez trouvées ou les libs a inclure?

Commentaire de baptchr55 le 03/02/2011 08:58:20

Ce sont les librairies systèmes Linux !

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

encore mon serveur [ par skysee ] bonjour,je suis toujours avec mon serveur en c sous visual c++ sous windows(sis eulement j'avais linux).Le problème est que je n'ai pas d'erreur de co Probleme reception sur un serveur windows en vc++ [ par alfred ] Salut a tous!!g un probleme dans mon serveur le recv renvoie la valeur -1 et je ne vois pas pouquoi, toute mes socket sont positives le client envois Serveur Vc++6 pb dans recv [ par alfred ] Salut a tousJ'ai un probleme dans mon serveur et je ne sais pas comment le resoudre. Le client se connecte bien et envoie le bon nombre de caracteres socket.h [ par greg4 ] je ne trouve pas socket.h !!!quelqu'un pourait me l'envoyer a ggreg4@caramail.comou me donner une address.merci socket en c [ par skysee ] Bonjour,je recherche un code en C (pas de c++) qui créer un serveur socket udp. Merci Communication par socket [ par yoyo2 ] Bonjour à tous,est-il possible de communiquer par socket entre plusieurs systèmes différents. Par exemple envoyer des données entre un PC sous Windows Recherche programme lecture Socket [ par DarknessLucifer ] Besoin d'un programme permettant de lire les informations Socket .. je travail sous windows.Si qq avait un programme fonctionnant je lui en serait tre socket RAW [ par oxydoxy ] et t'il possible d'utilise les RAW socket sous un environement comme vc++ avec winsock ? probleme socket sous windows XP [ par fr1man ] j'ai réalisé un "chat" avec les sockets en VC++6. il fonctionne très bien sous NT et 2000 mais pas sous XP. d'où vient le problème ?j'utilise l'API wi pb de socket sous windows XP [ par fr1man ] j'ai réalisé un "chat" avec les sockets en VC++6. il fonctionne très bien sous NT et 2000 mais pas sous XP. d'où vient le problème ?j'utilise l'API wi


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,577 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales