Если мы говорим по TCP и если клиентское соединение правильно закрыто, на сервер отправляется сообщение, поэтому сервер будет знать, что соединение закрыто, поэтому read / recv вернет 0 байтов, указывающих EOF.
Но вы спрашиваете о случаях, когда клиент не может связаться с сервером. Обнаружение отсутствия сообщений обязательно выполняется с использованием тайм-аута.
Сервер может периодически «пинговать» клиента (отправлять сообщение, на которое клиент должен ответить).
Вы можете попросить клиента периодически отправлять сообщение («сердцебиение») в режиме ожидания.
В любом случае, нет сообщения (любого типа) для X секунд указывает на разорванное соединение.