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

MFC Discussion :

winsock.h et portabilité unix


Sujet :

MFC

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Points : 1 053
    Points
    1 053
    Par défaut winsock.h et portabilité unix
    Bien le bonjour à tous.
    Pour mes cours, je dois réaliser une librairie de connexions tcp sous unix.
    Je dois pour cela utiliser la librairie sys/socket.h contenant des fonctions telles que socket(), bind(), send(),...
    J'aimerais pouvoir travailler sur ca chez moi avec visual c++ 6. J'ai fouillé un peu et il semblerait que winsock.h contienne les mêmes fonctions. Malheureusement, dés que j'en utilise une il se produit une erreur au link. Je crois (sans en être sur) que je dois faire un lien avec une dll: winsock.dll.
    Quelqu'un pourrait-il me dire comment faire ca?
    Ou alors, si je me goure complètement, quelle est la solution à mon problème?

  2. #2
    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 519
    Points
    41 519
    Par défaut
    Pour faire le lien: tu ajoutes winsock.lib dans la rubrique "librairies" du projet.

    - OU: - (mais pas portable)

    Tu ajoutes la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #pragma comment(lib, "winsock.lib")
    dans l'un de tes fichiers source.
    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
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Points : 1 053
    Points
    1 053
    Par défaut
    En fait, il n'existe pas de winsock.lib. C'était la première chose que j'avais cherché sans succès, d'où mon post.
    Néanmoins j'ai trouvé un autre fichier: WSOCK32.LIB.
    Avec ca on dirait bien que la compilation fonctionne, je vais voir si ca marche aussi à l'exécution.

  4. #4
    Membre habitué Avatar de Crisanar
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    162
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 162
    Points : 137
    Points
    137
    Par défaut
    Si tu utilises winsock2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #pragma comment(lib, "ws2_32.lib")
    #include <winsock2.h>
    Cependant, bien que les fonctions sont forts semblables sous win32 il existe quelques différences qui font que ton code ne sera pas portable. Si tu veux créer un code portable il va falloir jouer avec les directives de pré-compilation (ex: #ifndef _WIN32)

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Points : 1 053
    Points
    1 053
    Par défaut
    Il y a un truc très bizzare: le programme se compile bien, à prioris tout devrait fonctionner.
    Mais il suffit de passer la commande
    hSocket=socket(AF_INET,SOCK_STREAM,0);
    pour que ca renvoie -1. Mais le pire c'est que errno est toujours à 0, et il en est de même pour les deux ou trois autres fonctions qua j'ai testée.
    Que ca merde à un endroit ou un autre je m'y attendais, mais même la fonction la plus rudimentaire refuse de fonctionner.

    Quelqu'un peut m'expliquer parceque moi pas comprendre.

    PS: j'ajouterais que le résultat est le même avec winsock.h et winsock2.h (ainsi que leurs .lib respectifs).

  6. #6
    Membre habitué Avatar de Crisanar
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    162
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 162
    Points : 137
    Points
    137
    Par défaut
    errno ça fonctionne sous Windows? Je pense que c'est propre à UNIX! En tout cas il est plus sûr d'utiliser GetLastError() et ici spécialement WSAGetLastError().
    Pour utiliser les fonctions winsock2, il faut initialiser la librairie avec WSAStartup().

    Voici un petit exemple d'un client tiré du SDK
    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
    #include <stdio.h>
    #include "winsock2.h"
     
    void main() {
     
        // Initialize Winsock.
        WSADATA wsaData;
        int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
        if ( iResult != NO_ERROR )
            printf("Error at WSAStartup()\n");
     
        // Create a socket.
        SOCKET m_socket;
        m_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
     
        if ( m_socket == INVALID_SOCKET ) {
            printf( "Error at socket(): %ld\n", WSAGetLastError() );
            WSACleanup();
            return;
        }
     
        // Connect to a server.
        sockaddr_in clientService;
     
        clientService.sin_family = AF_INET;
        clientService.sin_addr.s_addr = inet_addr( "127.0.0.1" );
        clientService.sin_port = htons( 27015 );
     
        if ( connect( m_socket, (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR) {
            printf( "Failed to connect.\n" );
            WSACleanup();
            return;
        }
     
        // Send and receive data.
        int bytesSent;
        int bytesRecv = SOCKET_ERROR;
        char sendbuf[32] = "Client: Sending data.";
        char recvbuf[32] = "";
     
        bytesSent = send( m_socket, sendbuf, strlen(sendbuf), 0 );
        printf( "Bytes Sent: %ld\n", bytesSent );
     
        while( bytesRecv == SOCKET_ERROR ) {
            bytesRecv = recv( m_socket, recvbuf, 32, 0 );
            if ( bytesRecv == 0 || bytesRecv == WSAECONNRESET ) {
                printf( "Connection Closed.\n");
                break;
            }
            if (bytesRecv < 0)
                return;
            printf( "Bytes Recv: %ld\n", bytesRecv );
        }
     
        return;
    }
    Je ne peux que trop te conseiller d'aller jetter un oeil dans le sdk ou sur l'msdn online pour plus d'informations.

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Points : 1 053
    Points
    1 053
    Par défaut
    Ok, ca fonctionne, j'arrive à envoyer et recevoir des informations.
    Reste qu'à attendre demain pour pouvoir tester la compatibilité unix sur les ordis de mon école.

  8. #8
    Membre habitué Avatar de Crisanar
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    162
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 162
    Points : 137
    Points
    137
    Par défaut
    Si tu écris le code tel quel il ne fonctionnera jamais
    Il faut changer les librairies et enlever les WSAxxxx ainsi que quelques types qui changent.

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Points : 1 053
    Points
    1 053
    Par défaut
    Oui ca je sais merci .
    Tu penses bien que si j'ai posté ce thread c'est que je connaissais déja les connexions tcp sous unix. Le code a tout de suite été étoffé d'une multitude de #ifdef WIN32. Mais il y a quand même quelques trucs qu'il me faudra corriger (les exceptions par exemple, même si ca n'a aucun rapport avec winsock).

  10. #10
    Membre habitué Avatar de Crisanar
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    162
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 162
    Points : 137
    Points
    137
    Par défaut
    Ok autant pour moi. Mais je préférais te prévenir

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Points : 1 053
    Points
    1 053
    Par défaut
    Voila, j'ai tout testé et tout fonctionne impec.
    Merci à ceux qui ont répondu.

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Bonjour

    Désolé de resortir ce topic mais j'avais une petite question.

    Je suis entrain de développer sous Visual Studio et j'essaie d'utiliser des threads. Mais avant même de tester quoi que soit, ça plante à la compilation dès que je mets les lignes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include <stdio.h>
    #include "winsock2.h"
    ça me met les erreurs suivantes :

    Compilation...
    monfichier.cpp
    \ServProv.h(48 ) : warning C4935: spécificateur d'accès à l'assembly modifié à partir de 'public'
    \ServProv.h(93) : error C2872: 'IServiceProvider' : symbole ambigu
    est peut-être '\ServProv.h(48 ) : System::IServiceProvider IServiceProvider'
    ou 'stdafx.cpp(0) : System::IServiceProvider'
    \ServProv.h(100) : fatal error C1903: impossible de récupérer à partir des erreurs précédentes ; arrêt de la compilation
    commu2.cpp
    \ServProv.h(48 ) : warning C4935: spécificateur d'accès à l'assembly modifié à partir de 'public'
    \ServProv.h(93) : error C2872: 'IServiceProvider' : symbole ambigu
    est peut-être '\ServProv.h(48 ) : System::IServiceProvider IServiceProvider'
    ou 'stdafx.cpp(0) : System::IServiceProvider'
    \ServProv.h(100) : fatal error C1903: impossible de récupérer à partir des erreurs précédentes ; arrêt de la compilation
    Mais comme je suis pas vraiment expert, je ne comprend pas du tout ces messages d'erreurs...

    Merci d'avance de votre aide.

  13. #13
    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 519
    Points
    41 519
    Par défaut
    tu peux nous mettre la liste complète des headrs que tu inlcues?
    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.

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

Discussions similaires

  1. Winsock != unix's sock || Handle != pthread ?
    Par la_tupac dans le forum Linux
    Réponses: 1
    Dernier message: 18/08/2009, 21h28
  2. portabilité unix -> windows
    Par lguignar dans le forum C++
    Réponses: 19
    Dernier message: 25/08/2008, 12h48
  3. portabilité des \ sur unix
    Par pascale_92 dans le forum C++
    Réponses: 1
    Dernier message: 14/11/2007, 23h42
  4. [vb.net/unix] Portabilité d'une appli VB.NET sous UNIX
    Par patanoc dans le forum Visual Studio
    Réponses: 8
    Dernier message: 25/11/2006, 10h34
  5. Portabilité IHM Python : unix, linux, windows
    Par devl83 dans le forum GUI
    Réponses: 3
    Dernier message: 08/09/2006, 16h49

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