Salut,

Voila je venais voir ici pour vous demander votre opinion pour savoir pourquoi mon code ci dessous fonctionne sous XP mais pas sous 7.
Voir surtout si je n'ai pas fait d'erreur dans les sendto / recvfrom !

Utilisation :
- Le client envoie un broadcast avec la chaine "DECOUVERTE".
-> Le serveur repond avec une structure contenant des infos
-> Le client recueille toutes les infos recues dans un tableau qu'il affichera plus tard.

Sous XP ca marche bien, je recois la structure, sous 7 pas d'erreur mais je recois rien :/

Le code serveur :
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
DWORD WINAPI HebergementPartie(void * thPartie) // Avec un thread on a un type void * (on peut mettre ce qu'on veut)
{
      InfosPartie * PartieCree = thPartie; // On indique qu'on veut travailler sur une structure InfosPartie pour notre variable e/s
      int CodeErreur; // Code d'erreur des fonctions
      int ReponseConnexion;
      int TailleStructure; // Taille de la structure serveur
      char TexteErreur[120]; // Pour insérer le message d'erreur des socket dans la msgbox
      int LongueurMessage; // Nombre de caracteres
      char Tampon[30]; // Tampon pour les données reçues ou envoyées
      SOCKADDR_IN InfosServeur, InfosClient; // Structure contenant les infos du serveur
 
      idSocketCourant = socket(AF_INET,SOCK_DGRAM,0); // On ouvre la socket en UDP
      if (idSocketCourant == INVALID_SOCKET)
      {
               sprintf(TexteErreur,"Impossible de creer la socket du à l'erreur : %d",WSAGetLastError());
               MessageBox(fenetreAnimHebergement,TexteErreur,"Erreur Générale !",MB_OK | MB_ICONERROR);
               return -1; // On termine la fonction et renvoi -1 pour prevenir l'appli principale
      }
 
      /* Config Infos Serveur */  
      InfosServeur.sin_family = AF_INET;
      InfosServeur.sin_addr.s_addr = inet_addr(PartieCree->IPServeur); // Ecoute sur l'IP choisie, évite d'écouter sur toutes les IPS et d'avoir X parties affichees
      InfosServeur.sin_port = htons(PORT_SERVICE_SERVEUR); // Ecoute sur le port 1337
      /* ******************* */
 
      CodeErreur = bind(idSocketCourant,(struct sockaddr*)&InfosServeur,sizeof(InfosServeur)); // On bind la socket
      if (CodeErreur != 0)
      {
            sprintf(TexteErreur,"Impossible d'écouter ce port du à l'erreur : %d",WSAGetLastError());
            MessageBox(fenetreAnimHebergement,TexteErreur,"Erreur Générale !",MB_OK | MB_ICONERROR);
            return -1;
      }
 
      TailleStructure = sizeof(InfosServeur); // Taille de la structure car pointeur dans le recvfrom
 
      while(1)
      {
              LongueurMessage = recvfrom(idSocketCourant,Tampon,sizeof(Tampon),0,(struct sockaddr*)&InfosClient,&TailleStructure);
              if (LongueurMessage == SOCKET_ERROR)
              {
                     sprintf(TexteErreur,"Impossible de recevoir les données du à l'erreur : %d",WSAGetLastError());
                     MessageBox(fenetreAnimHebergement,TexteErreur,"Erreur Générale !",MB_OK | MB_ICONERROR);
                     return -1;
              }
              Tampon[LongueurMessage] = 0; // On rajoute \0 pour fermer la chaine
 
              if(!strcmp(Tampon, "DECOUVERTE")) // On envoie la structure de la partie créée et on continue à écouter
              { 
                     LongueurMessage = sendto(idSocketCourant, (char*)PartieCree, sizeof(InfosPartie),0,(struct sockaddr*)&InfosClient,TailleStructure);
                     if (LongueurMessage == SOCKET_ERROR)
                     {
                             sprintf(TexteErreur,"Impossible d'envoyer les données du à l'erreur : %d",WSAGetLastError());
                             MessageBox(fenetreAnimHebergement,TexteErreur,"Erreur Générale !",MB_OK | MB_ICONERROR);
                             return -1;
                     }
[etc.........]
Et le client :
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
95
96
97
98
DWORD WINAPI RechercherPartie(void * thParties) // Avec un thread on a un type void * (on peut mettre ce qu'on veut)
{
      InfosPartie * Partie = thParties; // On indique qu'on veut travailler sur une structure InfosPartie pour notre variable e/s
 
      /* Definition des variables */
      int CodeErreur; // Code d'erreur des fonctions
      char TexteErreur[120]; // Pour insérer le message d'erreur des socket dans la msgbox
      int TailleStructure; // Taille de la structure serveur
      int LongueurMessage; // Nombre de caracteres
      int ValeurA1=1; // Necessaire pour le broadcast, doit etre envoyé sous forme d'adresse
      int NumeroPartie=0;
      int RetourConnexion;
      char Tampon[30]; // Tampon pour les données reçues ou envoyées
      SOCKET idSocket; // Identifiant de la socket
      SOCKADDR_IN InfosServeur, MesInfos; // Structure contenant les infos du serveur
      /* ************************ */
 
      idSocket = socket(AF_INET,SOCK_DGRAM,0); // On ouvre la socket en UDP
      if (idSocket == INVALID_SOCKET)
      {
               sprintf(TexteErreur,"Impossible de creer la socket du à l'erreur : %d",WSAGetLastError());
               MessageBox(fenetreRechercherPartie,TexteErreur,"Erreur Générale !",MB_OK | MB_ICONERROR);
               return -1; // On termine la fonction et renvoi -1 pour prevenir l'appli principale
      }
 
      /* Config Infos Serveur + fonction broadcast */    
      InfosServeur.sin_family = AF_INET;
      InfosServeur.sin_addr.s_addr = INADDR_BROADCAST; // On ne connait pas l'IP du serveur, alors on fait un broadcast
      InfosServeur.sin_port = htons(PORT_SERVICE_SERVEUR); // Demande sur le port 1337
 
      setsockopt(idSocket, SOL_SOCKET, SO_BROADCAST, (char*)&ValeurA1, 1); // Fonction necessaire en cas de broadcast
      /* ***************************************** */
 
      /* Config Infos Client */ 
      MesInfos.sin_family = AF_INET;
      MesInfos.sin_addr.s_addr = INADDR_ANY; // Ecoute sur toutes les IPs 
      MesInfos.sin_port = htons(PORT_SERVICE_CLIENT); // Demande sur le port 1337
      /* ******************* */
 
      CodeErreur = bind(idSocket,(struct sockaddr*)&MesInfos,sizeof(MesInfos)); // On bind la socket pour recevoir des donnees
      if (CodeErreur != 0)
      {
            sprintf(TexteErreur,"Impossible d'écouter ce port du à l'erreur : %d",WSAGetLastError());
            MessageBox(fenetreRechercherPartie,TexteErreur,"Erreur Générale !",MB_OK | MB_ICONERROR);
            closesocket(idSocket);
            return -1;
      }
 
      strcpy(Tampon,"DECOUVERTE"); // Copie la chaine de caractère dans buffer
 
      LongueurMessage = sendto(idSocket,Tampon,strlen(Tampon),0,(struct sockaddr*)&InfosServeur,sizeof(InfosServeur)); // On envoie la sequence DECOUVERTE pour demander les infos des parties
      if (LongueurMessage == SOCKET_ERROR)
      {
            sprintf(TexteErreur,"Impossible d'envoyer les données du à l'erreur : %d",WSAGetLastError());
            MessageBox(fenetreRechercherPartie,TexteErreur,"Erreur Générale !",MB_OK | MB_ICONERROR);
            closesocket(idSocket);
            return -1;
      }
 
      TailleStructure = sizeof(MesInfos); // Taille de la structure
 
      /* Configuration du timeout (fonction select();) */
      fd_set PretARecevoir; // Variable pour savoir si le socket est pret a recv
      struct timeval ConfigTemps; // Structure de config du timeout
      int ValeurRetourSelect; // Valeur renvoyee par select
      ConfigTemps.tv_sec = 5; // Timeout du select
      /* ********************************************* */
 
      while(1)
      {
            FD_ZERO(&PretARecevoir); // On met des zeros partout
            FD_SET(idSocket, &PretARecevoir); // On associe l'id du socket
            ValeurRetourSelect = select(idSocket + 1, &PretARecevoir, NULL, NULL, &ConfigTemps); // On teste le socket
 
            if (ValeurRetourSelect > 0) // Reception de quelque chose avant timeout
            {
                   LongueurMessage = recvfrom(idSocket, (char*)&Partie[NumeroPartie], sizeof(InfosPartie),0,(struct sockaddr*)&InfosServeur,&TailleStructure); // On recoit et on reboucle
                   if (LongueurMessage == SOCKET_ERROR)
                   {
                           sprintf(TexteErreur,"Impossible de recevoir les données du à l'erreur : %d",WSAGetLastError());
                           MessageBox(fenetreRechercherPartie,TexteErreur,"Erreur Générale !",MB_OK | MB_ICONERROR);
                           closesocket(idSocket);
                           return -1;
                   }
                   NumeroPartie++;              
            }
            else if (ValeurRetourSelect == 0) // Le delai est expiré alors on sort de la boucle
            {
                   break;
            }
            else // Erreur de configuration
            {
                   MessageBox(fenetreRechercherPartie,"Erreur de la fonction select() !","Erreur Générale !",MB_OK | MB_ICONERROR);
                   closesocket(idSocket);
                   return -1;
            }
      }
[Fin .....]
Il se peut qu'il y ait des erreurs de conception

Merci!