Réalisation d'un serveur echo tcp multiclient (unix)

Soyez le premier à donner votre avis sur cette source.

Vue 9 029 fois - Téléchargée 761 fois

Description

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

Source / Exemple :


/**********************************************************************/
/***** 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);
   
}

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

mickeydisn
Messages postés
13
Date d'inscription
dimanche 27 octobre 2002
Statut
Membre
Dernière intervention
23 août 2007

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
cs_jptg
Messages postés
1
Date d'inscription
mercredi 26 novembre 2003
Statut
Membre
Dernière intervention
26 novembre 2003

T'aurais pas oublié la librairie MACHINE MOTS ;-)
BlackWizzard
Messages postés
1277
Date d'inscription
mercredi 21 mars 2001
Statut
Modérateur
Dernière intervention
21 juin 2009
2
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 ;)
BlackGoddess
Messages postés
338
Date d'inscription
jeudi 22 août 2002
Statut
Membre
Dernière intervention
14 juin 2005

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 ?

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.