views:

164

answers:

3

I'm using fork() on Perl on Windows (ActivePerl) for a basic socket server, but apparently there are problems (it won't accept connections after a few times), is there any workaround?

Here is the portion of the relevant code:

while($client = $bind->accept()) {
    $client->autoflush();
    if(fork()){ $client->close(); }
    else { $bind->close(); new_client($client); exit(); }
}
+2  A: 

Windows doesn't have fork. Attempts to emulate it usually give less than ideal results.

The best solution is probably to rewrite your code so it doesn't use fork. Maybe threads?

Turtle
Perl on Windows emulates fork() with threads behind the scenes.
Andrew Medico
+6  A: 

I'd suggest installing Net::Server and using it instead, because there's probably no compelling reason for you to write all of the listening and forking logic yourself, and Net::Server is already well-tested to work on many platforms including ActivePerl. The Net::Server::Fork personality is the most similar to the code you're writing, although I'd suggest using Net::Server::Prefork instead, since it offers better performance at a minimal cost.

hobbs
+3  A: 

If by a few, you mean exactly 64, then you should see this discussion. In the parent process you should call waitpid -1,&WNOHANG every once in a while to clean up the completed children.

mobrule