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ème sockets C++


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2007
    Messages : 6
    Par défaut Problème sockets C++
    Bonjour,

    J'ai un problème avec les sockets. J'ai fait un petit serveur et un client qui se connecte dessus. Mais le client n'arrive pas à ce connecter mais le programme continue quand même. Sans aucun message d'erreur. Le serveur, lui, attend sur la fonction accept et ne voit pas le client.

    Voici le code du serveur :
    Code c++ : 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
    #include <winsock2.h>    	/*socket*/
    #include<iostream>
    #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;
    	char buffer[BUFSIZ];;
    	sin.sin_addr.s_addr = htonl(INADDR_ANY);
    	sin.sin_family      = AF_INET;
    	sin.sin_port        = htons(200);
    	sock = socket(AF_INET,SOCK_STREAM,0);
    	bind(sock, (SOCKADDR *)&sin, sizeof(sin));
     
    	listen(sock,0);
     
    	/* connection socket */
    	int sinsize = sizeof(csin);
    	csock = accept(sock, (SOCKADDR *)&csin, &sinsize);
    	cout<<"1"<<"\n";
     
    	while(1) {
       memset(buffer, '\0', sizeof(buffer)); /*on vide le buffer*/
       recv(csock, buffer, sizeof(buffer), 0);
       cout<<buffer;
      }
    }

    Voici le code du client :
    Code c++ : 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
    #include <winsock2.h>    	/*socket*/
    #include <iostream>
    #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[BUFSIZ];
     
    	sin.sin_addr.s_addr = inet_addr("25-38-998-154");
    	sin.sin_family      = AF_INET;
    	sin.sin_port        = htons(200);
    	sock = socket(AF_INET,SOCK_STREAM,0);
     
    	connect(sock, (SOCKADDR *)&sin, sizeof(sin));
    	cout<<"1"<<"\n";
     
    	while(1) {
        cout << "MSG : ";
        cin >> buffer;
        send(sock, buffer, sizeof(buffer), 0);
     
    	} 
    }

    Merci de me dire ou est le problème.
    VB

  2. #2
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Salut,

    Ne mélange pas des cout et des printf dans le code, ça peut causer des choses comme pas d'affichage.

    Pour tes cout, rajoute un <<flush ou un <<endl pour être sûr de bien afficher.

    Si le problème ne vient pas de là, je ne peux t'aider.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2007
    Messages : 6
    Par défaut
    J'ai fait les modifications mais le problème persiste. en faite, le serveur ne voit pas le client, il ne dépasse pas la fonction accept tandis que le client exécute la boucle while comme ci il s'était connécté...

    Merci de m'aider
    VB

  4. #4
    Membre averti
    Inscrit en
    Septembre 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 21
    Par défaut
    Je pense qu'il serait utile de traiter les codes de retour des différentes fonctions bind, listen, accept, recv, send, connect afin de déterminer si tout ce passe bien.

    Vérifie également que le port 200 est 'libre' (c'est a dire qu'il n'y ai pas déjà une socket en écoute sur ce port dans un autre process).
    Un 'netstat -a -n' (et -b sous XP et au delà) sous un interpreteur de commande permet de vérifier si un process n'est pas en écoute sur le port (regarder les lignes indiquant "Listening").

  5. #5
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Un serveur doit faire socket(), bind(); listen(), accept()
    Un client doit faire socket(), connect()

    Ton client, il fait socket(), bind(), connect(), c'est bizarre.

    De plus, et comme dit précédemment, il faut traiter les codes de retour de fonction. Cela peut aider en cas de problème. D'ailleurs, si tu les traitais, tu ne serais peut être pas sur le forum à demander pourquoi cela ne marche pas

    Tu es sûr du nom de machine "25-38-998-154" ?
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2007
    Messages : 6
    Par défaut
    Effectivement il n'y a pas de fonction bind pour le client. J'ai mal lu la doc

    Mais ca ne marche toujours pas, la fonction connect du client renvoit l'erreur -1.

    Je ne vois pas ou est le problème

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Si, si le client doit aussi faire un bind, mais sur son adresse locale. C'est pour indiquer sur quel interface réseau il se connecte, notamment si tu as plusieurs cartes réseaux, par exemple.
    Client: socket (création de la socket), bind (attachement à une adresse locale), connect (connexion au serveur).
    Serveur: socket (création de la socket), bind (attachement à une adresse locale), listen (attente de connexion), accept (établissement de la connexion avec obtention du handle de socket de la connexion).
    Ensuite, si ton connect échoue, fait un WSAGetLastError pour connaître l'erreur précise.

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Vérifie aussi que inet_addr n'a pas retourné INADDR_NONE.
    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.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2007
    Messages : 6
    Par défaut
    je viens de faire un WSAGetLastError pour connaître l'erreur et il me retourne l'erreur 10049. Savez-vous a quoi ça correspond ?

  10. #10
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    En français dans le texte :
    L'adresse demandée n'est pas valide dans son contexte.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  11. #11
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    MSDN:
    WSAEADDRNOTAVAIL 10049:
    Cannot assign requested address.

    The requested address is not valid in its context. This normally results from an attempt to bind to an address that is not valid for the local computer. This can also result from connect, sendto, WSAConnect, WSAJoinLeaf, or WSASendTo when the remote address or port is not valid for a remote computer (for example, address or port 0).
    Hypothèse 1: tu fais un bind avec l'adresse serveur à la place de l'adresse client.

  12. #12
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Ou bien inet_addr a échoué et retourné INADDR_NONE, car les champs d'une adresse IP sont supposés être séparés par des points, pas des tirets...
    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.

  13. #13
    jmv
    jmv est déconnecté
    Membre chevronné Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Par défaut
    dans ton code il y a :
    je pense que c'est ça qui bloque, tu indique 0 connexion en attente au maximum.
    essaye avec un autre valeur (10 par exemple)

    a+
    jmv

  14. #14
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par jmv Voir le message
    dans ton code il y a :
    je pense que c'est ça qui bloque, tu indique 0 connexion en attente au maximum.
    essaye avec un autre valeur (10 par exemple)

    a+
    jmv
    Pas sûr, puisque l'erreur envoyé au client est alors (WSA)ECONNREFUSED. En plus, il est recommandé d'utiliser SOMAXCONN, mais avec modération...
    Citation Envoyé par MSDN
    A value for the backlog of SOMAXCONN is a special constant that instructs the underlying service provider responsible for socket s to set the length of the queue of pending connections to a maximum reasonable value.

    On Windows Sockets 2, this maximum value defaults to a large value (typically several hundred or more). When calling the listen function in a Bluetooth application, it is strongly recommended that a much lower value be used for the backlog parameter (typically 2 to 4), since only a few client connections are accepted. This reduces the system resources that are allocated for use by the listening socket. This same recommendation applies to other network applications that expect only a few client connections.

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2007
    Messages : 6
    Par défaut
    J'ai trouvé les erreurs. Mon adresse IP n'était pas la bonne, je l'avais trouvé en allant sur un site web, et j,ai fait un ipconfig sur une fenêtre de commande pour trouver la bonne adresse.

    Et tout fonctionnne ! Merci de votre aide

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

Discussions similaires

  1. [Debutant] Problème Socket Linux UDP
    Par AxldenieD dans le forum Réseau
    Réponses: 3
    Dernier message: 01/11/2005, 17h08
  2. Problème Socket
    Par karl2mil1 dans le forum C++Builder
    Réponses: 3
    Dernier message: 12/09/2005, 23h35
  3. Problème socket raw ? bizarre :~
    Par MonsieurAk dans le forum Windows
    Réponses: 2
    Dernier message: 12/07/2005, 14h12
  4. [MFC] Problème Socket + Connexion SQL
    Par BananaUltra3C dans le forum MFC
    Réponses: 6
    Dernier message: 20/05/2005, 16h41
  5. [Réseau] Problème socket
    Par neenee dans le forum Entrée/Sortie
    Réponses: 14
    Dernier message: 18/01/2005, 15h26

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