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