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

I can communicate with client socket smoothly and end the
child process sometime when the "print SOCKET ...;"
statement get a false value.
But,if the client encountered a accident,such as deadlock
,he would leave without informing me.
I will be not able to get any information about the client
and the child will be in existence in a very long time.
Is there a way to solve the problem?
Thanks.

Replies are listed 'Best First'.
Re: accidentally disconnected
by lhoward (Vicar) on Jul 02, 2000 at 02:57 UTC
    Unfortunately no. There are many types of ways for a client process to stop communicating with a server. If the client dies "nicely" and closes its socket, you will get a close on the socket (a TCP packet with the RST flag set). Even if the client process dies hard (kill -9 or core-dump) a RST packet will usually be sent.

    However in the worse case (a dealock as you describe is a good example of this, another would be a network error that prevented any more packets from transiting from client to server, or the OS kernel on the machine running the client locking up) the only way to detect this it to timeout. If you are concerned about detecting this kind of problem earlier you could have heartbeat packets sent at regular intervals that you could use to detect problems. However, this approach can use up a lot of bandwidth and requires some relatively intricate additional code in both the client and server.