> We use libev in Linux (2.6.35 on big/small endian ARM) for a simple
> network client application where we want to timeout connect() attempts.
>
> http://www.unixguide.net/network/socketfaq/3.5.shtml
>
> For this purpose we use the following construct in a libev callback.
>
> timeout = NULL_TIMER;
> timeout.it_value.tv_sec = 10;
> setitimer(ITIMER_REAL, &timeout, NULL);
> if (connect (...) == -1) { ... }
> timeout = NULL_TIMER;
> setitimer (ITIMER_REAL, &timeout, NULL);
>
> Is this OK for use with libev, or do you have any other recommendation?
> Basically we're a bit concerned if it conflicts with the internal timer
> implementation, or event loop, in libev.
This is probably not the right thing to do with libev (as you are supposed
to be in a blocking loop managed by ev_loop()). Instead, you should create
a non-blocking client TCP socket, an ev_write and an ev_timer, and add both
to the loop. Something like this (kinda pseudo-code):
--------8<----------8<----------8<----------8<----------8<----------8<-------
void connect_handler(struct ev_loop *loop, struct ev_io *watcher, int events)
{
// socket is connected: kill the associated timer and proceed
}
void timeout(struct ev_loop *loop, struct ev_timer *watcher, int events)
{
// connection timeout occurred: close the associated socket and bail
}
ev_loop *loop;
ev_io write_watcher;
ev_timer timeout_watcher;
int client;
client = socket(...);
set_non_blocking(client);
ev_io_init(&write_watcher, connect_handler, client, EV_WRITE);
ev_timer_init(&timeout_watcher, timeout_handler, 5.0, 0);
ev_timer_start(loop, &timeout_watcher);
connect(client, ...);
ev_loop(loop, 0);
--------8<----------8<----------8<----------8<----------8<----------8<-------
Of course, this code is sub-optimal if you intend to open a large number of
connections from the same loop. Also, you need to tie the 2 watchers (write
and timeout) together via some sort of allocated structure and offsetof magic
(see libev examples for more info).
Regards,
Pierre-Yves
_______________________________________________
libev mailing list
[email protected]
http://lists.schmorp.de/cgi-bin/mailman/listinfo/libev