Marcello has asked for the wisdom of the Perl Monks concerning the following question:

Hi,

I have written a OO system in Perl that connects to SMSC's of mobile operators to send SMS messages. Currently it works as follows:

The main process checks to see if there are SMS messages to be send. If there are, it forks off a child process which connects to the SMSC and sends all messages. After that, the connection is closed again.

The problem is that I need to keep the connections alive. So I have to develop some kind of socket connection pool in the main process, which the child processes can use to send their messages. The main process just needs to take care of the connections and restore them when needed.

Any ideas on how to set this up?

Thanks alot.

Cheers Marcello

Replies are listed 'Best First'.
Re: Persistent socket connections
by BrowserUk (Patriarch) on May 19, 2003 at 11:09 UTC

    In principle, the child of a fork inherits any open handles including sockets that the parent has has the time of the fork. So, you should only need to 'inform' the child which of a list of open handles is should not close before doing its stuff and it would use that to send its batch of work. The parent would still retain an open handle to that socket too.

    The only thing that you would need to do is make sure that the parent doesn't attempt to write to the socket whilst the child is still alive. You could do this using a $SIG{CHLD} handler or waitpid under *nix, but might need to resort to using kill (with a signal value of 0 (zero)) under Win32 to determine when the child process has finished. Once the child is finished, the parent can go back to polling the open handle it retains to keep/verify the connection.

    Did I misunderstand your question?


    Examine what is said, not who speaks.
    "Efficiency is intelligent laziness." -David Dunham
    "When I'm working on a problem, I never think about beauty. I think only how to solve the problem. But when I have finished, if the solution is not beautiful, I know it is wrong." -Richard Buckminster Fuller