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 :

Code qui fonctionne sous XP mais pas sous 7


Sujet :

C

  1. #1
    Membre régulier Avatar de theclem35
    Homme Profil pro
    Technicien Réseaux & Télécommunications
    Inscrit en
    Décembre 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien Réseaux & Télécommunications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 148
    Points : 86
    Points
    86
    Par défaut Code qui fonctionne sous XP mais pas sous 7
    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!

  2. #2
    Membre émérite
    Avatar de supersnail
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 719
    Points : 2 793
    Points
    2 793
    Par défaut
    Bonjour,

    Je pense qu'il s'agit plus d'une histoire de pare-feu qu'autre chose...En effet, le pare-eu de windows 7 a été amélioré par rapport à celui de XP (qui est une vraie passeoire soit dit en passant), et celui-ci doit certainement bloquer ta connexion...

  3. #3
    Membre régulier Avatar de theclem35
    Homme Profil pro
    Technicien Réseaux & Télécommunications
    Inscrit en
    Décembre 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien Réseaux & Télécommunications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 148
    Points : 86
    Points
    86
    Par défaut
    Salut,

    En fait le sujet a été résolu dans un autre topic, il s'agit du broadcast hyper restreint sur 7 donc le INNADR_BROADCAST ne fonctionne pas.

    Pour le parefeu ce n'était pas ca que si on fait le serveur sur le 7 ca fonctionne mais pas en tant que client

    Bref une gestion des sockets assez compliquée pour faire du broadcast sur 255.255.255.255 sur 7 ....

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Prob] code qui fonctionne sous windows mais pas sous linux
    Par hannibal.76 dans le forum Multimédia
    Réponses: 3
    Dernier message: 07/02/2011, 17h46
  2. Réponses: 5
    Dernier message: 13/04/2009, 23h12
  3. [DOM] Code qui marche sous IE mais pas sous Firefox
    Par angoradefrance dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 18/03/2009, 14h29
  4. Script qui fonctionne sous FireFox mais pas sous IE
    Par Sebastien14 dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 27/01/2009, 10h32
  5. [JMF] Code fonctionnant sous Linux mais pas sous XP
    Par Monsieur_Max dans le forum Multimédia
    Réponses: 4
    Dernier message: 25/05/2006, 18h57

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