begin process at 2012 05 27 18:04:04
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Réseaux & Internet

 > RÉALISATION D'UN SERVEUR ECHO TCP MULTICLIENT (UNIX)

RÉALISATION D'UN SERVEUR ECHO TCP MULTICLIENT (UNIX)


 Information sur la source

Note :
7 / 10 - par 1 personne
7,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Réseaux & Internet Niveau :Initié Date de création :18/11/2003 Vu / téléchargé :7 405 / 668

Auteur : adesport

Ecrire un message privé
Commentaire sur cette source (4)
Ajouter un commentaire et/ou une note

 Description

réalisation d'un ptit serveur ECHO avec des socket UNIX et des threads...

Source

  • /**********************************************************************/
  • /***** programme serveur
  • transfert adresse IP du serveur en notation décimale pointée par la ligne de
  • commande
  • DESPORTES Adrien BONIN Thomas
  • Etat d'avancement: OK testé
  • /**********************************************************************/
  • #include <stdio.h>
  • #include <string.h>
  • #include <sys/types.h>
  • #include <sys/socket.h>
  • #include <netinet/in.h>
  • #include <arpa/inet.h>
  • #include <netdb.h>
  • #include <string.h>
  • #include <unistd.h>
  • #include <errno.h>
  • #include <pthread.h>
  • #include "reseau.h"
  • /******* definition des constantes ******/
  • #define PORT_ECHO 1030
  • #define TAILLE_BUF 20
  • /****************** programme SERVEUR Echo TCP ****************/
  • void *echo(void *numSocketConnecte);
  • int main(int nbArg, char *arg[])
  • {
  • int numSocket,lengAdr,numSocketConnecte;
  • struct sockaddr_in sockAdrServeur;
  • pthread_t serviceClient,serviceClient2;
  • /*************************************************/
  • /** ouvre un socket local**/
  • /*************************************************/
  • numSocket=socketServer(PORT_ECHO,TCP);
  • afficheInfosSocket(numSocket);
  • while(1)
  • {
  • /*accept*/
  • printf("serveur en attente...\n");
  • numSocketConnecte=accept(numSocket,(struct sockaddr*)NULL,(int *)NULL);
  • printf("demande de connexion avec socket n°%d\n",numSocketConnecte);
  • /*création de taches*/
  • pthread_create(&serviceClient, NULL,echo, (void *) &numSocketConnecte);
  • }
  • pthread_exit(NULL);
  • }
  • void *echo(void *numSocketConnecte)
  • {
  • char bufferRecep[TAILLE_BUF],sortie=0;
  • int nbOctRecu;
  • int *adrNumSocket=(int*)numSocketConnecte;
  • int numSocket=*adrNumSocket;
  • /****** récception de l'écho ****/
  • while(1)
  • {
  • nbOctRecu= read(numSocket,bufferRecep,TAILLE_BUF);
  • printf("je lis sur %d\n",numSocket);
  • switch (nbOctRecu)
  • {
  • case -1:
  • perror("erreur de reception: ");
  • break;
  • default:
  • /***** on construit la requete d'echo ***/
  • bufferRecep[nbOctRecu]=0; /* pour terminer la chaine au cas ou */
  • printf ("message client: %s",bufferRecep);
  • }
  • if (strncmp(bufferRecep,"QUIT",4)==0)
  • break;
  • /**** emission de la requete d'echo vers le client ******/
  • if (write(numSocket,bufferRecep,strlen(bufferRecep)+1)<0)
  • perror ("probleme émission:");
  • printf("j'écris sur %d\n",numSocket);
  • }
  • /*************************************************/
  • /* on ferme la connexion */
  • /*************************************************/
  • printf ("connexion fermée\n");
  • close(numSocket);
  • pthread_exit(NULL);
  • }
/**********************************************************************/
/***** programme serveur 
 transfert adresse IP du serveur en notation décimale pointée par la ligne de
 commande 
 DESPORTES Adrien  BONIN Thomas
 Etat d'avancement: OK testé
/**********************************************************************/
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <pthread.h>
#include "reseau.h"
/******* definition des constantes ******/
#define PORT_ECHO 1030
#define TAILLE_BUF 20

