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 �m�rite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    D�tails du profil
    Informations personnelles :
    �ge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    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
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    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 397
    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 �m�rite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    D�tails du profil
    Informations personnelles :
    �ge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    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 confirm� Avatar de Crisanar
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    162
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 162
    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 �m�rite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    D�tails du profil
    Informations personnelles :
    �ge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    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 confirm� Avatar de Crisanar
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    162
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 162
    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 �m�rite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    D�tails du profil
    Informations personnelles :
    �ge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    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 confirm� Avatar de Crisanar
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    162
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 162
    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 �m�rite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    D�tails du profil
    Informations personnelles :
    �ge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    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 confirm� Avatar de Crisanar
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    162
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : Belgique

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

  11. #11
    Membre �m�rite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    D�tails du profil
    Informations personnelles :
    �ge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    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
    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
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    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 397
    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. 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