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 :

erreur sur classe socket


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 37
    Par défaut erreur sur classe socket
    Bonjour a tous,

    Je crée un petit programme suivant une architecture client/serveur en c++,
    je developpe sous dev C++.
    je souhaite creer une classe socket pour gerer toute la partie envoie/reception.
    (j'ai deja travaillé avec les socket auparavant).

    Mon probleme vient d'un bout de code
    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
    void Csocket::connect()
    {
           WSADATA wsaData;
     
        if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0)
            printf("La fonction WSAStartup a echoue.\n");
        else
        {
            SOCKET socket_client;
     
            socket_client = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
            if (socket_client == INVALID_SOCKET)
                printf("La fonction socket a echoue.\n");
            else
            {
                SOCKADDR_IN server;
     
                server.sin_family       = AF_INET;
                server.sin_addr.s_addr  = inet_addr("127.0.0.1");
                server.sin_port         = htons(5050);
                memset(&server.sin_zero, '\0', sizeof(server.sin_zero));
     
                connect(socket_client, (SOCKADDR *)&server, sizeof(server));
     
     
     
     
            }
         }
     
    }
    ceci m'affiche une erreur de type:
    no matching function for call to `Csocket::connect(SOCKET&, SOCKADDR*, unsigned int)'
    Or lorsque je place ce bout de code dans ma fonction main, aucune erreur n'apparait. a chaque fois, j'inclus bien "winsock2.h"...

    Pourriez vous m'aider?
    Merci

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Ce qui se passe, c'est que tu appelle la fonction en lui passant trois paramètres (une référence sur un socket, un pointeur sur sockaddr et un entier non signé), alors que la fonction en question... ne prend aucun paramètre.

    Le compilateur ne sait donc simplement pas ... ce qu'il doit faire
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 37
    Par défaut
    Citation Envoyé par koala01 Voir le message
    la fonction en question... ne prend aucun paramètre.
    Merci pour une reponse aussi rapide ,
    Je comprend bien que si le prototype de ma fonction pocède aucun parametres et qu'à mon appel je lui en passe 3, celà fait planter le compilateur...
    MAIS dans ce cas, pourquoi ce code fonctionne dans mon main et pourquoi
    il marche dans l'exemple de melem ( dont j'ai fait un copié collé afin de voir si c'etait mon code qui ne fonctionnait pas)

    ex de melem:

    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
    #include <stdio.h>
    #include <winsock2.h>
     
    int main()
    {
        WSADATA wsaData;
     
        if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0)
            fprintf(stderr, "La fonction WSAStartup a echoue.\n");
        else
        {
            SOCKET s;
     
            s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
            if (s == INVALID_SOCKET)
                fprintf(stderr, "La fonction socket a echoue.\n");
            else
            {
                SOCKADDR_IN server;
     
                server.sin_family       = AF_INET;
                server.sin_addr.s_addr  = inet_addr("127.0.0.1");
                server.sin_port         = htons(5050);
                memset(&server.sin_zero, '\0', sizeof(server.sin_zero));
     
                if (connect(s, (SOCKADDR *)&server, sizeof(server)) == SOCKET_ERROR)
                    fprintf(stderr, "La fonction connect a echoue.\n");
                else
                {
                    char buffer[100];
                    int n;
     
                    n = recv(s, buffer, sizeof(buffer) - 1, 0); /* Lire tout au plus sizeof(buffer) - 1 octets */
                    /* Il faut reserver le dernier octet pour le caractere de fin de chaine, '\0'.             */
     
                    if (n != SOCKET_ERROR)
                    {
                        buffer[n] = '\0';
                        printf("%s", buffer);
     
                        send(s, "Au revoir\n", (int)strlen("Au revoir\n"), 0);
                    }
     
                    shutdown(s, SD_SEND);
                }
     
                closesocket(s);
            }
     
            WSACleanup();
        }
     
        return 0;
    }
    c'est cela qui m'intrigue...

  4. #4
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 37
    Par défaut
    de plus voici le prototype de la fonction connect de winsock2.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int PASCAL connect(SOCKET,const struct sockaddr*,int);

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Parce que t'as appelé ta propre fonction avec le même nom (Csocket::connect), et le compilo croit que c'est elle que tu appelles.

    Solution : utiliser ::connect lors de l'appel, ou nommer ta fonction membre différemment.

  6. #6
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 37
    Par défaut
    oups ...

    il y'a des matins où on ferait mieux d'etre completement reveiller avant de ce mettre a coder.
    heureusement que le topic est dans "DEBUTER"

    merci à toi,

    ps: ça reste entre nous

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

Discussions similaires

  1. [WD14] Gestion erreur sur class
    Par mail.spam dans le forum WinDev
    Réponses: 4
    Dernier message: 27/04/2010, 10h30
  2. Lever les erreurs sur le socket
    Par electro38 dans le forum Réseau/Web
    Réponses: 3
    Dernier message: 21/08/2009, 08h10
  3. Réponses: 5
    Dernier message: 06/09/2007, 09h49
  4. Réponses: 5
    Dernier message: 08/08/2007, 16h51

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