On Thu, 2007-04-12 at 13:36 -0700, nahuel9728 wrote:
Hi everyone. Im developing a interface for a server program and I have some
problems.Step by step:
- I put the server in listen:
fd_dealer2server=socket..
bind
listen(fd_dealer2server,MAX_CON)
- I create a channel and I add a watch to the the port binded for everytime
a data goes in
io = g_io_channel_unix_new (fd_dealer2server);
if (!g_io_add_watch (io, G_IO_IN, (GIOFunc) my_func, NULL)){g_error }
-Tll here everything its ok Later in my_func:
static void my_func (GIOChannel *gio, GIOCondition condition, gpointer
data){
guint mensaje[1];
gsize bytes_read;
if(g_io_channel_read (gio, (gchar *) mensaje , sizeof(mensaje) ,
bytes_read) != G_IO_ERROR_NONE){
g_warning(Error\n);
}
And Finally I have my client binded to the shame port
fd=socket
connect(fd,
int sms = atoi(argv[2]);
send( fd, sms, sizeof(int) ,0);
It catch the event G_IO_IN but g_io_read doesnt works..Always get error. Any
hint???
Regards to every1, Nahuel
Nahuel,
You need to perform the socket accept() before the
g_io_channel_unix_new() is called.
The http://gfhcmd.sourceforge.net/ package contains a gfhcmd server
module and the gfhcmc contains its matching client; I offer them as a
example of using g_io_channel... with sockets and gtk/glib.
Here is an example routine that picks up where you left off (at the
listen). You should find the select(), then accept(), then the
g_io_channel_unix_new() calls.
[CODE]
/*
* Accept a TCP connection, waiting for upto 80 seconds.
* Returns NULL on error, or connected GIOChannel
*
*/
extern GIOChannel *sknet_net_accept(PSKCOMM psk)
{
socklen_t clilen = sizeof(struct sockaddr_in);
intnewfd;
struct sockaddr_in client_addr;
GIOChannel*ioc = NULL;
gint rc = 0, ecount = 0;
fd_set fdset;
struct timeval timev, *tv = NULL;
g_return_val_if_fail (psk != NULL, NULL);
/*
* Wait on an incoming connection
*/
ecount = 0;
tv = timev;
rc = 0;
while ( rc = 0) {
timev.tv_sec = 8;
timev.tv_usec = 0;
FD_ZERO(fdset);
FD_SET(psk-fd_server, fdset);
if ( ecount 10 ) {
g_snprintf(psk-ch_error_msg, sizeof(psk-ch_error_msg),
accept select(failed), retry=%d {%s},
ecount, g_strerror(errno));
psk-ioc = NULL;
return NULL;
}
rc = select(psk-fd_server+1, fdset, NULL, NULL, tv);
if ( rc == 0 ) { continue; } /* timed out */
if ( rc == -1 ) {
g_snprintf(psk-ch_error_msg, sizeof(psk-ch_error_msg),
tv.sec=%d, retrying=%d {%s},
(int)timev.tv_sec, ecount, g_strerror(errno));
sknet_util_log_msg(sknet_net_accept, accept select()
failing,
psk-ch_error_msg);
g_usleep(100);
} /* error */
ecount++;
} /* end-while */
/*
* Prepare to accept the connection
*/
memset (client_addr, 0, sizeof(struct sockaddr_in));
newfd = accept(psk-fd_server, (struct sockaddr *)client_addr,
clilen);
if (newfd 0) {
sknet_util_log_msg(Net_Accept issue , newfd0, (gchar
*)g_strerror(errno));
g_snprintf(psk-ch_error_msg,
sizeof(psk-ch_error_msg),sknet_net_accept(%s),
(gchar *) g_strerror (errno));
psk-ioc = NULL;
return NULL; /* error */
}
/*
* get session partners name */
getnameinfo ((struct sockaddr *)client_addr, clilen,
psk-ch_ip_client, sizeof(psk-ch_ip_client),
psk-ch_ip_client_port, sizeof(psk-ch_ip_client_port),
NI_NUMERICSERV);
ioc = g_io_channel_unix_new( newfd);
g_io_channel_set_encoding (ioc, NULL, NULL);
g_io_channel_set_buffered (ioc, FALSE);
psk-ioc = ioc;
return ioc;
}
[/CODE]
___
gtk-app-devel-list mailing list
[EMAIL PROTECTED]
http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list