linuxsocketsgtkgtk2

gtk_main() and unix sockets


I'm working on a chat application using C and unix low level sockets. I have succeeded in making the console version, but I want to make a GUI for the application. I would like to use GTK for the GUI. my problem is how to "synchronize" the socket and the GUI. because I have to call gtk_main() as the last GTK statement and the application itself is an infinite loop. How can I update the GUI when a message comes in?


Solution

  • You are facing the problem that you have several event systems at once but only one thread. Gtk+ comes with its own event handler, that eventually boils down to a select() which will wake up on any user input or other gtk event. You yourself want to handle networking with your own event handling, which typically consists of a select() on your socket(s) or using the sockets in blocking mode.

    One solution is to integrate your events into the event loop of Gtk+.

    You can make Gtk+ watch/select() your sockets and call a specific function when their state changes (data readable). See the section "Creating new source types" on http://developer.gnome.org/glib/2.30/glib-The-Main-Event-Loop.html

    Another solution would be to use Gtk+ networking functionality.

    Typically you don't want to do something so special with the sockets that it is not easily wrapable with Glib IO Channels. See http://developer.gnome.org/glib/2.30/glib-IO-Channels.html

    A third solution is to start a second thread that handles your networking, e.g. with posix threads or Gtk+ threading functionality.

    Separating GUI from the worker part of your application is in general a good idea. However for a chat application, it probably does not give any benefit over the other solutions. See http://developer.gnome.org/glib/2.30/glib-Threads.html