Это низкоуровневая деталь протокола TCP. По умолчанию он не передает пакеты keep-alive, поскольку это приводит к потере пропускной способности, поэтому он осознает, что соединение прервалось только тогда, когда что-то происходит, что побуждает его проверить соединение. (Я не уверен, почему переподключение с того же клиента может вызвать это.)
Вы можете сделать так, чтобы TCP отправлял обычные пакеты keep-alive, чтобы обнаруживать разъединения ранее. В windows это может быть активировано серверным приложением, но настраивается через реестр (подробности см. здесь ).
Вы также можете реализовать механизм поддержания активности на уровне протокола, заставив клиента или сервер отправлять случайные нулевые пакеты (пакет, который ничего не делает в частности). Это, очевидно, требует, чтобы используемый протокол определял какое-то интересное сообщение «ничего не делать» или «ничего не делать» (NOOP, STATUS, PING ... и тому подобное).