Hello! I am trying to discover how to use non-blocking io with glib on
windows. I am trying such program:

/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */

#include <glib.h>

#ifdef G_OS_WIN32
#include <winsock2.h>
#include <ws2tcpip.h>
#endif

gboolean
connect_cb (GIOChannel *io_channel, GIOCondition condition, gpointer data)
{
    switch (condition) {
    case G_IO_OUT:
        g_debug ("Connected.");
        break;
    case G_IO_ERR:
        g_debug ("Error!");
        break;
    }

    return FALSE;
}

int
main (int argc, char *argv[])
{
#ifdef G_OS_WIN32
    int ret;
    WSADATA wsaData;
    SOCKET  sd;
    struct sockaddr_in target;
    struct hostent    *hptr;
    u_long             mode = 1;
    GMainLoop         *loop;
    GIOChannel        *io_channel;
    GSource           *source;

    ret = WSAStartup (0x0202, &wsaData);
    if (ret) {
        g_error ("WSAStaroup failed with error %d", ret);
    }

    sd = socket (AF_INET, SOCK_STREAM, 0);
    if (sd == INVALID_SOCKET) {
        g_error ("socket failed with error %d", WSAGetLastError ());
    }

    target.sin_family = AF_INET;
    target.sin_port   = htons (80);
    if ( (hptr = gethostbyname ("somehost.com")) == NULL) {
        g_error ("gethostbyname () failed with error %d\n", WSAGetLastError
());
    }
    memcpy (&(target.sin_addr.s_addr), hptr->h_addr_list[0],
            sizeof (target.sin_addr.s_addr));

    if (ioctlsocket(sd, FIONBIO, &mode) == SOCKET_ERROR) {
        g_error("ioctlsocket() failed \n");
    }

    loop = g_main_loop_new (NULL, FALSE);
    io_channel = g_io_channel_win32_new_socket (sd);
    g_io_channel_set_encoding (io_channel, NULL, NULL);
    g_io_channel_set_buffered (io_channel, FALSE);
    g_io_add_watch (io_channel, G_IO_ERR | G_IO_OUT, connect_cb, NULL);

    g_debug ("Executing connect async...");
    ret = connect (sd, (const struct sockaddr *) &target, sizeof (target));
    if (ret == SOCKET_ERROR) {
        if (WSAGetLastError () != WSAEWOULDBLOCK)
            g_error ("connect () failed with error %d\n", WSAGetLastError
());
    }

    g_debug ("Starting GMainLoop...");
    g_main_loop_run (loop);

#endif

    return 0;
}

/* END */

My problem is that condition parameter in callback is always G_IO_OUT even
if target host:port is unreachable. How can I discover that connect was
unsuccessfull? Thanx.

// wbr Alexander
_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list@gnome.org
http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list

Reply via email to