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

Réseau C Discussion :

Problème de sockets


Sujet :

Réseau C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2005
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 27
    Points : 24
    Points
    24
    Par défaut Problème de sockets
    Bonjour,
    Je viens de créer mon premier code utilisant les sockets (presque entièrement pompé sur le tuto de The Walrus) et celui ci ne fonctionne pas :-(
    Voici le code 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
    #include <iostream>
    #include <winsock2.h>
     
    int 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("127.0.0.1");
        sin.sin_family				= AF_INET;
        sin.sin_port				= htons(4148);
        connect(sock, (SOCKADDR *)&sin, sizeof(sin));
        recv(sock, buffer, sizeof(buffer), 0);
        closesocket(sock);
        WSACleanup();
        std::cout << buffer[0] << std::endl;
        system("PAUSE");
    }
    Et 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
     
    #include <winsock2.h>
     
    int 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(4147);
        bind(sock, (SOCKADDR *)&sin, sizeof(sin));
        listen(sock, 0);
        for(;;)
        {
            int sinsize = sizeof(csin);
            if((csock = accept(sock, (SOCKADDR *)&csin, &sinsize)) != INVALID_SOCKET)
            {
                send(csock, "Hello world!\r\n", 14, 0);
            }
        }
    }
    Je lance les 2 programmes sur ma machine (en commençant par le seveur) et la chaine que le client doit afficher est remplacée par d'autres caractères (toujours les mêmes).
    Je ne trouve pas mon erreur.
    Merci

  2. #2
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut Re: Problème de sockets
    Citation Envoyé par the_penguin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        std::cout << buffer[0] << std::endl;
    C ou C++ à toi de choisir...

    TU n'utilises pas les meme ports sur le serveur et le client...
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  3. #3
    Membre expérimenté
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Points : 1 421
    Points
    1 421
    Par défaut
    ce qui serait bien, c'est que ton client se connecte sur le port que le server utilise.
    et teste le retour de tes fonctions ... connect etc...
    et puis y'as des trucs que je comprend pas ... ca ressemble a du C++.
    et pis conserve le type int pour tes sockets, windows en feras pas une maladie, et ce seras plus facilement portable.

    edit:: haben grillé ...

    et:
    sock = socket(PF_INET, SOCK_STREAM, 0);
    click my www
    ............|___
    ...................\
    .................._|_
    ..................\ /
    ..................."

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: Problème de sockets
    Citation Envoyé par the_penguin
    Voici le code client :
    Pas du C. C++, c'est à coté

    MODO : A déplacer sur C++. Merci
    Pas de Wi-Fi à la maison : CPL

  5. #5
    zul
    zul est déconnecté
    Membre éclairé Avatar de zul
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    498
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 498
    Points : 699
    Points
    699
    Par défaut
    sizeof(buffer) == sizeof(char*) != 255 ...
    Ca devrait résoudre le souci. Cette manie d'utiliser une allocation dynamique pour un buffer de taille fixe ...

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2005
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 27
    Points : 24
    Points
    24
    Par défaut
    Suite à vos conseils, j'ai modifié mon code : J'ai mis le même port pour le client et le serveur et j'ai mis un buffer static pour simplifier.
    Voici mon code 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
     
    #include <stdio.h>
    #include <winsock2.h>
     
    int main()
    {
        WSADATA WSAData;
        WSAStartup(MAKEWORD(2,0), &WSAData);
        SOCKET sock;
        SOCKADDR_IN sin;
        char buffer[255];
        sock = socket(AF_INET, SOCK_STREAM, 0);
        sin.sin_addr.s_addr			= inet_addr("127.0.0.1");
        sin.sin_family				= AF_INET;
        sin.sin_port				= htons(4147);
        connect(sock, (SOCKADDR *)&sin, sizeof(sin));
        recv(sock, buffer, sizeof(buffer), 0);
        closesocket(sock);
        WSACleanup();
        std::printf("%s", buffer);
        system("PAUSE");
    }
    Et 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
     
    #include <winsock2.h>
     
    int 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(4147);
        bind(sock, (SOCKADDR *)&sin, sizeof(sin));
        listen(sock, 0);
        for(;;)
        {
            int sinsize = sizeof(csin);
            if((csock = accept(sock, (SOCKADDR *)&csin, &sinsize)) != INVALID_SOCKET)
            {
                send(csock, "Hello world!\r\n", 14, 0);
            }
        }
    }
    Mon "Hello World!" s'affiche bien chez le client mais il est suivit de plusieurs caractères indésirables.
    De plus, je n'ai pas compris la différence entre AF_INET et PF_INET.

  7. #7
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par the_penguin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        sock = socket(AF_INET, SOCK_STREAM, 0);
        sin.sin_addr.s_addr			= inet_addr("127.0.0.1");
        sin.sin_family				= AF_INET;
    De plus, je n'ai pas compris la différence entre AF_INET et PF_INET.
    PF_xxx est une constante désignant la Protocol Family. C'est le premier paramètre de socket(). (ici, le type 'Internet', soit Protocole Internet, ou IP)

    AF_xxx est une constante désignant la Address Family. C'est la valeur qu'attend le champ sin_family qui concerne l'adressage (ici, de type Internet, c'est à dire IP).
    Pas de Wi-Fi à la maison : CPL

  8. #8
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par the_penguin
    Voici mon code client :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        std::printf("%s", buffer);
    Pas du C. le C++, c'est à coté...
    Pas de Wi-Fi à la maison : CPL

  9. #9
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par the_penguin
    Voici mon code client :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        char buffer[255];
     
        recv(sock, buffer, sizeof(buffer), 0);
    Erreur récurrente. Pas de 0 final, pas de place pour le 0 final...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
       char buffer[255];
     
       int n = recv(sock, buffer, sizeof buffer - 1, 0);
       if (n >= 0)
       {
          char buffer[n] = 0;
    Apprenez le C avant de jouer avec les sockets...
    Pas de Wi-Fi à la maison : CPL

Discussions similaires

  1. Problème de Socket
    Par The Lord of Nesquik dans le forum C++
    Réponses: 31
    Dernier message: 28/05/2006, 16h08
  2. Problême de Socket avec un applet java (RMI/policy)
    Par Vesperal dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 12/04/2006, 12h00
  3. Réponses: 2
    Dernier message: 26/03/2004, 09h15
  4. [Kylix] Problème de socket
    Par RaygKross dans le forum EDI
    Réponses: 1
    Dernier message: 01/03/2004, 19h41
  5. Mysql ne se lance pas problème de socket
    Par Riko dans le forum Installation
    Réponses: 5
    Dernier message: 05/02/2004, 09h28

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