<C++Programation réseau>select() recvfrom ()

Fermé
lucichose Messages postés 39 Date d'inscription mardi 29 juillet 2008 Statut Membre Dernière intervention 7 mars 2012 - Modifié par lucichose le 17/06/2010 à 11:18
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:

 while ( !bClose ) 
 { 
  ID_IP.clear ( ); 
   
  //Verouille le mutex 
  WaitForSingleObject ( myMutex, NULL ); 

  //Recuperation des données des utilisateurs connectés 
  TheServer->Get_myID_Ip_User ( ID_IP ); 

  //Lock le mutex 
  ReleaseMutex ( myMutex ); 

  if ( !ID_IP.empty ( ) ) 
  { 
   //Creation d'un iterateur au debut de la map 
   kstl::map < int, CONNEXION* >::iterator It = ID_IP.begin ( ); 

   fd_set Set_Read; 
   fd_set Set_Exept; 
   fd_set Set_Write; 
   struct timeval tv; 
   struct sockaddr_in SenderInfo; 
    
   SenderInfo.sin_family = AF_INET; 

   tv.tv_sec = 0; 
   tv.tv_usec = 10000; 

   //Parcour de la map 
   while ( It != ID_IP.end ( ) ) 
   { 

    FD_ZERO ( &Set_Read ); 
    FD_ZERO ( &Set_Exept ); 
    FD_ZERO ( &Set_Write ); 

    FD_SET ( ( *It ).second->Socket, &Set_Read ); 
    FD_SET ( ( *It ).second->Socket, &Set_Write ); 
    FD_SET ( ( *It ).second->Socket, &Set_Exept ); 

    It++; 
   } 
    
   int iValue = select ( 0, &Set_Read, &Set_Write, &Set_Exept, &tv ); 

   if ( iValue ) 
   { 
    kstl::map < int, CONNEXION* >::iterator It = ID_IP.begin ( ); 

    while ( It != ID_IP.end ( ) ) 
    { 
     if ( FD_ISSET ( ( *It ).second->Socket, &Set_Read ) ) 
     { 
      int test = 1;  
      //Sauvegarder la connexion en lecture 
     } 
     if ( FD_ISSET ( ( *It ).second->Socket, &Set_Write ) ) 
     { 
      int test = 1;  
      //Sauvegarder la connexion en ecriture 
     } 
     if ( FD_ISSET ( ( *It ).second->Socket, &Set_Exept ) ) 
     { 
      int test = 1;  
      //Sauvegarder la connexion en erreur 
     } 

     It ++; 
    } 
   } 

   char tab [1024*10] = {0}; 
   int lenght = sizeof ( &SenderInfo ); 
   kstl::map < int, CONNEXION* >::iterator It2 = ID_IP.begin ( ); 
   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 ) 

   if ( iReceiveLenght > 0 ) 
   { 
    printf ( "Paquet recu\n"); 
   } 
   else 
   { 
    perror( "recvfrom" ); 

    printf ( "Paquet non recu\n" ); 
   } 
  } 
 } 

 return 0;