C++ socket winsock2.h

Flo -  
bitrate Messages postés 441 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,
j'ai un problème avec l'utilisation de la bibliothèque winsock2.h.

Voici un aperçu de mon programme.

Dans un fichier interface.hpp j'ai une classe qui interface qui est implémentée dans le fichier interface.cpp
Elle permet l'affichage du menu principal de mon jeu et la gestion de l'interface. j'appelle les méthodes de la classe dans mon fichier main après avoir intancié un objet.
jusque là tout marchait.
le jeu étant multi-joueur j'ai du créer une partie cliente et une partie serveur à l'aide des sockets.
j'ai utilisé la bibliothèque winsock2.h. j'ai donc testé séparément du code précédent ma partie ciente et serveur.
tout a bien marché.
le problème est venu lorsque j'ai voulu rajouté ceci dans mon projet.
j'ai donc créé un fichier connexion.hpp avec une classe connexion implémentée dans un fichier connexion.cpp.
j'ai bien rajouté les bibliothèques nécessaires j'ai bien mis des ifndef #define au début de chaque header mais le problème vient lorsque j'inclus mon fichier connexion.hpp dans le fichier interface.cpp
dans une des méthodes de ma classe interface j'ai besoin d'appeler la méthode connexion serveur de ma classe connexion (en gros quand je clique sur un bouton de mon menu principal, la partie serveur se crée et affiche un texte si tout a bien marché) et là ca ne marche plus...
il me sort une erreur.
il me dit qu'il attend quelque chose dans ma "structure" et j'ai environ 12 erreurs, dont certaines sont un le manque d'un ; ou d'un signe.

Pour l'interface j'ai utilisé la SDL, et je code avec code block.
Désolé je n'ai pas le code entier je l'aurai demain si besoin est.

j'ai lu que la bibliothèque winsock2.h ne pouvai être incluse plusieurs fois sinon ca buggé, est-ce que ca peut venir de la ? pourtant je ne l'ai incluse que dans le connexion.hpp que j'inclus dans le interface.cpp.
Configuration: Mac OS X
Safari 1.3

