begin process at 2012 05 28 11:08:42
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Linux

 > 

Réseau & Internet

 > 

aide creation serveur t'chat


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

aide creation serveur t'chat

mercredi 27 janvier 2010 à 20:37:50 | aide creation serveur t'chat

crazygoth

Bonjour

Je dois réaliser un projet qui consiste a faire un serveur de t'chat en c sous Linux.
je précise que je débute sous Linux et c également.

Mais voila après avoir bosser longuement dessus il ne fonctionne toujours pas.

c'est pour cela que je vous demain votre aide.
je sais également qu'il existe de nombreuses sources sur le site mais l'idée n'est pas de pomper le code d'un autre. et de comprendre ce que je fais et ou sont mais erreur.

voici ou j'en suis.

Code C/C++ :
   #include <stdio.h>
   #include <fcntl.h>
   #include <sys/types.h>
   #include <sys/socket.h>
   #include <netinet/in.h>
   #include <stdlib.h>
   #include <netdb.h>
   #include <unistd.h>
   #include <string.h>
   #include<stdlib.h>
   #include<unistd.h>
   #include<stdio.h>
   #include<pthread.h>
   #include<sys/types.h>
   #define PORTS 1981

  void serveur(int sock);

  typedef struct	struc_client {int num_sck;
  					  char ip;
 					  }  s_client;
 s_client *clients[100];//tableau contenant les clients
 s_client *client;//un client
   int sock, nsock,i;
   int nb_client;

   main()
   {
       int sock, nsock;

       struct sockaddr_in adr_s, adr_c;
       typedef struct sockaddr SOCKADDR;
       client = (s_client *) malloc(sizeof(s_client));
       socklen_t lg_adr_c = sizeof(adr_c);
       sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
       if(sock != -1) {printf("La socket %d est maintenant ouverte en mode TCP/IP\n", sock);}
       bzero(&adr_s,sizeof(adr_s));
       adr_s.sin_family=AF_INET;
       adr_s.sin_port= htons(PORTS);
       adr_s.sin_addr.s_addr = htonl(INADDR_ANY);
       if (bind(sock,(SOCKADDR *)&adr_s,sizeof(adr_s))!=-1){
            printf("construction adresse ok \n");
       }
       if(listen(sock,5)!=-1){
            printf("Patientez pendant qu'un client se connecte sur le port %d...\n", PORTS);
       }
       pthread_t thread_serveur;

       while(1)
       {
           nsock = accept(sock,(SOCKADDR *)&adr_c,&lg_adr_c);

           if(nsock!=-1){
                printf("un nouveau client vient de se connecter : %s \n",inet_ntoa(adr_c.sin_addr));
                client->num_sck = nsock;
                client->ip = inet_ntoa(adr_c.sin_addr);
                clients[nb_client] = client;
                printf("socket = %d\n",client->num_sck);

                pthread_create(&thread_serveur,  NULL, (void*)&serveur,client->num_sck);
                nb_client++;
                printf("il y a maintenant %i client sur le serveur.\n",nb_client);
                for(i=0;i<=nb_client-1;i++){
 				printf("et il existe la sockets : %d\n",clients[i]->num_sck);
 		}
           }
       }
   }

   void serveur(int sock){
   char buf[500];
   printf("entrer dans thread \n");
   while(1){

        if (read(sock,buf,500)!=-1){
 				printf("read\n");
 			};
 			for(i=0;i<=nb_client-1;i++){
 				write(clients[i]->num_sck,&buf,500);
 				printf("message envoyer sur le socket : %d\n",clients[i]->num_sck);
 			}

       }
   }



j'ai l'impression que mon problème vient de la structure en effet lorsque j'affiche
for(i=0;i<=nb_client-1;i++){
printf("et il existe la sockets : %d\n",clients[i]->num_sck);
}

tout les num_sock de la structure contient la valeur de la derrière socket créée.

je vous remerci d'avance de l'aide que vous pourriez m'apporter
vendredi 29 janvier 2010 à 00:54:28 | Re : aide creation serveur t'chat

uaip

Salut,

Regarder un code existant n'est pas pomper. Si tu analyse le code, et essaie de faire pareil en changeant au fur et à mesure quelques trucs, c'est (selon moi) la meilleure façon d'apprendre.

Je ne vois pas de grosse erreur dans l'algo du code.
Par contre, client et clients[] sont 2 pointeurs (et tableau de pointeurs).
Quand tu fais "clients[nb_client] = client;", l'adresse de "client" est stockée dans la case du tableau. Or l'adresse de "client" ne change pas au cours du programme... donc toutes les cases pointeront sur cette même adresse (et récupèreront les mêmes valeurs des membres).

Soit tu supprimes les pointeurs, soit tu ajoutes une fonction qui alloue de la place mémoire, copie les valeurs des membres et la retourne. Du genre :
Code C/C++ :
s_client *clientdup(s_client *c) {
    s_client *b=(s_client*)malloc(sizeof(s_client));
    b->num_sck=c->num_sck;
    b->ip=c->ip;
    return b;
}

clients[nb_client] = clientdup(client);

De cette manière, chaque case du tableau pointera sur une zone mémoire différente.

Il ne faudra pas oublier les free.
A vérifier, quand même


Cordialement, uaip.
vendredi 29 janvier 2010 à 00:55:51 | Re : aide creation serveur t'chat

uaip

Ah oui, au passage :
i<=nb_client-1 devient i<nb_client (plus court, plus lisible)


Cordialement, uaip.


Cette discussion est classée dans : serveur, client, include, sock, adr


Répondre à ce message

Sujets en rapport avec ce message

client serveur [ par elanspeech ] Bonjour,Je suis en train de programmer un petit client serveur en C pour windows avec dev-c++. J'obtiens l'erreur suivante a la compilation : D:\DEV-C Client/Serveur, encore..... [ par glubust ] Je veux faire fonctionner une application client/serveur sous UNIX (client) et WINDOWS (serveur).Le programme client envoi une simple requête au serve probléme d'allocation mémoire ? [ par templeofboom ] dans le cadre du développement d'une application de socket sous devcpp je me retrouve bizarrement coincé a cause d'une erreur d'allocation mémoire à Probleme avec les sockets [ par Scooper ] Bonjour a tous, j'ai un soucis avec l'utilisation des sockets sous UNIX AIX v3.25.J'ai 2 programmes : 1 client et 1 serveur.Ces 2 programmes fonctionn pb communication socket [ par skyman272 ] bonjourvoici un petit programme client/serveur pour un projet à l'insa (sous linux).Le programme client envoi un message au programme serveur qui lui à vos sockets, prêt, GO [ par mimou20052005 ] à vos sockets, prêt, GO Bon voila les gars j'ai enfin pu réaliser un client et un serveur en C++ (win 32 console application), mais j'ai un petit prob Client serveur [ par fanch314 ] Je que le serveur et le client échange par internet.Le serveur ne voit pas de client connectéEt le buffer du client contient nimporte quoi.En gros ils C++ Serveur web [ par kiki67100 ] Bonjour J'ai commencé a faire un serveur Pour affiché du texte sur le client Voici le code#include #include #include #include c<br boucle infinie et file de message [ par kyfranBibax ] Bonjour,j'ai un petit problème avec des files de messages et une boucle infinie.J'ai crée 2 programmes (un serveur et un cllient) qui communiquent via erreur serveur multitheard en c [ par dyroj ] salut,j'ai créer un serveur echo en multithread et il marche a moitier sofe que par foi il confon les client.enfin c'est un peut bizare, par exemple q


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 : 1,014 sec (4)

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