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

Réseau C Discussion :

[Windows et socket] pb compilation et ptite question


Sujet :

Réseau C

  1. #1
    Membre habitué

    Inscrit en
    Janvier 2006
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 188
    Points : 142
    Points
    142
    Par défaut [Windows et socket] pb compilation et ptite question
    voici ce que j'ai :
    - un fichier lib : saveOutlookLib.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #include <winsock2.h>
    #pragma comment(lib,"ws2_32.lib") // si vous compiler sous Borland
    .
    .
    définitions de constantes et de fonctions
    .
    .
    - le fichier principal : saveOutlookClient.c
    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
     
    #include <windows.h>
    #include "saveOutlookLib.c"
     
    // Fonction Principale :p
    int main(int argc, char *argv[], char **envp){
     
        WSADATA wsaData;
        int res, sock;	
        // Importation de l'API Socket
        if((res = WSAStartup(MAKEWORD(2,0), &wsaData)) != 0){
    	perror("Pb Importation dll API Socket :s\n");
    	return -1; // on quitte alors le programme
        }
        // Création d'une instance de socket (protocole TCP/IP)
        if ( (sock=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET){
    	perror("Pb Création Instance Socket TCP/IP\n");
    	return -1; // echec
        }
     
        close(sock);
        WSACleanup();
        exit(0);
    }
    A priori tout va bien il me semble :s
    Voici l'erreur de compilation :

    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
     
    #C:\Documents and Settings\admin\Bureau>gcc -c saveOutlookLib.c
     
    #C:\Documents and Settings\admin\Bureau>gcc -c saveOutlookClient.cpp
     
    #C:\Documents and Settings\admin\Bureau>gcc saveOutlookClient.o -o cli.exe
    saveOutlookClient.o(.text+0x2db):saveOutlookClient.cpp: undefined reference to `
    WSAStartup@8'
    saveOutlookClient.o(.text+0x321):saveOutlookClient.cpp: undefined reference to `
    socket@12'
    saveOutlookClient.o(.text+0x360):saveOutlookClient.cpp: undefined reference to `
    WSACleanup@0'
    collect2: ld returned 1 exit status
     
    #C:\Documents and Settings\admin\Bureau>
    Si kelk1 peut m'aider plz.
    c'est la firs fois que je fais du C sous Windows :s



    PS : j'ai un autre pb : lorsque j'utilise la fonction bzero dpe string.h dans ma librairie, je peux la comiler mais j'obtiens une erreur dessus lorsque je compile comme ci-dessus le prog principal :s

    Last Question : est ce que ça, ça peut marcher sous windows :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            do{
                bzero(&(buffer),BUFFER);
                bytesLus=fread(buffer,1,BUFFER,fd);
                write(sock,buffer,bytesLus);
            }while(bytesLus == BUFFER);
    i.e : peut on faire un write sur une socket ou faut obligatoirement passer par un send ?

    Merci d'avance
    ++

  2. #2
    Membre habitué

    Inscrit en
    Janvier 2006
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 188
    Points : 142
    Points
    142
    Par défaut
    je pense qu'il s'agit juste d'une option à rajouter dans gcc mais j'ignore laquelle :s
    help please

  3. #3
    Membre confirmé Avatar de Mayti4
    Inscrit en
    Février 2004
    Messages
    442
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 442
    Points : 488
    Points
    488
    Par défaut
    Il faut linker à libws2_32.a
    close(sock);
    closesocket sous Windows.
    L'itération est humaine; la récursion, divine.

  4. #4
    Membre habitué

    Inscrit en
    Janvier 2006
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 188
    Points : 142
    Points
    142
    Par défaut
    ça marche toujours pas :s
    j'ai la même erreur :s
    j'ai simplifié le code :
    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
     
    #include <stdio.h> 
    #include <stdlib.h>
    #include <errno.h>
    #include <winsock2.h>
     
    int main(int argc, char *argv[], char **envp){
     
        WSADATA wsaData;
        int res, sock;	
        // Importation de l'API Socket
        if((res = WSAStartup(MAKEWORD(2,0), &wsaData)) != 0){
    	perror("Pb Importation dll API Socket :s\n");
    	return -1; // on quitte alors le programme
        }
        // Création d'une instance de socket (protocole TCP/IP)
        if ( (sock=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET){
    	perror("Pb Création Instance Socket TCP/IP\n");
    	return -1; // echec
        }
     
        closesocket(sock);
        WSACleanup();
        exit(0);
    }
    j'ai juste installer Dev-C++. En l'utilisant j'ai la même erreur. il compile pas :s
    comment il faut faire ?

  5. #5
    Membre confirmé Avatar de Mayti4
    Inscrit en
    Février 2004
    Messages
    442
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 442
    Points : 488
    Points
    488
    Par défaut
    Tu as ajouté le fichier libws2_32.a à ton projet Dev-C++ ?
    L'itération est humaine; la récursion, divine.

  6. #6
    Membre confirmé Avatar de Lunixinclar
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 416
    Points : 489
    Points
    489
    Par défaut
    Menu projet/options/onglet paramètres/ajouter fichier.

    PS: une autre des particularités de windows est d'employer un descripteur de socket qui n'est pas un int, mais le descripteur SOCKET.

    Du coup pas besoin de déclarer les deux int :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (WSASTARTUP(MAKEDWORD(2,2'), &wsa != 0) return -1;

  7. #7
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Lunixinclar
    Menu projet/options/onglet paramètres/ajouter fichier.
    Pour être plus précis, c'est dans l'onglet 'linker' qu'il faut ajouter le fichier de bibliothèque...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (WSASTARTUP(MAKEDWORD(2,2'), &wsa != 0) return -1;
    Utilisation abusive et pas claire de l'opérateur ','. Tu peux expliquer ce que tu as voulu faire ? Je ne vois pas comment l'adresse d'un variable locale vaudrait NULL ...
    Pas de Wi-Fi à la maison : CPL

  8. #8
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par ramislebob
    voici ce que j'ai :
    - un fichier lib : saveOutlookLib.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #include <winsock2.h>
    http://emmanuel-delahaye.developpez.com/reseaux.htm
    Pas de Wi-Fi à la maison : CPL

  9. #9
    Membre habitué

    Inscrit en
    Janvier 2006
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 188
    Points : 142
    Points
    142
    Par défaut
    merci pour vos réponse.
    finalement j'ai réussi à trouvé coment compiler direct à la main avec le gcc de Dec-C++ : Il faut ajouter la librairie libwsock32.a à la suite des ".o". Un peu chelou...
    Du coup, plus besoin d'utiliser ce log :p
    j'peux prog direct avec gvim pis faire mon makefile pour compiler
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    C:\Documents and Settings\admin\Bureau\C>nmake
     
    Microsoft (R) Program Maintenance Utility   Version 1.50
    Copyright (c) Microsoft Corp 1988-94. All rights reserved.
     
            gcc -c lib.c
            gcc -c client.c
            gcc -o client.exe lib.o client.o libwsock32.a
            gcc -c serveur.c
            gcc -o serveur.exe lib.o serveur.o libwsock32.a
     
    C:\Documents and Settings\admin\Bureau\C>
    Citation Envoyé par Lunixinclar
    PS: une autre des particularités de windows est d'employer un descripteur de socket qui n'est pas un int, mais le descripteur SOCKET.
    Bah... ça passe très bien avec des int. pas besoin d'utiliser le type SOCKET.
    => passage Windows / Linux plus rapide (enfin... ça évite un typedef...)


    Merci pour le lien
    Pas grand chose d'intéressant au niveau des socket mais par contre y a du joli préprocesseur (moi qui savait pas trop l'utiliser....)
    Cool ! mon prog devrait compiler sur Windows et sur Linux sans aucune modif

    Citation Envoyé par Emmanuel Delahaye
    Utilisation abusive et pas claire de l'opérateur ','. Tu peux expliquer ce que tu as voulu faire ? Je ne vois pas comment l'adresse d'un variable locale vaudrait NULL ...
    C'est quoi l'opérateur ',' ?

  10. #10
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    C'est un opérateur qui permet de séparer des expressions dans une instruction (je ne suis pas trop certain du vocabulaire).
    La valeur de l'instruction est celle de la première expression (tout au moins sous Visual C).
    Un code sera plus clair :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int main(void)
    {
     
    	int x;
    	x = 2, 1, 0;
    	printf("%d\n", x);
    	return 0;
    }
    Le programme affiche 2.
    Il est bien évident qu'il faut manipuler cet opérateur avec beaucoup de précautions.
    On le trouve en général dans les déclarations de variables
    ou dans les initialisations de boucles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(i = 0, a = 5, b = 3; ....;...)
    { 
      ...
    }
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Citation Envoyé par ramislebob
    Bah... ça passe très bien avec des int. pas besoin d'utiliser le type SOCKET.
    => passage Windows / Linux plus rapide (enfin... ça évite un typedef...)
    Sauf qu'un SOCKET n'est pas un int sous Windows: c'est un UINT_PTR, un type non-signé qui fait 64-bits sous Win64.

    Et que feras-tu le jour où tu devras porter ton code vers une plate-forme où un socket est un pointeur (genre FILE*) ?

    Quand on te propose une abstraction, tu l'utilises. C'est fait pour.
    Saches qu'on peut tout-à-fait faire un #define closesocket(s) close(s), alors que l'inverse est invalide.
    On peut tout-à-fait faire un typedef int SOCKET; alors que l'inverse est invalide.
    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.

  12. #12
    Membre confirmé Avatar de Lunixinclar
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 416
    Points : 489
    Points
    489
    Par défaut
    J'ai oublié une parenthèse dans le WSAStartup. Désolé.

    Pour l' onglet 'linker' ça dépend de la version qu'on utilise. Idéalement on devrait tous systématiquement poster les numéros de version des compilateurs/IDE.

  13. #13
    Membre habitué

    Inscrit en
    Janvier 2006
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 188
    Points : 142
    Points
    142
    Par défaut
    Citation Envoyé par Trap D
    C'est un opérateur qui permet de séparer des expressions dans une instruction (je ne suis pas trop certain du vocabulaire).
    oki j'crois que je vois un peu.
    perso j'utilise ça que pour les déclarations.
    ça me fait penser à l'assembleur et les taches en parallèles mais bon... parrallélisme de gros bloc de commande... j'y crois moyen sur un pc :s


    Citation Envoyé par Médinoc
    Sauf qu'un SOCKET n'est pas un int sous Windows: c'est un UINT_PTR, un type non-signé qui fait 64-bits sous Win64.
    Vi tu as raison... cé vrai que ma réaction était conne :s mais bon, j'avoue que je maitrisais pas trop les instructions préprocesseur...

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

Discussions similaires

  1. Service Windows et socket
    Par lenouvo dans le forum MFC
    Réponses: 4
    Dernier message: 13/03/2006, 13h51
  2. Ptite question popup IE
    Par zevince dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 15/11/2005, 08h48
  3. ptite question
    Par Andrey dans le forum C
    Réponses: 8
    Dernier message: 12/11/2005, 16h54
  4. ptite question sur le fonctionnement du WSDL
    Par Valarauko dans le forum XMLRAD
    Réponses: 4
    Dernier message: 08/02/2005, 16h07
  5. ptite question sur le having
    Par mic79 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 02/11/2004, 16h43

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