How to use GIOChannel to read an Unix socket



Hi,

I create a GIOChannel which wraps around a socket on linux:

GIOChannel* channel = g_io_channel_unix_new(sock);
g_io_add_watch(channel, G_IO_IN,
			gio_read_socket, NULL));
g_io_add_watch(channel, G_IO_HUP,
			gio_close_socket, NULL));

And my function gio_read_socket() does get called whenever there is
data available on the socket. And I am able to retrieve data using
g_io_channel_read_line ().
But when the other side of the socket get closed().  My function
g_io_channel_read_line() get called infinite number of times with the
number of data read = 0. Can you please tell me how can I fix my
problem? And my function gio_close_socket() which registered for
G_IO_HUP were never get called.

static gboolean
gio_read_socket (GIOChannel *gio, GIOCondition condition, gpointer data)
{
       printf (" gio_read_socket \n");
        GIOStatus ret;
        GError *err = NULL;
        gchar *msg;
        gsize len;

        ret = g_io_channel_read_line (gio, &msg, &len, NULL, &err);
        if (ret == G_IO_STATUS_ERROR)
                g_error ("Error reading: %s\n", err->message);

        printf ("Read %u bytes: %s\n", len, msg);
        g_free (msg);
        // Try to close the socket when nothing is there.
        if (len == 0) {
              close(g_io_channel_unix_get_fd(gio));
	      g_io_channel_close(gio);
        }

        return TRUE;
}

Thank you.


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]