IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

aide creation chat sous linux


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 4
    Points : 1
    Points
    1
    Par défaut aide creation chat sous linux
    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.

    voici ou j'en suis.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
     
       #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

  2. #2
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    client est l'adresse de l'unique s_client de ton programme, celui qui a été créé par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    client = (s_client *) malloc(sizeof(s_client));
    Ton tableau clients[] est un tableau d'adresse de s_client. Quand tu écrits
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    clients[nb_client] = client;
    tu le remplis avec la même adresse, celle de l'unique s_client du programme.

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    merci des heures de boulot juste pour ca lol
    j'ai donc déplacé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        client = (s_client *) malloc(sizeof(s_client));
                    client->num_sck = nsock;
                    client->ip = inet_ntoa(adr_c.sin_addr);
                    clients[nb_client] = client;
    dans mon thread
    cela fonctionne beaucoup mieux encore quelque souci que je pense pouvoir resoudre moi même

    merci également a fearyourself du chat pour ces explications

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    bonjour

    Je suis de nouveau face a un problème
    je voudrais ajouter la fonction de message privé
    pour cela le client devra envoyé un message sous cette forme:

    @111.111.111.111 bonjour l'ami

    Pour cela voici ce que j'ai fais pour le moment afin d'isoler l'adresse ip du client
    sachant que buf contient le message complete
    et que : ip_msg_prive et declarer ainsi : char ip_msg_prive[15]; est devra contenir uniquement l'adresse ip.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    if (!strncmp(buf,"@",1)){
        printf("message prive");
        strcpy(ip_msg_prive,buf[2]);
        i=3;           
        while(!strncmp(buf," ",i)){
                strcat(ip_msg_prive,buf[i]);
                i++;
        }
        printf("%s",ip_msg_prive);
    }

  5. #5
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    L'erreur est ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcat(ip_msg_prive,buf[i]);
    strcat() n'ajoute pas un caractère mais une chaine.

    Il devrait suffire de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      if(sscanf(buf,"@%15s",ip_msg_prive)==1)
       printf("message prive. IP : %s\n",ip_msg_prive);

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup
    cela fonctionne impec

    mais j'ai un peu de mal a comprendre pourquoi cela marche avec une ip qui fait moins de 15 caractères

Discussions similaires

  1. aide creation trigger sous mysql
    Par bil.dev dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 08/02/2009, 23h18
  2. choix et aide pour serveur sous linux suse
    Par asus02 dans le forum Matériel
    Réponses: 3
    Dernier message: 14/12/2007, 10h35
  3. besoin d'aide sur xerces sous linux
    Par ange1708 dans le forum XML
    Réponses: 1
    Dernier message: 20/02/2007, 17h13
  4. Chat sous linux
    Par flatron dans le forum Réseau
    Réponses: 5
    Dernier message: 21/07/2004, 20h25
  5. Réponses: 2
    Dernier message: 25/10/2002, 22h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo