IMPORTANT: Please do not post solutions, hints, or other spoilers until at least 60 hours after the date of this message. Thanks. IMPORTANTE: Por favor, no enviéis soluciones, pistas, o cualquier otra cosa que pueda echar a perder el concurso hasta que hayan pasado por lo menos 60 horas desde la recepción de este mensaje. Gracias. IMPORTANT: S'il vous plaît, ne postez pas de solutions, indices ou autre révélations jusqu'à au moins 60 heures après la date de ce message. Merci ---------------------------------------------------------------- Perl provides a function, 'gethostbyname()', to translate host names to their addresses. For example, gethostbyname("perl.plover.com") returns the string \xd8\x9e\x34\x79 because that is the packed 4-byte IP address of perl.plover.com. Unfortunately, gethostbyname() has a drawback. It typically consults the DNS (domain name system) network service, and resolving a hostname make require many network queries. Sending these queries and receiving the answers or waiting for the timeouts can take a lot of time, so a Perl program might hang for a long time whenever it does 'gethostbyname'. You will write a replacement for gethostbyname() that does not suffer from this drawback; it will be asynchronous. The replacement will have two parts: 1. An asynchronous domain lookup server. This is a program that runs continually in the background, waiting for requests from clients to look up hostnames. There must be some way for a client process to contact the server and send it a hostname. The server must immediately return some sort of token that identifies the query uniquely. The server then performs the gethostbyname() call on behalf of the client. There must be some way for the client to find out whether or not the address has been obtained, and, if so, what the address is, using the previously-returned token to specify which previous query it is inquiring about. Finding out whether and answer is ready must be instantaneous. If the answer is ready, finding out the address must be instantaneous. 2. A Perl module that provides an interface to the asynchronous lookup service. The interface will look like this: use Gethostbyname::Asynchronous; my $query = Gethostbyname::Asynchronous->query("perl.plover.com"); until ($query->is_ready) { # ... do something else ... } # At this point, the service has located the address for us my $address = $query->answer; The ->answer method always returns the answer. If the answer isn't ready at the time the call is made, then ->answer waits until an answer is available and then returns it. The module must allow multiple simultaneous queries: for my $name (@names) { $address{$name} = Gethostbyname::Asynchronous->query($name); } while (...) { # ...do something else for a while... for my $host (keys %address) { if ($address{$host}->is_ready) { print "$host: ", $address{$host}->answer, "\n"; delete $address{$host}; } } # More other stuff going on here... } If you're not familiar with OOP techniques in Perl, you may implement a functional-style interface instead: use Gethostbyname::Asynchronous::Functional; my $qid = query("perl.plover.com"); until (is_ready($qid)) { # ... do something else ... } # At this point, the service has located the address for us my $address = answer($qid);