in reply to accidentally disconnected

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.