Monitoren eines BSD Sockets mit Gtkmm



  • Hallo,
    ich hab gerade ein Problem, an dem ich mich schon eine ganze weile versuche aber ich habe bisher noch keine Lösung gefunden.

    Ausgehend von DIESEM Tutorial habe ich versucht einen Socket-Filedeskriptor (unter Linux) auf eingehende Daten zu überwachen.

    Das ganze sah dann so aus:

    MSTController.h

    #include <libglademm.h>
    #include <gtkmm.h>
    #include <iostream>
    #include <stdexcept>
    
    class ClientSocket;
    
    class MSTController
    {
    public:
    	MSTController(int argc, char *argv[]);
    	~MSTController();
    	// startfunktionen
    	bool loadGUI(const char * file_name);
    	void run();
    	void shutDown();
    	// Callback-Funktionen
    	void buttonStartTest();
    	void buttonConnectSocket();
    	void menuItemBeenden();
    	void menuItemInfo();
    	static void socketData(int source, GdkInputCondition condition);
    protected:
    	void printOnStatusBar(const char * text);
    private:
    	ClientSocket * my_mst_socket;
    	bool shutdown;
    	Glib::RefPtr<Gnome::Glade::Xml> refXml;
    	Gtk::Main * kit;
    	// Menu
    	Gtk::MenuItem* menu_item_beenden;
    	Gtk::MenuItem* menu_item_info;
    	// Buttons
    	Gtk::Button* button_start_test;
    	Gtk::Button* button_connect_socket;
    	// Sonstiges
    	Gtk::Statusbar* statusbar;
    	// Window
    	Gtk::Window* main_window;
    	Gtk::AboutDialog* about_dialog;
    	Glib::RefPtr<Glib::IOChannel> iochannel;
    };
    

    MSTController.cpp

    #include "MSTController.h"
    #include "MST_Framework/Handler/MCXConnectionHandler/ClientSocket.h"
    #include <gtkmm/main.h>
    
    MSTController::MSTController(int argc, char *argv[])
    {
    	kit = new Gtk::Main(argc,argv);
    	shutdown = false;
    	cout << "Create Client Socket" << endl;
    	my_mst_socket = new ClientSocket();
    	Glib::signal_io().connect(sigc::ptr_fun(MSTController::socketData), my_mst_socket->getMySocket(), Glib::IO_IN);
    	iochannel = Glib::IOChannel::create_from_fd(my_mst_socket->getMySocket());
    }
    
    void MSTController::socketData(int source, GdkInputCondition condition)
    {
    //	my_mst_socket->handleSocket();
    //	Telegram * tele = my_mst_socket->getNextTele();
    //	if(tele != NULL)
    //		cout << *tele << endl;
    }
    

    Alles recht und schön, aber dafür bekomme ich vom Compiler folgende Fehlermeldungen:

    /opt/gnome/include/sigc++-2.0/sigc++/adaptors/adaptor_trait.h no match for call to ‘(sigc::pointer_functor2<int, GdkInputCondition, void>) (const Glib::IOCondition&)’

    /opt/gnome/include/sigc++-2.0/sigc++/adaptors/adaptor_trait.h return-statement with a value, in function returning 'void'

    /opt/gnome/include/sigc++-2.0/sigc++/functors/slot.h instantiated from ‘sigc::slot<T_return, T_arg1, sigc::nil, sigc::nil, sigc::nil, sigc::nil, sigc::nil, sigc::nil>::slot(const T_functor&) [with T_functor = sigc::pointer_functor2<int, GdkInputCondition, void>, T_return = bool, T_arg1 = Glib::IOCondition]’

    /opt/gnome/include/sigc++-2.0/sigc++/functors/slot.h instantiated from ‘sigc::slot1<T_return, T_arg1>::slot1(const T_functor&) [with T_functor = sigc::pointer_functor2<int, GdkInputCondition, void>, T_return = bool, T_arg1 = Glib::IOCondition]’

    /opt/gnome/include/sigc++-2.0/sigc++/functors/slot.h instantiated from ‘static T_return sigc::internal::slot_call1<T_functor, T_return, T_arg1>::call_it(sigc::internal::slot_rep*, typename sigc::type_trait<T_arg3>::take) [with T_functor = sigc::pointer_functor2<int, GdkInputCondition, void>, T_return = bool, T_arg1 = Glib::IOCondition]’

    /opt/gnome/include/sigc++-2.0/sigc++/functors/slot.h instantiated from ‘static void* (* sigc::internal::slot_call1<T_functor, T_return, T_arg1>::address())(void*) [with T_functor = sigc::pointer_functor2<int, GdkInputCondition, void>, T_return = bool, T_arg1 = Glib::IOCondition]’

    /opt/gnome/include/sigc++-2.0/sigc++/functors/slot.h void value not ignored as it ought to be

    Kann mir da jemand weiterhelfen??
    Danke



  • Da MSTController::Controller eine Member-Funktion ist, musst du sigc::mem_fun verwenden und eine Referenz auf die Instanz übergeben.



  • joomoo schrieb:

    Da MSTController::Controller eine Member-Funktion ist, musst du sigc::mem_fun verwenden und eine Referenz auf die Instanz übergeben.

    Das hatte ich davor auch. Es geht aber auch so, weil die Member-Funktion static ist. Ich hab das geändert weil das hier
    im Beispiel so angegeben war.
    Sollte aber im Endeffekt keinen Unterschied machen.



  • sambalmueslie schrieb:

    joomoo schrieb:

    Da MSTController::Controller eine Member-Funktion ist, musst du sigc::mem_fun verwenden und eine Referenz auf die Instanz übergeben.

    Das hatte ich davor auch. Es geht aber auch so, weil die Member-Funktion static ist. Ich hab das geändert weil das hier
    im Beispiel so angegeben war.
    Sollte aber im Endeffekt keinen Unterschied machen.

    Warum hat's denn mit men_fun nicht geklappt?



  • joomoo schrieb:

    Warum hat's denn mit men_fun nicht geklappt?

    Hier die Variante mit mem_fun:

    MSTController::MSTController(int argc, char *argv[])
    {
    	kit = new Gtk::Main(argc,argv);
    	shutdown = false;
    	cout << "Create Client Socket" << endl;
    	my_mst_socket = new ClientSocket();
    	Glib::signal_io().connect(sigc::mem_fun(*this, &MSTController::socketData), my_mst_socket->getMySocket(), Glib::IO_IN);
    	iochannel = Glib::IOChannel::create_from_fd(my_mst_socket->getMySocket());
    }
    

    Ergebnis:

    /opt/gnome/include/sigc++-2.0/sigc++/adaptors/adaptor_trait.h no match for call to ‘(sigc::bound_mem_functor2<void, MSTController, int, GdkInputCondition>) (const Glib::IOCondition&)’

    /opt/gnome/include/sigc++-2.0/sigc++/adaptors/adaptor_trait.h return-statement with a value, in function returning 'void'

    /opt/gnome/include/sigc++-2.0/sigc++/functors/slot.h instantiated from ‘sigc::slot<T_return, T_arg1, sigc::nil, sigc::nil, sigc::nil, sigc::nil, sigc::nil, sigc::nil>::slot(const T_functor&) [with T_functor = sigc::bound_mem_functor2<void, MSTController, int, GdkInputCondition>, T_return = bool, T_arg1 = Glib::IOCondition]’

    /opt/gnome/include/sigc++-2.0/sigc++/functors/slot.h instantiated from ‘sigc::slot1<T_return, T_arg1>::slot1(const T_functor&) [with T_functor = sigc::bound_mem_functor2<void, MSTController, int, GdkInputCondition>, T_return = bool, T_arg1 = Glib::IOCondition]’

    /opt/gnome/include/sigc++-2.0/sigc++/functors/slot.h instantiated from ‘static T_return sigc::internal::slot_call1<T_functor, T_return, T_arg1>::call_it(sigc::internal::slot_rep*, typename sigc::type_trait<T_arg3>::take) [with T_functor = sigc::bound_mem_functor2<void, MSTController, int, GdkInputCondition>, T_return = bool, T_arg1 = Glib::IOCondition]’

    /opt/gnome/include/sigc++-2.0/sigc++/functors/slot.h instantiated from ‘static void* (* sigc::internal::slot_call1<T_functor, T_return, T_arg1>::address())(void*) [with T_functor = sigc::bound_mem_functor2<void, MSTController, int, GdkInputCondition>, T_return = bool, T_arg1 = Glib::IOCondition]’

    /opt/gnome/include/sigc++-2.0/sigc++/functors/slot.h void value not ignored as it ought to be



  • Ich glaub du Funktion braucht als Rückgabewert bool. Du musst immer true zurück geben solange du noch weiterhin das Signal empfangen willst.



  • joomoo schrieb:

    Ich glaub du Funktion braucht als Rückgabewert bool. Du musst immer true zurück geben solange du noch weiterhin das Signal empfangen willst.

    Ja du hast Recht.

    bool MyCallback(Glib::IOCondition io_condition)
    

    So funktioniert es. Doof, das es in dem Tutorial anders beschrieben war. Im Source war es dann richitg.

    Danke


Anmelden zum Antworten