简体   繁体   中英

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(); }
}

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?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM