Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does my ActivePerl program on Windows stop accepting socket connections?

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(); }
}
like image 688
Darioush Avatar asked Mar 14 '10 00:03

Darioush


3 Answers

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.

like image 156
hobbs Avatar answered Oct 29 '22 11:10

hobbs


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.

like image 41
mob Avatar answered Oct 29 '22 12:10

mob


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?

like image 38
Turtle Avatar answered Oct 29 '22 10:10

Turtle