Seth David Schoen
schoen at loyalty.org
Sat Jan 26 21:18:02 PST 2002
Erik Fears writes:
> Anyway one of the clients for the database checks remote hosts connecting
> to a server to determine whether or not they use an open proxy. One of the
> checks uses the unix gethostbyname() function to resolve the host against
> a DNS blacklist.
> The problem I found is that gethostbyname() blocks ( I have no idea what the
> timeout is ). I'm wondering if any linux C programmers (or UNIX programmers)
> on this list know a way to resolve a host in a way that will not block
> (without using a seperate thread, or writing the DNS client from scratch).
I know there are many standard solutions for this, but I don't happen
to remember any of them offhand.
A generic thing -- short of writing your own resolver -- is to use
alarm(2) and SIGALRM.
It's a substitute for forking or threads in some cases; the kernel can
interrupt you after a designated amount of time. There's some
discussion of it in Stevens, _Advanced Programming in the Unix
Environment_, among other places. You call alarm and tell the kernel
when you want to be interrupted; after that among of time, you get
interrupted by a signal.
If you can use another language, you may be able to get someone else's
resolver library with built-in timeouts. I recall that there's one of
those in Perl, for example.
Seth David Schoen <schoen at loyalty.org> | Reading is a right, not a feature!
http://www.loyalty.org/~schoen/ | -- Kathryn Myronuk
More information about the svlug