11 réponses

  1. Flo
     
    bon j'ai trouvé j'ai honte tellement c'est nul...
    Résolu
    1
  2. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    houla, pas simple ton problème...
    j'ai lu que la bibliothèque winsock2.h ne pouvai être incluse plusieurs fois sinon ca buggé, est-ce que ca peut venir de la ?
    C'est con ça, remarque avec windows ça m'étonnerai pas.
    Tout ce que tu nous dit n'est pas très clair. Tu as un problème à la compilation ou à l'éxecution ?
    Le mieux serai de mettre le bout de code qui merde ainsi que les erreurs produite.
    0
  3. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  4. 4t0m!k
     
    Pour ceux que ça peut aider :

    Les headers windows (dont winsock2.h) définissent constantes, et si dans votre code source, vous utilisez une variable qui porte le même nom que cette constante, le compilateur remplacera le nom de votre variable par cette constante d'où le bug.

    Dans ce cas, je pense que winsock2.h contient quelque chose du genre :

    #define sock ...
    ou
    #define sin ...

    Donc, quand dans le .h, il déclare

    SOCKET sock;
    SOCKADDR_IN sin;

    et à chaque utilisation de ces variables, ça plante côté compilation.

    Il suffit de changer le nom des variables par un nom qui n'est pas utilisé par les headers windows.
    0
  5. bitrate Messages postés 441 Date d'inscription   Statut Membre Dernière intervention   98
     
    #include <winsock.h>

    ça suffit largement pour les accès réseaux de base.

    winsock2.h n'aime pas trop être appelé plusieurs fois.

    ou alors faut utiliser les entêtes précompilé (+ rapide et + propre)

    A+
    0
    1. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
       
      winsock2.h n'aime pas trop être appelé plusieurs fois.
      Là il faudrait m'expliquer pourquoi. Il n'y a pas de balises de gardes dans ce fichier ?
      0
    2. bitrate Messages postés 441 Date d'inscription   Statut Membre Dernière intervention   98
       
      si mais ça déconne quand même ça dépend aussi de la version de windows utilisé. j'ai pas chercher j'ai remplacé par winsock.h et ça à réglé le problème.
      A+
      0
  6. Flo
     
    voila les messages d'erreur

    interface.cpp:12: error: expected identifier before "struct"
    interface.cpp:12: error: expected identifier before '(' token
    interface.cpp:12: error: expected unqualified-id before ')' token
    interface.cpp:13: error: expected `,' or `;' before '{' token
    interface.cpp:22: error: expected identifier before '~' token
    interface.cpp:22: error: expected class-name before "struct"
    interface.cpp:22: error: expected `,' or `;' before "struct"
    interface.cpp:29: error: expected type-name
    interface.cpp:29: error: expected unqualified-id before ')' token
    interface.cpp:30: error: expected `,' or `;' before '{' token
    interface.cpp:105: error: expected type-name
    interface.cpp:105: error: expected unqualified-id before ')' token
    interface.cpp:106: error: expected `,' or `;' before '{' token
    interface.cpp:130: error: expected type-name
    interface.cpp:130: error: expected unqualified-id before ')' token
    interface.cpp:131: error: expected `,' or `;' before '{' token
    Process terminated with status 1 (0 minutes, 2 seconds)
    -1
  7. Flo
     
    Salut, oui je sais c'est pas simple à expliquer, meme mon prof a pas trouvé .. hum hum.
    Mon problème est à la compilation. voici le code (j'enleve quelques implémentations du code pour alléger la page)
    Fichier reseau.hpp

    #ifndef __Reseau__
    #define __Reseau__
    #include <winsock2.h>
    #include <sys/types.h>

    class reseau
    {
    public:
    reseau();
    ~reseau();
    void connexion_serveur();
    void connexion_client();

    private:

    SOCKET sock;
    SOCKADDR_IN sin;

    };
    #endif

    Fichier reseau.cpp

    #include <sys/types.h>
    #include <iostream>
    #include "reseau.hpp"

    reseau::reseau()
    {

    }

    reseau::~reseau()
    {
    }

    void reseau::connexion_serveur()
    {
    //j'ai enlevé l'implémentation qui fonctionne dans un projet à part
    }

    void reseau::connexion_client()
    {
    idem
    }

    Fichier interface.hpp

    #ifndef __Interface__
    #define __Interface__
    #include <SDL/SDL.h>
    #include <string>

    class interface
    {

    public:

    interface();
    ~interface();
    void menu_principal();
    void config_partie();
    void rejoindrePartie();

    private:

    SDL_Surface *ecran; //c'est la surface principale qui délimite la taille de la fenêtre
    SDL_Surface *imageDeFond; // image de fond
    SDL_Surface *creer; //bouton créer
    SDL_Surface *rejoindre; // bouton rejoindre

    };

    #endif

    Fichier interface.cpp

    #include <SDL/SDL.h>
    #include <string>
    #include "interface.hpp"
    #include "reseau.hpp" // je rajoute cette ligne et j'ai les messages d'erreur cités plus haut

    void texture(int x, int y, SDL_Surface *source, SDL_Surface *destination);

    interface::interface()
    {

    SDL_Surface *ecran= NULL;
    SDL_Surface *imageDeFond = NULL;
    SDL_Surface *creer = NULL;
    SDL_Surface *rejoindre= NULL;

    }

    interface::~interface()
    {

    }

    void interface::menu_principal()
    {

    }

    void interface::config_partie()
    {

    }

    void interface::rejoindrePartie()
    {

    }

    //la fonction qui place les surfaces
    void texture(int x, int y, SDL_Surface *source, SDL_Surface *destination)
    {

    }
    -1
  8. Flo
     
    en rajoutant <winsock2.h> dans le fichier reseau.cpp ca marche... je comprends pas tout
    -1
  9. Flo
     
    non en fait ce ne marche pas j'ai parlé trop vite, bon je sais pas quoi faire je suis perdu
    -1
  10. Chaussette
     
    Oui c'etais quoi? j'ai le meme soucis
    -1