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

C++ Discussion :

Problèmes sockets C++, côté client


Sujet :

C++

  1. #1
    Membre expérimenté Avatar de Vespiras
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2012
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 168
    Par défaut Problèmes sockets C++, côté client
    Bonjour à tous

    Voila je suis depuis très longtemps confronté à un problème, qui est la communication entre un client et un serveur via les sockets en C++, tout deux sur le localhost.
    Je m'explique :
    Mon serveur à priori fonctionne, car j'arrive à m'y connecter avec un client telnet, ou même avec un client que j'avais réalisé en Java. Donc de ce côté la, ça à l'air d'aller.

    Toutefois, le client que j'ai fait en C++ ne veut pas se connecter, et pourtant je ne récupère strictement aucun messages d'erreur.
    Voici le code source du client (simplissime à souhait) :
    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
     
    #include <winsock2.h>    	/*socket*/
    #include <stdio.h>      	/*printf*/
    #include <iostream>
    #pragma comment(lib, "ws2_32.lib")
     
    using namespace std;
     
    int main()
    {
        int n;
     
    	WSADATA WSAData;
    	if (WSAStartup(MAKEWORD(2,0), &WSAData)!= 0 )
    	{
    	    cout << " Erreur à l'initialisation du dll !" << endl;
    	    exit(2);
    	}
    	else
    	{
            SOCKET s_client;
            s_client = socket(PF_INET, SOCK_STREAM, 0);
            if (s_client == INVALID_SOCKET)
            {
                cout << " Erreur à l'initialisation du socket !" << endl;
                exit(2);
            }
            SOCKADDR_IN server;
            char buffer[4096];
            char msg[256];
     
            server.sin_family      = AF_INET;
            server.sin_addr.s_addr = inet_addr("127.0.0.1");
            server.sin_port        = htons(45624);
            memset(&server.sin_zero, '\0', sizeof(server.sin_zero));
            cout << "avant bind" << endl;
            bind(s_client, (SOCKADDR *)&server, sizeof(server));
            cout << "apres bind" << endl;
     
            connect(s_client, (SOCKADDR *)&server, sizeof(server));
            cout << "apres connect " << endl;
     
            while(1)
            {
                cout << " dans le while" << endl;
                 cin >> buffer;
                 send(s_client, buffer, sizeof(buffer), 0);
            }
            WSACleanup();
    	}
        return 0;
    }
    Sachant que le port que j'utilise (exemple ici 45624) est libre et que j'utilise le même des deux côtés, de même pour la configuration du serveur. Voici le code mon 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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    #include <winsock2.h>    	//socket
    #include <stdio.h>     	    //printf
    #include <iostream>
    #include <string.h>
    #pragma comment(lib, "ws2_32.lib")
     
    using namespace std;
     
    int main()
    {
        char buffer[4096];
    	WSADATA WSAData;
    	if (WSAStartup(MAKEWORD(2,0), &WSAData) != 0)
    	{
            cout << " Erreur à l'initialisation du dll !" << endl;
    	    exit(2);
    	}
    	else
    	{
            SOCKET s_server, s_client;
            SOCKADDR_IN server;
            SOCKADDR_IN client = { 0 };
     
     
            server.sin_family      = AF_INET;
            server.sin_addr.s_addr = htonl(INADDR_ANY);
            server.sin_port        = htons(45624);
            memset(&server.sin_zero, '\0', sizeof(server.sin_zero));
     
            s_server = socket(AF_INET,SOCK_STREAM,0);
            s_client = socket(AF_INET,SOCK_STREAM,0);
     
            cout << "Demarrage serveur" << endl;
            if (bind(s_server, (SOCKADDR *)&server, sizeof(server)) == SOCKET_ERROR)
                    fprintf(stderr, "La fonction bind a echoue.\n");
                else
                {
     
                    while(1)
                    {
                        cout<< "on entre dans la boucle" << endl;
                        if (listen(s_server, 5) == SOCKET_ERROR) /* listen : commencer l'ecoute */
                            fprintf(stderr, "La fonction listen a echoue.\n");
                        else
                        {
                            int csize = sizeof(client);
                            s_client = accept(s_server, (SOCKADDR *)&client, &csize);
                            if (s_client == INVALID_SOCKET)
                            {
                                fprintf(stderr, "La fonction accept a echoue.\n");
                            }
                            else
                            {
                                char buffer[4096];
                                int n = 0;
                                printf("Le client %s s'est connecte !\n", inet_ntoa(client.sin_addr));
                                while(strcmp(buffer,"exit")!=0)
                                {
                                    recv(s_client, buffer, sizeof(buffer) - 1, 0);
     
                                    //cout << buffer << endl;
     
                                    if (n != SOCKET_ERROR)
                                    {
                                        cout << buffer << endl;
                                    }
                                    strcpy(buffer,"");
                                }
     
                                closesocket(s_client);
                            }
                        }
                    }
                    WSACleanup();
                }
        }
     
        return 0;
    }
    Mon serveur est sensé afficher "Le client "IP_CLIENT" s'est connecté", ce qu'il fait avec tout mes autres clients, mais pas avec mon client C++.
    Je crois avoir localisé le problème au niveau de "accept()", car il bloque ici j'ai l'impression.
    Merci pour vos proposition je rame depuis trop longtemps

    PS : Ca fait un moment que je cherche sur les forums aussi, mais je ne trouve pas ce problème

    Cdt,
    Vespiras

  2. #2
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    quand tu lances le client, quels messages sont affichés (est-ce qu'il arrive jusque dans la boucle while?)?

  3. #3
    Membre expérimenté Avatar de Vespiras
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2012
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 168
    Par défaut
    Bonjour et merci de vous intéresser à mon cas,

    Oui tout à fait il arrive dans la boucle while, ce qui est d'autant plus déroutant, c'est que j'ai aussi essayé avec un client putty, et en me connectant sur 127.0.0.1 au port 45624, il détecte bien le client.

  4. #4
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Je ne sais pas, c'est difficile à dire comme ça.
    Juste pour tester, tente de copier/coller puis compiler et exécuter cet exemple pour voir: http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

  5. #5
    Membre expérimenté Avatar de Vespiras
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2012
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 168
    Par défaut
    Petit déterrage de post, désolé de ne pas avoir répondu, mais j'avais essayé de compiler l'exemple que tu m'as donné, ca ne fonctionne pas.

  6. #6
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    "ca ne fonctionne pas" n'est pas une information efficace.
    Dis-nous ce que te répond le compilateur, si tu veux avoir de l'aide

  7. #7
    Membre expérimenté Avatar de Vespiras
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2012
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 168
    Par défaut
    Je sais je suis désolé Je n'aurais pas du écrire le message, je n'était pas sur mon poste de travail et je n'ai pas pu retester pour préciser le message d'erreur. Cela ne marche pas tout simplement parce que je ne trouve pas les deux librairies : Mswsock.lib et AdvApi32.lib à linker.

    Du coup, les fonctions comme "getaddrinfo()" ou "freeaddrinfo()", etc ... ne sont pas reconnues.

    Quelqu'un sait ou trouver ces librairies ? J'ai cherché sur le net mais aucun lien, etc ...

  8. #8
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Dans les dossiers systèmes, tu ne les trouve pas?

    Tu as mis les pragmas magiques?
    #pragma comment(lib, "Mswsock.lib")
    #pragma comment(lib, "AdvApi32.lib")

  9. #9
    Membre expérimenté Avatar de Vespiras
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2012
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 168
    Par défaut
    Merci pour tes conseils,
    - j'ai mis les pragma comme ceci :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #pragma comment (lib, "Ws2_32.lib")
    #pragma comment (lib, "Mswsock.lib")
    #pragma comment (lib, "AdvApi32.lib")
    Et j'ai fais une recherche dans tout le répertoire Windows, et dans le dossier lib de mon compilateur MinGW

    EDIT : Pour les pragmas ils étaient déjà dans le code, mais c'est bizarre quand même qu'il n'y ait pas de liens clairs pour télécharger ces librairies

Discussions similaires

  1. Problème Socket Java architecture Client Serveur
    Par Jonny-1600 dans le forum Langage
    Réponses: 4
    Dernier message: 30/11/2012, 20h50
  2. [Débutant] Problème socket serveur (attente du client)
    Par synolog dans le forum C#
    Réponses: 14
    Dernier message: 20/10/2011, 18h16
  3. Problème socket server/client
    Par yazidou27 dans le forum Web & réseau
    Réponses: 18
    Dernier message: 23/12/2010, 18h26
  4. Problème Socket Client/serveur
    Par jasmina1 dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 21/12/2010, 16h59
  5. Problème communication sockets serveur mutli-client
    Par muad'dib dans le forum Réseau
    Réponses: 5
    Dernier message: 17/05/2007, 02h21

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