/****************** programme SERVEUR Echo TCP ****************/
void *echo(void *numSocketConnecte);

int main(int nbArg, char *arg[])
{
int numSocket,lengAdr,numSocketConnecte;
struct sockaddr_in sockAdrServeur;
 pthread_t serviceClient,serviceClient2;
 
/*************************************************/ 
/** ouvre un socket local**/
/*************************************************/ 

 numSocket=socketServer(PORT_ECHO,TCP);
 afficheInfosSocket(numSocket);
 
while(1)
{ 
 /*accept*/
 printf("serveur en attente...\n");
 numSocketConnecte=accept(numSocket,(struct sockaddr*)NULL,(int *)NULL);
 printf("demande de connexion avec socket n°%d\n",numSocketConnecte);
 
 /*création de taches*/
 pthread_create(&serviceClient, NULL,echo, (void *) &numSocketConnecte);
}
 
 pthread_exit(NULL);	
}

void *echo(void *numSocketConnecte)
{
 char bufferRecep[TAILLE_BUF],sortie=0;
 int nbOctRecu;
 int *adrNumSocket=(int*)numSocketConnecte;
 int numSocket=*adrNumSocket;

  /****** récception de l'écho ****/

 while(1)
 {
   nbOctRecu= read(numSocket,bufferRecep,TAILLE_BUF); 
   printf("je lis sur %d\n",numSocket); 
   switch (nbOctRecu)
   {
     case -1:
        perror("erreur de reception: ");
        break;
    
     default:
     /***** on construit la requete d'echo ***/
        bufferRecep[nbOctRecu]=0; /* pour terminer la chaine au cas ou */
        printf ("message client: %s",bufferRecep);
   }
 
 
 if (strncmp(bufferRecep,"QUIT",4)==0)
	break;
  
  /**** emission de la requete d'echo vers le client ******/
   
 if (write(numSocket,bufferRecep,strlen(bufferRecep)+1)<0)
     perror ("probleme émission:");
 printf("j'écris sur %d\n",numSocket);    
  }
  
/*************************************************/
/* on ferme la connexion */
/*************************************************/
   
   printf ("connexion  fermée\n");
   close(numSocket);
   pthread_exit(NULL);
   
}




 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

INITIATION AUX TUBES UNIX (PIPE())
COURSE CYCLISTE

 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

Commentaires et avis

Commentaire de BlackGoddess le 19/11/2003 23:34:21

il faudrait p-e utiliser les sockets asynchrones (ca ferait un tres bons tutoriel sous unix en plus j'en ai jamais vu), car si tu as 50 clients, tu vas avoir 50 threads ?

Commentaire de BlackWizzard le 20/11/2003 22:29:34 administrateur CS

tres bonne source pour debuter les sockets sous unix...
personnellement, je cherche a faire le meme genre de chose sous windows, mais avec des sockets asynchrones, afin de realiser un server XMLSocket pour la communication dedié a des applications flash.
mais tres tres bonne source, tres courte et tres simple ;)

Commentaire de jptg le 26/11/2003 23:33:37

T'aurais pas oublié la librairie MACHINE MOTS ;-)

Commentaire de mickeydisn le 05/11/2004 06:44:58

Salut :)
Heu dit on dirait qu'il y a une erreur dans le code :
tu declare un buffer de TAILLE_BUF, puis tu fait un read et recupere le nombre de caractere lus...
Si la taille des donnees a lire est superieure ou egale a TAILLE_BUF, alors tu recupere TAILLE_BUF dans nbOctRecu.
Cependant par "securite" tu fait un :
bufferRecep[nbOctRecu]=0; /* pour terminer la chaine au cas ou */
Hors la ca deborde du tableau dans ce cas : un tab de TAILLE_BUF va de 0 a... TAILLE_BUF - 1.
SEGMENTATION FAULT !!

Tu a du oublier de tester avec un truc superieur a TAILLEBUF :)

Sur ce il est 6 h, je vais me coucher ! bonne journee :-D

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

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,655 sec (4)

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