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