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 :

La fonction callback dans c++


Sujet :

C++

  1. #1
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 15
    Par défaut La fonction callback dans c++
    J' ai une classe DialogImpl:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class DialogImpl
    {
    public:
        void my_callback(u_char *useless, const struct pcap_pkthdr* hdr, const u_char* packet);
    public slots:
        void sniffer();
     
        // ............ les autres méthode
    }
    Ma méthode sniffer() a cette fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DialogImpl::sniffer() {
        //............
        pcap_loop(descr,-1,my_callback,NULL);
        //................
    }
    Si je fais comme dessus, il va créer une erreur argument of type ‘void (DialogImpl:: )(u_char*, const pcap_pkthdr*, const u_char*)’ does not match ‘void ( * )(u_char*, const pcap_pkthdr*, const u_char*)’

    Je sais qu'il faut mettre static à la fonction my_callback. Pourtant, je ne peux pas utiliser les fonctions de GUI dans my_callback. Est-ce qu' il y a une autre résolution?

    Merci par avance pour votre aide!

  2. #2
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 153
    Par défaut
    Salut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pcap_loop(descr,-1,my_callback,NULL);
    Je suppose que le dernier parametre (NULL) est le parametre de la fonction callback (c'est souvent le cas). Tu peux donc créer une fonction static :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    static
    void MaBelleCallback(u_char *data, const struct pcap_pkthdr* hdr, const u_char* packet)
    {
        DialogImpl* pDlg = static_cast<data*>(data);
        assert(pDlg);
        pDlg->my_callback(hdr, packet);
     
    }
    Il faut donc modifier ton code en conséquence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DialogImpl::sniffer() {
        ...
        pcap_loop(descr,-1,my_callback,this);
        ...
    }
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class DialogImpl
    {
    public:
        void my_callback(const struct pcap_pkthdr* hdr, const u_char* packet);
        ...
    }

    En espérant que ça répond à ta question.
    --
    Jérémie

  3. #3
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 15
    Par défaut
    Merci bien, j'ai réussi à compiler le programme mais il y a une telle erreur dans la fonction pcap_loop que mon programme ne peut pas éxécuter normalement, je vais rechercher encore!

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 153
    Par défaut
    Citation Envoyé par jfouche Voir le message
    Il faut donc modifier ton code en conséquence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DialogImpl::sniffer() {
        ...
        pcap_loop(descr,-1,my_callback,this);
        ...
    }
    Je me suis trompé, c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DialogImpl::sniffer() {
        ...
        pcap_loop(descr,-1,MaBelleCallback,this);
        ...
    }
    --
    Jérémie

  5. #5
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 15
    Par défaut
    Merci, je sais!
    Il faut corriger aussi pour faire une forçage de type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	pcap_loop(descr,-1,MaBelleCallback,(u_char*)this);
    Mais ton code a fait quelques erreurs en compilant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    static void MaBelleCallback(u_char *data, const struct pcap_pkthdr* hdr, const u_char* packet)
    {
        DialogImpl* pDlg = static_cast<data*>(data);
        assert(pDlg);
        pDlg->my_callback(hdr, packet);
    }
    src/dialogimpl.h:29: erreur: expected type-specifier before ‘data’
    src/dialogimpl.h:29: erreur: expected `>' before ‘data’
    src/dialogimpl.h:29: erreur: expected `(' before ‘data’
    src/dialogimpl.h:29: erreur: expected primary-expression before ‘>’ token
    src/dialogimpl.h:29: erreur: expected `)' before ‘;’ token
    J' ai fais comme-ci, il peut être compiler mais le programme ne marche pas encore normalement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    static void MaBelleCallback(u_char *data, const struct pcap_pkthdr* hdr, const u_char* packet)
    {
        DialogImpl* pDlg = (DialogImpl*)data;
        pDlg->my_callback(hdr, packet);
    }
    Tu connais une résolution?

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 153
    Par défaut
    Utilises ton debuger pour voir ce qui passe mal.
    Passes tu bien dans la MaBelleCallback ?
    --
    Jérémi

  7. #7
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 15
    Par défaut
    Selon moi, il ne passe pas MaBellCallback.
    Quand je n'utilise pas la classe, ca marche bien. Mais avec la classe, ca se passe mal. Mon code avec la classe:
    dialogimpl.h:
    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
    #ifndef DIALOGIMPL_H
    #define DIALOGIMPL_H
    //
    #include <pcap.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string>
    #include <errno.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <netinet/if_ether.h>
    #include <netinet/ip.h>
    #include <netinet/tcp.h>
    #include <netinet/udp.h>
    #include <iostream>
    #include <fstream>
    using namespace std;
     
    class DialogImpl
    {
    public:
    	static void my_callback(u_char *useless, const struct pcap_pkthdr* hdr, const u_char* packet) {
    		DialogImpl *This = (DialogImpl*)useless;
    		This->got_packet(hdr, packet);
    	}
     
    	void got_packet(const struct pcap_pkthdr* hdr, const u_char* packet);
     
    	void sniffer();
    };
    #endif
    dialogimpl.cpp:
    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
    #include "dialogimpl.h"
     
    void DialogImpl::got_packet(const struct pcap_pkthdr* hdr, const u_char* packet) {
    	cout << "Hello";
    }
     
     
    void DialogImpl::sniffer()
    {
    	char *dev;
    	char errbuf[PCAP_ERRBUF_SIZE];
    	pcap_t *descr;
     
    	cout << "Start\n";
     
    	dev = pcap_lookupdev(errbuf);
    	if(dev == NULL) { 
    		printf("%s\n",errbuf); 
    		exit(1); 
    	}
     
    	descr = pcap_open_live(dev,BUFSIZ,0,-1,errbuf);
    	if(descr == NULL) { 
    		printf("pcap_open_live(): %s\n",errbuf); 
    		exit(1); 
    	}
     
    	pcap_loop(descr,-1,my_callback,(u_char*)this);
    	pcap_close(descr);
    }
    main.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include "dialogimpl.h"
     
    int main()
    {
    	DialogImpl win;
    	win.sniffer();
    	return 0;
    }
    Pourrais-tu m'aider?

  8. #8
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 15
    Par défaut
    Si je n'utilise pas la classe, ca marche bien:
    foo.cpp:
    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
    #include <pcap.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string>
    #include <errno.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <netinet/if_ether.h>
    #include <netinet/ip.h>
    #include <netinet/tcp.h>
    #include <netinet/udp.h>
    #include <iostream>
    #include <fstream>
    using namespace std;
     
    void my_callback(u_char *useless,const struct pcap_pkthdr* hdr,const u_char* packet)
    {	
    	cout << "Hello\n";
    }
     
    int main()
    {
    	char *dev;
    	char errbuf[PCAP_ERRBUF_SIZE];
    	pcap_t *descr;
     
    	cout << "Start\n";
     
    	dev = pcap_lookupdev(errbuf);
    	if(dev == NULL) { 
    		printf("%s\n",errbuf); 
    		exit(1); 
    	}
     
    	descr = pcap_open_live(dev,BUFSIZ,0,-1,errbuf);
    	if(descr == NULL) { 
    		printf("pcap_open_live(): %s\n",errbuf); 
    		exit(1); 
    	}
     
    	pcap_loop(descr,-1,my_callback,NULL);
    	pcap_close(descr);
       	return 0;
    }
    Compiler et éxécuter:
    g++ foo.cpp -lpcap
    sudo ./a.out

  9. #9
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 153
    Par défaut
    Je n'aurai pas mis my_callback en membre static de DialogImpl, mais plutôt une fonction static toute seule dans son coin.

    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
    #ifndef DIALOGIMPL_H
    #define DIALOGIMPL_H
    ...
    // As tu besoin d'inclure tous ces header dans ton .h ?
    // ne défini pas de using namespace dans un .h, qui sais si l'utilisateur
    // de ta classe n'en veux pas ?
    // using namespace std; 
     
    class DialogImpl
    {
    public:
    	void got_packet(const struct pcap_pkthdr* hdr, const u_char* packet);
     
    	void sniffer();
    };
    #endif
    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
    #include "dialogimpl.h"
     
    // Ici tu peux, sans gener personne
    using namespace std; 
     
    static void my_callback(u_char *data, const struct pcap_pkthdr* hdr, const u_char* packet)
    {
    	cout << "my_callback(...)" << endl;
    	DialogImpl *This = (DialogImpl*)data;
    	This->got_packet(hdr, packet);
    }
     
    void DialogImpl::got_packet(const struct pcap_pkthdr* hdr, const u_char* packet)
    {
    	cout << "Hello";
    }
     
    void DialogImpl::sniffer()
    {
    	char *dev;
    	char errbuf[PCAP_ERRBUF_SIZE];
    	pcap_t *descr;
     
    	cout << "Start" << endl;
     
    	dev = pcap_lookupdev(errbuf);
    	if(dev == NULL) {
    		cerr << errbuf << endl; 
    		exit(1); 
    	}
     
    	descr = pcap_open_live(dev,BUFSIZ,0,-1,errbuf);
    	if(descr == NULL) { 
    		cerr << "pcap_open_live(): " << errbuf << std::endl; 
    		exit(1); 
    	}
     
    	pcap_loop(descr,-1,my_callback,(u_char*)this);
    	pcap_close(descr);
    }
    --
    Jérémie

  10. #10
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 15
    Par défaut
    Merci beaucoup de votre aide !
    ça marche bien avec classe ou sans classe, je me suis trompé!

  11. #11
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 153
    Par défaut
    Penses a signaler la conversation comme résolu (en cliquant sur le bouton résolu).
    Merci
    --
    Jérémie

Discussions similaires

  1. Dll C et fonction CallBack dans Delphi
    Par mestressat dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 27/08/2012, 13h48
  2. Callback dans la fonction $.Ajax ?
    Par DrWilly dans le forum jQuery
    Réponses: 3
    Dernier message: 31/05/2009, 00h43
  3. Changer valeur variable global dans une fonction callback
    Par bog333 dans le forum GTK+ avec C & C++
    Réponses: 3
    Dernier message: 02/10/2008, 15h14
  4. Texte non formaté dans fonction callback
    Par Shugo78 dans le forum GTK+ avec C & C++
    Réponses: 12
    Dernier message: 02/08/2007, 15h39
  5. Fonction callback dans une classe
    Par julian_ross dans le forum MFC
    Réponses: 8
    Dernier message: 02/03/2004, 11h42

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