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?
Her开发者_开发知识库e is the portion of the relevant code:
while($client = $bind->accept()) {
$client->autoflush();
if(fork()){ $client->close(); }
else { $bind->close(); new_client($client); exit(); }
}
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.
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.
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?
精彩评论