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

Réseau C Discussion :

Socket TCP: probleme avec select()


Sujet :

Réseau C

  1. #1
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut Socket TCP: probleme avec select()
    bonjour,

    en fait j'ai un petit problème avec les sockets en mode TCP...

    je programme un serveur multiclient, dans lequel, chaque client aura un traitement différent. J'utilise la fonction select().

    Le probleme, c'est que je ne sais pas à quel client j'ai affaire lorsque le serveur reçoit un message!
    Je voulais savoir si il y' a un moyen de reconnaitre quel client a envoyé le message?
    Je sais que select() utilise une file d'attente (où sont stockés les descripteurs de sockets connectés) et pointe le descripteur du client qui a envoyé un message, mais j'ignore comment accéder à ce champ.

    Si quelqu'un pouvait m'aider ça serait top. Merci

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par juve1897
    J'utilise la fonction select().

    Le probleme, c'est que je ne sais pas à quel client j'ai affaire lorsque le serveur reçoit un message!
    Je voulais savoir si il y' a un moyen de reconnaitre quel client a envoyé le message?
    Bah, il suffit d'utiliser select() correctement :

    http://emmanuel-delahaye.developpez....reseaux-c/#LVI
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    MErci pour ta réponse,

    cependant, j'ai déjà lu, la plupart des documents traitant de select(), mais je ne vois toujours pas comment faire.

    Je sais que FD_ISSET renvoie 1 si le descripteur de socket passé en paramètre est celui qui a envoyé le message. Mais moi, concrètement, comment pourrais je savoir dans quel ordre mes clients ont été enregistré dans la file ou encore quel est le descripteur qui leur est associé???

    Mon programme en fait est un jeu de morpion, où 2clients jouent...
    J'ai programmé des fonctions, parmis lesquelles se trouvent une qui se charge de rentrer la case jouée par l'un des clients dans le tableau.

    Mais pour savoir si je mets un "X" ou un "O" dans la case, il faut que je sache quel client a joué...

    Mais comment faire???

  4. #4
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par juve1897
    MErci pour ta réponse,

    cependant, j'ai déjà lu, la plupart des documents traitant de select(), mais je ne vois toujours pas comment faire.

    Je sais que FD_ISSET renvoie 1 si le descripteur de socket passé en paramètre est celui qui a envoyé le message. Mais moi, concrètement, comment pourrais je savoir dans quel ordre mes clients ont été enregistré dans la file ou encore quel est le descripteur qui leur est associé???

    Mon programme en fait est un jeu de morpion, où 2clients jouent...
    J'ai programmé des fonctions, parmis lesquelles se trouvent une qui se charge de rentrer la case jouée par l'un des clients dans le tableau.

    Mais pour savoir si je mets un "X" ou un "O" dans la case, il faut que je sache quel client a joué...

    Mais comment faire???
    Ben tu fais un tableau avec les sockets des clients. Ensuite tu parcours le tableau et tu fais le test avec la macro FD_ISSET
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  5. #5
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Ca m'a l'aire d'etre une bonne idée, mais je vois pas comment faire.
    Est ce que tu purrais m'expliquer comment faire s'il te plait...

    si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for(desc_socket=3; desc_socket<taille_max_de_la_file; desc_socket++)
      if(FD_ISSET(desc_socket, file_d_attente))
       /* j'ajoute X dans mon tableau */
    Mais comment savoir si desc_sock represent mon client1 ou client2 ???

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par juve1897
    Mais comment savoir si desc_sock represent mon client1 ou client2 ???
    C'est à toi, au moment de la création du socket client (accept()), de créer le lien entre le socket du client et son identificateur dès que tu les connais...

    Une structure contenant le socket et l'identificateur est sans doute le plus simple....

    Si le nombre de client est limité, un simple tableau de structure permet de gérer tout ça. Si le socket vaut SOCKET_INVALID, la place est libre. A toi de bien gérer les déconnexions...
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    J'avais fait un truc en C++ le principe était un tableau de socket et l'egalité de 2 objets de type Client était basé sur le numéro du socket (comme il est unique).

    En C, tu peux comme Emmanuel l'a dit faire un tableau de structure.

    Pour la déconnexion, lorsqu'un client se déconnecte select est déclenché, la socket du client est SET et un read sur ce socket retourne -1.

    Voilà si t'a d'autres questions hésite pas.
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  8. #8
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Merci pour vos réponses

    mais je voulais juste savoir, quand on fait FD_ISSET(sock, &fd), de quel résultat est issu "sock" (le premier paramètre de FD_ISSET)???
    Je crois qu'il vient de sock=accept(...)

    Mais moi, j'ai écrit, 1 serveur et 1 client... Et je souhaite lancer le serveur dans une console, puis exécuter le client dans 2 autres consoles.

    Mais comment faire avec sock dans ce cas? Si j'ai bien compris, les deux clients feront un connect(), qui sera accepté par le seveur, donc les deux descripteurs seront égale à sock ???

    Voila mon code:
    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
    86
    87
    88
    89
    90
    91
    92
    93
    94
     
     int sock_ecoute, sock_service;
      int sock1, sock2;
     
      socklen_t lemis;
      fd_set fd;
     
      struct sockaddr_in serveur_adr, client_adr;
     
      char *data=malloc(sizeof(char)*1024);
      bzero(data,sizeof(data));
     
      int rval, n_sock;
     
      char *morpion=malloc(sizeof(char)*9);
      bzero(morpion,sizeof(morpion));
     /* j'initialise les cases de mon morpion à "-" */
     
      sock_ecoute= socket(AF_INET, SOCK_STREAM, 0);
      if(sock_ecoute < 0)
      {
        perror("socket");
        exit(1) ;
      }
     
      bzero(&serveur_adr, sizeof (serveur_adr));
      serveur_adr.sin_family= AF_INET;
      serveur_adr.sin_addr.s_addr= INADDR_ANY;
      serveur_adr.sin_port= htons(NPORT);
     
      if(bind(sock_ecoute, (struct sockaddr*)&serveur_adr, sizeof(serveur_adr)) !=0)
      {
        perror("bind");
        close(sock_ecoute);
        return 1;
      }
     
      printf("socket serveur TCP port #%d\n", ntohs(serveur_adr.sin_port));
     
      listen(sock_ecoute, 5);
     
      while(1)	/*Serveur multi-client donc boucle infinie*/
      {
        bzero(&client_adr, sizeof(client_adr));
        lemis= sizeof(client_adr);
     
        FD_ZERO(&fd);	/*On reinitialise notre liste d'attente*/
        FD_SET(sock_ecoute, &fd);	/*Dans laquelle on place notre socket de connexion*/
        FD_SET(sock1, &fd);
        FD_SET(sock2, &fd);
     
        sock_service= accept(sock_ecoute, (struct sockaddr*)&client_adr, &lemis);
        /*...on l'accepte...*/
        if(sock_service < 0)					/*...toujours avec un test pour éviter les erreurs...*/
        {
          perror("Probleme accept  ");
         exit(1);
        }
     
        rval=select(n_client+1, &fd,  NULL, NULL,NULL);
        if(rval < 0)	/*On fait notre select sur notre liste de client*/
        {							/*Avec un test pour éviter les erreurs*/
          perror("select");
          exit(1);
        }
        if(rval)
        {
          if(FD_ISSET(sock1,&fd)) //teste si c'est la sock1 qui a envoyé le msg
          {
      	data=invite_jeu(morpion,data);  
            if(write(sock1,data,sizeof(data)) < 0)  //on lui envoie le jeu actuel
            {
              perror("write server");
              exit(1);
            }
            morpion=traiterClient(sock_service,"sock1",morpion);	//on traite le client 
          }				        
          else
    	if(FD_ISSET(sock2,&fd))
    	{
      	  data=invite_jeu(morpion,data);
              if(write(sock2,data,sizeof(data)) < 0)
              {
                perror("write server");
                exit(1);
              }
             morpion=traiterClient(sock_service,"sock2",morpion);
    	}
          }
      }  
     
      close(sock_service);	
      close(sock_ecoute);
    }
    J'espère que j'ai pas fait trop d'erreur...

  9. #9
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Chaque fois qu'un client se connecte, accept retourne un socket qui a une valeur différente. Donc 2 socket ne peuvent être égaux.

    Chaque fois qu'un client se connecte accept retourne une valeur, cette valeur tu la stockes dans un tableau qui sera donc un tableau de tous tes sockets. Ou bien un tableau de structure comme on te l'a suggéré


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef struct
    {
        int socket;
        char pseudo[100];
    }Joueur;
    bzero est déprécié me semble t-il, il faut utiliser memset.

    Question : un ou une socket ???
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  10. #10
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Merci pour la structure,

    je pensais deja faire quelque chose de la sorte, mais le truc que je comprends pas c'est comment remplir le champs pseudo???

    Vu que mon serveur, fait une boucle infinie, tant qu'il reçoit des messages d'un client, il :
    • traite la demande de connection avec "accept()"
    • il ajoute le descripteur à la file d'attente avec "FD_SET( )"
    • il met dans la structure Joueur le nouveau descripteur


    Mais comment lui donner le nom??? Si j'ecris
    Dans cet exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    ...
      Joueur j1=malloc(sizeof(Joueur));
     
      t=accept(...);
      FD_ISSET(t,&fd);
      j1.socket=t;
      j1.pseudo=JOUEUR1;
     
    ...
    Il mettra toujours le pseudo "JOUEUR1" à tout les descripteurs...

    A part demander au client de saisir lui meme son pseudo qu'il enverra au serveur, je vois pas quoi faire d'autre que...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
      t=read(buf,data,...)
      if(t < 0)
       /*message d'erreur */
     
      j1.pseudo=data;
    De plus comment faire pour ne pas qu'il me demande cette saisie à chaque tour de boucle???

  11. #11
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Je voulais savoir aussi, si select devait être utilisé également dans le client ?

  12. #12
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Généralement, tu n'en as pas besoin.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    dans mon cas, je m'en sert pour faire un morpion en reseau, pense tu que j'en aurais besoin????

    j'ai une autre question,

    Dans mon programme, le client stocke dans un char* les coordonnées qu'il a tapé sur stdin, puis envoie ce char*buf au serveur (par ex: 2 3).

    Quand il les reçoit je les affiche, et c'est le bon message qui est envoyé. Mais le probleme c'est quand je traite les chiffres
    x=buf[0];
    y=buf[1];

    et que je les affiche, il me renvoie le code ascii (x=50 y=51).
    J'ai essayé de faire atoi(buf[2]) mais le compilateur me lance le warning suivant:
    attention : passing argument 1 of 'atoi' makes pointer from integer without a cast

    je sais pas quoi faire, pourrais tu m'aider STP.

  14. #14
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Pour un truc aussi "tour par tour" que du morpion, tu devrais pouvoir t'en sortir sans select() au client.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  15. #15
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par juve1897
    Dans mon programme, le client stocke dans un char* les coordonnées qu'il a tapé sur stdin, puis envoie ce char*buf au serveur (par ex: 2 3).

    Quand il les reçoit je les affiche, et c'est le bon message qui est envoyé. Mais le probleme c'est quand je traite les chiffres
    x=buf[0];
    y=buf[1];

    et que je les affiche, il me renvoie le code ascii (x=50 y=51).
    J'ai essayé de faire atoi(buf[2]) mais le compilateur me lance le warning suivant:
    attention : passing argument 1 of 'atoi' makes pointer from integer without a cast

    je sais pas quoi faire, pourrais tu m'aider STP.
    Pour transformer un caractère chiffre ('0' à '9') en valeur numérique, il suffit de retirer la valeur de '0'. En effet, les caractères chiffres (et uniquement ceux là) ont des valeurs consécutives croissantes. C'est garanti par la norme.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       x=buf[0] - '0';
       y=buf[1] - '0';
    Mais tu balances les 2 caractères saisis comme ça en vrac sur le réseau ? Même pas de marqueur de fin de ligne ('\n')
    Pas de Wi-Fi à la maison : CPL

  16. #16
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Merci pour vos réponses, ça marche déjà mieux avec le " buf[i]- '\0' "

  17. #17
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Pour le pseudo juste après un accept tu peux faire un read et le buffer contiendra le pseudo du joueur.
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  18. #18
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Bonjour,

    j'ai reussit à resoudre les gros probleme, mon morpion marche mais seulement avec un serveur.
    Meme si j'en connecte 2, le serveur ,ne communique qu'avec un seul...

    je comprends pas pourquoi!!!

    Voilà le code du client, si quelqu'un pouvait me dire où est ce que ça coince, ça serait gentil.

    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
    #include "fonction.h"
     
    main(int argc, char *argv[])
    {
      int sock, rval;
     
      char *buf=malloc(sizeof(char)*1024);
      bzero(buf,sizeof(buf));
     
      char *data=malloc(sizeof(char)*1024);
      bzero(data,sizeof(data));
     
      struct sockaddr_in serveur_adr, sock_service;
      struct hostent *machine;
      int length;
     
      sock=socket (AF_INET, SOCK_STREAM, 0);
      if (sock < 0)
      {
        perror("socket client");
        exit(1);
      }
     
      bzero (&serveur_adr, sizeof (serveur_adr));
      serveur_adr.sin_family= AF_INET;
      serveur_adr.sin_port= htons(NPORT);
      serveur_adr.sin_addr.s_addr= inet_addr("127.0.0.1");
     
      if(connect(sock,(struct sockaddr*) &serveur_adr, sizeof(serveur_adr)) < 0)  //Connecte le client avec le serveur
      {
        perror("connect");
        close(sock);
        exit(1);
      }
     
      do
      {
        rval=read(sock,buf,1024);
     
        if( rval<0)
        {
          perror("read client");
          exit(1);
        }
        if(rval==0)
          printf("Fin de connection\n");
        else
        {
          msg_recu(buf);
          data=msg_saisi();
     
          if(write(sock, data, strlen(data)) < 0)  //Ecrit dans sock le nom du fichier
          {
            perror("write client");
            close(sock);
            exit(1);
          }
        }
      }while(rval!=0);//fin do while
      close (sock);
     
    }
    Merci.

  19. #19
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    J'ai pas compris ton problème.

    Si il marche avec un seul serveur ben c'est bon y'a pas besoin d'en mettre 2.
    Juste comme ça, tu peux pas avoir 2 serveur utilisant le même port sur une machine hein.

    A moins que tu voulais dire client.
    Réexplique ton problème stp.

    A propos de ton code :
    • malloc est inutile tu utilises une taille fixe
    • bzero est déprécié, utilise memset
    • le 1er argument de socket c'est PF_INET et non AF_INET
    • on écrit connexion et non connection
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  20. #20
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Skyrunner
    • le 1er argument de socket c'est PF_INET et non AF_INET
    En fait, d'après POSIX.1, les deux sont confondus...
    Pas de Wi-Fi à la maison : CPL

Discussions similaires

  1. probleme avec SELECT..FROM..WHERE
    Par VBBBA dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 08/09/2006, 15h58
  2. [EJB3][HIBERNATE] Probleme avec select max
    Par kristof_machin dans le forum Hibernate
    Réponses: 2
    Dernier message: 26/04/2006, 13h05
  3. [VB]probleme avec select case
    Par mickael99 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 03/02/2006, 14h07
  4. Probleme avec select
    Par sorry60 dans le forum Réseau
    Réponses: 20
    Dernier message: 16/12/2005, 17h23
  5. Probleme avec Select Case
    Par GeffD dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 07/03/2005, 15h28

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