Citation:
If no messages are available at the socket, the receive calls wait for a message to arrive, unless the socket is nonblocking (see fcntl(2)), in which case the value -1 is returned and the external
variable errno is set to EAGAIN or EWOULDBLOCK. The receive calls normally return any data available, up to the requested amount, rather than waiting for receipt of the full amount requested.
Une fois que ça marche de cette manière en asynchrone, l'intégration dans la boucle d'événements de GTK+ est triviale. Tu as juste à ajouter une nouvelle source d'événements à la boucle d'événements de GTK+. Cela te permet d'appeler une callback de ton choix quand GTK+ n'a plus d'événement à traiter, ton code sera donc appelé régulièrement, comme si tu étais dans ta boucle infinie. Tu utiliseras pour cela g_idle_add, g_timeout_add ou g_timeout_add_seconds selon la fréquence à laquelle tu veux être appelé. Si tu n'as pas de régularité particulière (genre un message toutes les secondes), alors utilise g_idle_add. Dans la callback correspondant à ta source d'événements, tu appeleras ton recvfrom non-bloquant pour récupérer les données à lire (s'il y en a) et les traiter. Le traitement ne doit toutefois pas prendre trop de temps, car tant que tu es dans ta callback, GTK+ ne peut plus gérer d'autre événement vu que tu n'as qu'un seul thread, le thread principal. Donc tu dois traiter les informations et sortir rapidement de ta callback pour que GTK+ puisse reprendre la main. Ainsi tu n'auras pas de "gel" de l'interface quand tu redimensionnes la fenêtre par exemple.