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

Windows Discussion :

[C][Winsock2 et Ws2tcpip] Problème !


Sujet :

Windows

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut [C][Winsock2 et Ws2tcpip] Problème !
    Bonjour,

    je code en ce moment avec C/GTK un client IRC, je suis depuis aujourd'hui dans les fonctions de connection vers un serveur IRC.
    Mon problème, c'est que je ne peut pas accéder à la fonction getaddrinfo alors que j'ai le fichier d'inclu, j'ai vérifié dans le fichier d'en-tete ws2tcpip et le compilateur inclu cette fonction et d'autres dans cette condition:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #if (_WIN32_WINNT >= 0x0501)
    et je asis que 0x0501 est équivalent à la version WindowsXP (ce que j'ai) mais voici mon message d'erreur lors de la compilation:

    [Linker error] undefined reference to `getaddrinfo'

    Comment je peut faire pour résoudre ce problème ?
    Merci beaucoup
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    Tu dois lier ton programme avec ws2_32.lib (librairie statique d'importation de ws2_32.dll)

    Pour ce faire, deux façons:
    1°) Tu rajoutes la lib dans les options du projet (recommandé)

    2°) Tu rajoutes dans n'importe lequel de tes sources la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #pragma comment(lib, "ws2_32.lib")
    (Mais cette méthode-ci ne marche qu'avec Visual)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Ce que j'ai deja fait, directement dans les options du linker: -lws2_32 -lpthreadGC2

    PS: j'utilise Dev-cpp
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  4. #4
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    En fait, après quelques recherches, j'en suis arrivé à cette conclusion:

    Dans le fichier d'en-tete ws2tcpip.h y'a une condition:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #if (_WIN32_WINNT >= 0x0501)
    
    ...
    
    #endif
    qui m'empeche d'avoir acces à la fonction getaddrinfo, fonction qui biensur est emglobée par ce bloc je sais plus quoi faire !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    Hein? ma réponse n'a pas été postée!
    Oups...

    C'est très simple, il faut indiquer au compilo que tu compiles pour XP, avec un #define _WIN32_WINNT 0x501 (avant d'inclure tout header).
    Ainsi, la condition sera remplie, et ton prog ne marchera pas sous un windows non-XP.

    (les symptomes sur un vieux windows sont variables: soit une erreur "fonction manquante dans la DLL", soit la fonction qui renvoit toujours une valeur d'erreur..."


    PS: quelle version de visual as-tu ?? Moi, je viens de regarder ws2tcpip.h aussi bien dans le vieux Visual 6 que dans le SDK de Février 2003, il n'y a pas un seul #if _WIN32_WINNT!!
    En plus, la fonction getaddrinfo est marqué comme nécéssitant win95 ou supérieur...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    Bon, j'ai regardé à nouveau: getaddrinfo() n'est pas déclarée dans le vieux header, mais est déclarée dans celui du SDK mis à jour, pour toutes les versions.
    Par contre, la version unicode GetAddrInfoW() n'est déclarée que sous XP. (voir post ci-dessus pour l'utiliser)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    En fait j'utilise Dev-cpp !
    Et voici quelques infos sur la fonction, de la part de MSDN

    Requirements
    Client Requires Windows "Longhorn", Windows XP, Windows 2000 Professional, Windows NT Workstation, Windows Me, Windows 98, or Windows 95.
    Server Requires Windows Server "Longhorn", Windows Server 2003, Windows 2000 Server, or Windows NT Server.
    Header

    Declared in Ws2tcpip.h.

    Declared in Wspiapi.h on Windows 2000, Windows NT, and Windows Me/98/95.
    DLL Requires Ws2_32.dll.
    Unicode

    Implemented as GetAddrInfoW (Unicode) and GetAddrInfoA (ANSI).
    En tous cas merci pour l'info, j'ai essayé mais ce ne change rien en fait, j'comprend plus rien là ... pourtant j'ai mis le #define directement au debut de main.c !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  8. #8
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  9. #9
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Bon, j'ai tenté un ultime essaie et vu que j'ai un fichier "...globales.h" bah j'ai mis le #define directement dans cette condition:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #if defined (WIN32)
    #  define _WIN32_WINNT 0x501
    #  include <windows.h>
    #  include <ws2tcpip.h>
    #elif defined &#40;linux&#41;
    #  error not defined for this platform
    #else
    #  error not defined for this platform
    #endif
    et là Ô surprise ca fonctionne .... ce que je me pose comme question c'est quand meme pourquoi il ne l'a pas pris quand je l'ai mis dans le main.c ! Bon bref merci pour tout
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  10. #10
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    à en juger par les commentaires, ce header n'est pas très au point.
    Vraiment pas au point d'ailleurs. Enfin, normalement, avec le #define ça devrait marcher...


    Avec Visual et un SDK récent (J'ai celui de Février 2003, les dernier compatbile avec VIsual 6) c'est supposé marcher...



    /////////////////////////
    AH! je me souviens pourquoi je n'avais pas posté ma réponse: c'était une connerie! Tout ce que j'ai pu te dire, c'était pour résoudre des erreurs de compilation, alors que l'erreur se produit à l'édition de liens!

    Visiblement, c'est libws2_32.a qui ne contient pas getaddrinfo, et à mon avis, tu l'as dans le...

    Ce n'est pas la première fois que Dev-C++ se révèle incomplet...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Ok, bon j'ai meme mis 0x0502 comme ca Windows Server 2003 est aussi pris en compte, je pourrais mettre plus haut (je crois 0x0600) mais je suis pas sur que ce soit pareil au niveau des fichiers !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  12. #12
    Membre émérite

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Par défaut
    Ce qui m'étonne, c'est que le problème semble avoir été résolu (dites-moi si je me trompe) en ajoutant un #define parce qu'un header rendait cette action nécessaire.
    En effet, si c'était un problème de header/#define, comment se fait-il que le message d'erreur cité ("[Linker error] undefined reference to `getaddrinfo'") soit un message de l'éditeur de liens ?
    Si réellement le problème venait du fait qu'une partie d'une header n'était pas incluse à cause d'un #define manquant, l'erreur aurait été signalée par le compilateur, pas par l'éditeur de liens.

  13. #13
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par David.Schris
    Ce qui m'étonne, c'est que le problème semble avoir été résolu (dites-moi si je me trompe) en ajoutant un #define parce qu'un header rendait cette action nécessaire.
    En effet, si c'était un problème de header/#define, comment se fait-il que le message d'erreur cité ("[Linker error] undefined reference to `getaddrinfo'") soit un message de l'éditeur de liens ?
    Si réellement le problème venait du fait qu'une partie d'une header n'était pas incluse à cause d'un #define manquant, l'erreur aurait été signalée par le compilateur, pas par l'éditeur de liens.
    Des fois je cherche meme pas a comprendre
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

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

Discussions similaires

  1. Problème <winsock2.h> C++
    Par Valter dans le forum C++
    Réponses: 7
    Dernier message: 06/09/2008, 13h14
  2. Problème de link avec winsock2.h
    Par sebh dans le forum Windows
    Réponses: 5
    Dernier message: 25/04/2008, 12h01
  3. <winsock2.h> et problème de compréhension
    Par Johannliebert dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 27/11/2006, 12h43
  4. Jeu SDL utilisant Winsock2, problème réseau
    Par TONIAPEL dans le forum C
    Réponses: 2
    Dernier message: 22/08/2006, 22h15

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