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 :

Windows sockets : ne peut pas me connecter au serveur...


Sujet :

Windows

  1. #1
    Membre régulier Avatar de kernigansnotdead
    Homme Profil pro
    Traducteur technique anglais > français indépendant
    Inscrit en
    Septembre 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Traducteur technique anglais > français indépendant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 77
    Points : 73
    Points
    73
    Par défaut Windows sockets : ne peut pas me connecter au serveur...
    Bonjour,

    voila,

    j'ai tenté de suivre le tutoriel de Walrus sur la programmation des sockets sous windows et bien que je comprenne bien le code du tutoriel, je ne peux toujours pas connecter mon client au serveur.
    J'ai pour cela désactivé et mon parfeu préféré, et le parfeu interne à XP, et tester l'activité sur les ports avec 'Local ports'.
    Je lance le serveur et je le retrouve bien à l'état d'écoute au port choisi, jusque là tout va bien.
    Ensuite je lance le client, et là c'est un peu bizzare; il est en état d'écoute pendant deux trois secondes et ensuite disparait (s'arrête). Et donc là, reste seulement le serveur qui écoute... .

    Voici le code impliqué :

    D'abord, le client :

    #include <iostream>
    #include <winsock2.h>
    #pragma comment(lib, "ws2_32.lib")

    using namespace std;

    void main()
    {
    WSADATA WSAData;
    WSAStartup(MAKEWORD(2,0), &WSAData);

    SOCKET sock;
    SOCKADDR_IN sin;

    char *buffer = new char[255];

    sock = socket(AF_INET, SOCK_STREAM, 0);

    sin.sin_addr.s_addr = inet_addr("x.x.x.x");
    sin.sin_family = AF_INET;
    sin.sin_port = htons(17224);

    connect(sock, (SOCKADDR *)&sin, sizeof(sin));
    recv(sock, buffer, sizeof(buffer), 0);
    closesocket(sock);
    WSACleanup();
    }

    ==============================================

    et ensuite, le serveur :

    #include <iostream>
    #include <conio.h>
    #include <winsock2.h>
    #pragma comment(lib, "ws2_32.lib")

    using namespace std;

    void main()
    {
    WSADATA WSAData;
    WSAStartup(MAKEWORD(2,0), &WSAData);

    SOCKET sock;
    SOCKET csock;
    SOCKADDR_IN sin;
    SOCKADDR_IN csin;

    sock = socket(AF_INET, SOCK_STREAM, 0);

    sin.sin_addr.s_addr = INADDR_ANY;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(17224);

    bind(sock, (SOCKADDR *)&sin, sizeof(sin));

    listen(sock, 0);
    while(1)
    {
    int sinsize = sizeof(csin);
    if((csock = accept(sock, (SOCKADDR *)&csin, &sinsize)) != INVALID_SOCKET)
    {
    send(csock, "Hello world!\r\n", 14, 0);
    }
    }
    }

    Voila, je ne vois pas ce qui cloche. j'ai essayé de me connecter à l'adresse de loopback, mais pas de changement.

    Quelqu'un à t-il/elle une idée?

    merci d'avance,
    knd

  2. #2
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Salut !

    tout d'abord, pourrais-tu utiliser les balises code et indenté ton code, ça le rendrait bien plus lisible

    ensuite, pour voir si ça vient du serveur ou du client, vérifie avec telnet :

    lance le serveur
    puis fait : dans la ligne de commande (Démarrer->éxecuter->cmd + entrée)

    si tu reçois bien le message, alors, il n'y a pas de pbs du côté du serveur.

    ensuite, fait faire un truc du style affiché ce qu'il a reçu au socket client plutôt que de l'éteindre direct...
    (genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf&#40;"%s", buffer&#41;; system&#40;"PAUSE"&#41;;
    )

    après, essaie de remplir le else du "if" du serveur avec un message d'erreur et de débugguer en mettant des messages pour pouvoir suivre le parcours du programme, et voir où ça plante

  3. #3
    Membre régulier Avatar de kernigansnotdead
    Homme Profil pro
    Traducteur technique anglais > français indépendant
    Inscrit en
    Septembre 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Traducteur technique anglais > français indépendant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 77
    Points : 73
    Points
    73
    Par défaut
    Bonjour Swoög,

    et merci de ta réponse.
    Voila, j'ai d'abore essayé de me connecter au serveur via telnet, et j'ai réussi. Donc le serveur n'est pas à mettre en doute.

    maintenant, le code que j'utilise est bien indenté avec une syntaxe des couleurs digne de ce nom, mais une fois copié/collé de mon éditeur vers cette page de formulaire, ça ressemble plus à rien de très lisible, d'autant plus que j'ai essayé de réindenter par la suite, la touche tab à eu tout sauf l'effet désiré.

    Sinon donc, je me suis tourné vers le serveur, et là, de deux choses l'une: quand je rentre mon IP comme adresse distante, le code bloque au niveau de :

    if ( connect( m_socket, (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR) {
    printf( "Failed to connect.\n" );
    WSACleanup();
    return;
    }

    je reçois donc un "failed to connect".

    Par contre, si je rentre 127.0.0.1 comme adresse distante, l'exécution du code va plus loin, à savoir :

    while( bytesRecv == SOCKET_ERROR ) {
    cout<<"while2"<<endl;
    bytesRecv = recv( m_socket, recvbuf, 32, 0 );

    et j'obtiens le message :

    bytes received : 21
    bytes sent : 21

    voila ce que j'ai obtenu.

    knd

  4. #4
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    j'ai pas tout compris pour la deuxième partie pour le code, pour le réindenter, t'as toujours la touche espace et s'il te plaît, utilise les balises codes !

    fait un cout <recvbuffer; après ton recv pour voir si tu reçois le bon msg...

    et si tu es derrière un par feu ou un routeur, c'est normal que tu ne puisses pas accèder au serveur via ton IP WAN (internet) qd tu fais des tests de ce type, utilise toujours l'ip la plus proche du PC (si c'est du local, tu utilise 127.0.0.1, si c'est en réseau d'un PC à un autre, utilise les IP LAN (192.168.*.*) et si c'est vraiment par internet seulement utilise les IP WAN, ça évitera généralement les pbs de par feu...)

  5. #5
    Membre régulier Avatar de kernigansnotdead
    Homme Profil pro
    Traducteur technique anglais > français indépendant
    Inscrit en
    Septembre 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Traducteur technique anglais > français indépendant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 77
    Points : 73
    Points
    73
    Par défaut
    bien, en fait, pour faciliter les choses, je ne teste que l'adresse de loopback, et de plus mon parefeu est désactivé de toute façon, et maintenant voila ce que j'ai :

    du coté client /
    Bytes Sent: 21
    recvbuffer=Server: Sending Data.
    Bytes Recv: 21

    du coté serveur/
    Waiting for a client to connect...
    Client Connected.
    Bytes Recv: 21
    Bytes Sent: 21

    mais en fait ça dure une seconde et les deux programmes s'arrêtent.
    Je finis par ne plus y comprendre grand chose...

    knd

  6. #6
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    pourrais-tu reposter le code actuel (entier, avec les balises code et propement indénté) de ton serveur d'un part, et de ton client d'autre part s'il te plaît ?

  7. #7
    Membre régulier Avatar de kernigansnotdead
    Homme Profil pro
    Traducteur technique anglais > français indépendant
    Inscrit en
    Septembre 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Traducteur technique anglais > français indépendant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 77
    Points : 73
    Points
    73
    Par défaut
    voici le code complet :

    le client :
    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
    57
    58
    59
    60
    61
    #include <stdio.h>
    #include <winsock2.h>
    #include <iostream>
    using namespace std;
    
    void main&#40;&#41; &#123;
    
        // Initialize Winsock.
        WSADATA wsaData;
        int iResult = WSAStartup&#40; MAKEWORD&#40;2,2&#41;, &wsaData &#41;;
        if &#40; iResult != NO_ERROR &#41;
            printf&#40;"Error at WSAStartup&#40;&#41;\n"&#41;;
    
        // Create a socket.
        SOCKET m_socket;
        m_socket = socket&#40; AF_INET, SOCK_STREAM, IPPROTO_TCP &#41;;
    
        if &#40; m_socket == INVALID_SOCKET &#41; &#123;
            printf&#40; "Error at socket&#40;&#41;&#58; %ld\n", WSAGetLastError&#40;&#41; &#41;;
            WSACleanup&#40;&#41;;
            return;
        &#125;
    
        // Connect to a server.
        sockaddr_in clientService;
    
        clientService.sin_family = AF_INET;
        clientService.sin_addr.s_addr = inet_addr&#40; "127.0.0.1" &#41;;
        clientService.sin_port = htons&#40; 27015 &#41;;
    
        if &#40; connect&#40; m_socket, &#40;SOCKADDR*&#41; &clientService, sizeof&#40;clientService&#41; &#41; == SOCKET_ERROR&#41; &#123;
            printf&#40; "Failed to connect.\n" &#41;;
            WSACleanup&#40;&#41;;
            return;
        &#125;
    
        // Send and receive data.
        int bytesSent;
        int bytesRecv = SOCKET_ERROR;
        char sendbuf&#91;32&#93; = "Client&#58; Sending data.";
        char recvbuf&#91;32&#93; = "";
    
        bytesSent = send&#40; m_socket, sendbuf, strlen&#40;sendbuf&#41;, 0 &#41;;
        printf&#40; "Bytes Sent&#58; %ld\n", bytesSent &#41;;
    
        while&#40; bytesRecv == SOCKET_ERROR &#41; &#123;
            bytesRecv = recv&#40; m_socket, recvbuf, 32, 0 &#41;;
            cout<<"recvbuffer="<<recvbuf<<endl;
                    if &#40; bytesRecv == 0 || bytesRecv == WSAECONNRESET &#41; &#123;
                       printf&#40; "Connection Closed.\n"&#41;;
                       break;
                       &#125;
            if &#40;bytesRecv < 0&#41;
                return;
                printf&#40; "Bytes Recv&#58; %ld\n", bytesRecv &#41;;
        &#125;
    
        return;
    
    &#125;
    le serveur:

    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    #include <stdio.h>
    #include "winsock2.h"
    #include <iostream>
    using namespace std;
    void main&#40;&#41; &#123;
    
        // Initialize Winsock.
        WSADATA wsaData;
        int iResult = WSAStartup&#40; MAKEWORD&#40;2,2&#41;, &wsaData &#41;;
        if &#40; iResult != NO_ERROR &#41;
            printf&#40;"Error at WSAStartup&#40;&#41;\n"&#41;;
    
        // Create a socket.
        SOCKET m_socket;
        m_socket = socket&#40; AF_INET, SOCK_STREAM, IPPROTO_TCP &#41;;
    
        if &#40; m_socket == INVALID_SOCKET &#41; &#123;
            printf&#40; "Error at socket&#40;&#41;&#58; %ld\n", WSAGetLastError&#40;&#41; &#41;;
            WSACleanup&#40;&#41;;
            return;
        &#125;
    
        // Bind the socket.
        sockaddr_in service;
    
        service.sin_family = AF_INET;
        service.sin_addr.s_addr = INADDR_ANY;
        service.sin_port = htons&#40; 27015 &#41;;
    
        if &#40; bind&#40; m_socket, &#40;SOCKADDR*&#41; &service, sizeof&#40;service&#41; &#41; == SOCKET_ERROR &#41; &#123;
            printf&#40; "bind&#40;&#41; failed.\n" &#41;;
            closesocket&#40;m_socket&#41;;
            return;
        &#125;
        
        // Listen on the socket.
        if &#40; listen&#40; m_socket, 1 &#41; == SOCKET_ERROR &#41;
            printf&#40; "Error listening on socket.\n"&#41;;
    
        // Accept connections.
        SOCKET AcceptSocket;
    
        printf&#40; "Waiting for a client to connect...\n" &#41;;
        while &#40;1&#41; &#123;
            AcceptSocket = SOCKET_ERROR;
            while &#40; AcceptSocket == SOCKET_ERROR &#41; &#123;
                AcceptSocket = accept&#40; m_socket, NULL, NULL &#41;;
                &#125;
            printf&#40; "Client Connected.\n"&#41;;
            m_socket = AcceptSocket; 
            break;
        &#125;
        
        // Send and receive data.
        int bytesSent;
        int bytesRecv = SOCKET_ERROR;
        char sendbuf&#91;32&#93; = "Server&#58; Sending Data.";
        char recvbuf&#91;32&#93; = "";
        
        bytesRecv = recv&#40; m_socket, recvbuf, 32, 0 &#41;;
        printf&#40; "Bytes Recv&#58; %ld\n", bytesRecv &#41;;
        
        bytesSent = send&#40; m_socket, sendbuf, strlen&#40;sendbuf&#41;, 0 &#41;;
        printf&#40; "Bytes Sent&#58; %ld\n", bytesSent &#41;;
    
        return;
    &#125;
    pour la balise code, je n'avais pas compris ce dont tu parlais, mais maintenant j'ai trouvé. Bon en tout cas, voici le code complet du client/ serveur.

    knd

  8. #8
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Merci, (à bah voilà ça c'est du beau code bien présenté lol ^^)

    au vue du code que tu as donné, tout fonctionne parfaitement dans ton programme, je ne vois pas où est le problème...

    quelques suggestions cependant :
    évite d'utiliser cojointement printf et cout, utilise soit l'un soit l'autre, mais pas les deux, en plus de géner pour la lecture, c'est un non-sens car printf est le standard C alors que cout est celui pour C++

    si tu veux que ton serveur puisse accepté plusieurs connections clients, ne sort pas du while(1) quand accept reçoit un socket.

    voilà... c'est à peu près tout

    Ah oui, à priori, c'est la durée "excessivement courte" de la connexion qui semble te pose problème : en connexion locale (sur 127.0.0.1), la temps que prend l'envoie de 64octets (envoie du serveur + envoie du client) doit être de l'ordre du centième de seconde, avec les traitements que tu fait, il n'est absoluement pas surprenant que la vitesse de traitement de tes programmes soient de l'ordre de la seconde ou inférieur...

    Si tu as d'autres questions hésite pas ^^

  9. #9
    Membre régulier Avatar de kernigansnotdead
    Homme Profil pro
    Traducteur technique anglais > français indépendant
    Inscrit en
    Septembre 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Traducteur technique anglais > français indépendant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 77
    Points : 73
    Points
    73
    Par défaut
    beh, en fait, je suis bien conscient que le durée d'envoi et de réception est censée être aussi courte que ça, mais le serveur ainsi que le client ne sont-ils pas censé rester à l'état d'exécution? Je veux dire, les prompts dans lesquels j'ai lancé et le serveur et le clients ne sont pas censé me rendre la main en si peu de temps, non?

    je vais essayé de désactiver le parefeu interne à XP en plus de ZoneAlarm, une fois de plus et je verrais bien

    knd

  10. #10
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    tu ne demandes la main sur les prompts à auncun moment (pas de référence à cin ou à scanf)

    du plus, ni le serveur ni le client ne reste dans une boucle infinie à la fin de la transaction, donc plus rien à faire, le programme s'arrette

  11. #11
    Membre régulier Avatar de kernigansnotdead
    Homme Profil pro
    Traducteur technique anglais > français indépendant
    Inscrit en
    Septembre 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Traducteur technique anglais > français indépendant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 77
    Points : 73
    Points
    73
    Par défaut
    en fait, cela veut-il dire que mon client/serveur marcherait parfaitement, pour le code qu'il y a d'écrit pour l'instant?

    knd

  12. #12
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Citation Envoyé par Swoög
    au vue du code que tu as donné, tout fonctionne parfaitement dans ton programme, je ne vois pas où est le problème...
    en effet

  13. #13
    Membre régulier Avatar de kernigansnotdead
    Homme Profil pro
    Traducteur technique anglais > français indépendant
    Inscrit en
    Septembre 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Traducteur technique anglais > français indépendant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 77
    Points : 73
    Points
    73
    Par défaut
    Bon, et bien c'est génial. Il ne me reste plus qu'à te remercier pour tout et sans oublier de mettre mon post à l'état de résolu.

    A+
    knd

  14. #14
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    De rien, Bonne continuation

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

Discussions similaires

  1. windows ne peut pas se connecter a l'imprimante
    Par awem_skikda1 dans le forum Dépannage et Assistance
    Réponses: 8
    Dernier message: 18/05/2015, 13h24
  2. Windows ne peut pas se connecter à l'imprimante
    Par solaar dans le forum Windows 7
    Réponses: 15
    Dernier message: 13/06/2014, 08h47
  3. JXplorer ne peut pas se connecter à Apache Directory Server
    Par bilou_2007 dans le forum Serveurs (Apache, IIS,...)
    Réponses: 2
    Dernier message: 23/07/2009, 12h21
  4. [WS 2003] Je ne peut pas acceder au Pc Serveur windows 2003
    Par Mounr dans le forum Windows Serveur
    Réponses: 0
    Dernier message: 27/04/2009, 10h48
  5. Réponses: 4
    Dernier message: 26/02/2008, 20h01

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