<Programation réseau> recvfrom ( ) après un select ()

<Programation réseau> recvfrom ( ) après un select () - C++ - Programmation

Marsh Posté le 17-06-2010 à 11:03:15    

Bonjour.
 
j'ai un soucis en programmation réseau. j'ai réalisé la connexion client serveur tout se passe bien , cependant pour la suite ... c'est pas encore ça :p .  
 
j'ai ouvert une socket que j'appellerais " Socket1 "en émission réception , lorsque je fait les accept ( ) coté serveur , cela m'ouvre une nouvelle socket que j'appellerais " Socket2 " pour la connexion distante qui tentais de se connecter. Ensuite je fait un select sur "Socket 1" cela me retourne 2 .  J'essaye donc de récupérer le message qui est envoyer et que le select a détecter, je fait donc un recvfrom avec la "socket1" mais a ce moment la ça me retourne -1.
 
j'ai donc fait un perror ( "recvfrom" ); et il me log: NO ERROR....
 
serais ce possible de m'expliquer où ce trouve mon erreur plz ?
 
Merci d'avance
 
voici plus concrétement le code:

Code :
  1. while ( !bClose )
  2. {
  3.  ID_IP.clear ( );
  4.  //Verouille le mutex
  5.  WaitForSingleObject ( myMutex, NULL );
  6.  //Recuperation des données des utilisateurs connectés
  7.  TheServer->Get_myID_Ip_User ( ID_IP );
  8.  //Lock le mutex
  9.  ReleaseMutex ( myMutex );
  10.  if ( !ID_IP.empty ( ) )
  11.  {
  12.   //Creation d'un iterateur au debut de la map
  13.   kstl::map < int, CONNEXION* >::iterator It = ID_IP.begin ( );
  14.   fd_set Set_Read;
  15.   fd_set Set_Exept;
  16.   fd_set Set_Write;
  17.   struct timeval tv;
  18.   struct sockaddr_in SenderInfo;
  19.   SenderInfo.sin_family = AF_INET;
  20.   tv.tv_sec = 0;
  21.   tv.tv_usec = 10000;
  22.   //Parcour de la map
  23.   while ( It != ID_IP.end ( ) )
  24.   {
  25.    FD_ZERO ( &Set_Read );
  26.    FD_ZERO ( &Set_Exept );
  27.    FD_ZERO ( &Set_Write );
  28.    FD_SET ( ( *It ).second->Socket, &Set_Read );
  29.    FD_SET ( ( *It ).second->Socket, &Set_Write );
  30.    FD_SET ( ( *It ).second->Socket, &Set_Exept );
  31.    It++;
  32.   }
  33.   int iValue = select ( 0, &Set_Read, &Set_Write, &Set_Exept, &tv );
  34.   if ( iValue )
  35.   {
  36.    kstl::map < int, CONNEXION* >::iterator It = ID_IP.begin ( );
  37.    while ( It != ID_IP.end ( ) )
  38.    {
  39.     if ( FD_ISSET ( ( *It ).second->Socket, &Set_Read ) )
  40.     {
  41.      int test = 1;
  42.      //Sauvegarder la connexion en lecture
  43.     }
  44.     if ( FD_ISSET ( ( *It ).second->Socket, &Set_Write ) )
  45.     {
  46.      int test = 1;
  47.      //Sauvegarder la connexion en ecriture
  48.     }
  49.     if ( FD_ISSET ( ( *It ).second->Socket, &Set_Exept ) )
  50.     {
  51.      int test = 1;
  52.      //Sauvegarder la connexion en erreur
  53.     }
  54.     It ++;
  55.    }
  56.   }
  57.   char tab [1024*10] = {0};
  58.   int lenght = sizeof ( &SenderInfo );
  59.   kstl::map < int, CONNEXION* >::iterator It2 = ID_IP.begin ( );
  60.   int iReceiveLenght = recvfrom ( mySocket, tab, 1024*10, 0, ( struct sockaddr* ) &SenderInfo, &lenght );    // mySocket correspond a la socket ouverte en emission reception sur le serveur ( TCP ) ( "Socket1" dans ma description )
  61.   if ( iReceiveLenght > 0 )
  62.   {
  63.    printf ( "Paquet recu\n" );
  64.   }
  65.   else
  66.   {
  67.    perror( "recvfrom" );
  68.    printf ( "Paquet non recu\n" );
  69.   }
  70.  }
  71. }
  72. return 0;

Reply

Marsh Posté le 17-06-2010 à 11:03:15   

Reply

Marsh Posté le 17-06-2010 à 12:29:05    

c'est du C. Si tu fais du C++, utilise les bons outils pour ça :o

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed