Соединение сохраняется, но конечная точка не работает?

Соединение сохраняется, но конечная точка не работает?

Есть ли у кого-нибудь идея, что может заставить TCP-соединение (клиентская сторона) оставаться в состоянии ESTABLISHED около 24 часов, даже если сервер был перезапущен? Клиентский процесс остается на системном вызове recv и остается в таком состоянии, не вызывая ошибки!

Клиент находится на установке Ubuntu 11.04. Это случалось со мной уже несколько раз, но я не могу понять, почему и как это решить.

решение1

Соединение остается УСТАНОВЛЕННЫМ с одной стороны и несуществующим с другой, потому что это состояние, в котором оно было после перезапуска сервера. Клиент не имеет представления о том, что сервер перезапустился, а сервер не имеет представления о том, что клиент думает, что он все еще подключен. Если только клиент не попытается использовать соединение, оно останется таким навсегда. (Если только не включены keepalives, в этом случае оно останется таким обычно около двух дней.)

Почему клиент вечно ждет сервер?! Либо клиент, либо протокол сломан. Если клиент не следует протоколу, клиент сломан. Если протокол не определяет, как обнаружить мертвое соединение, протокол сломан.

TCP не обнаруживает мертвое соединение для конца, который не пытается отправить данные. Поэтому каждый протокол, наложенный поверх TCPдолженбыть разработаны с учетом этого. Если это зависшее соединение является неприемлемым поведением, то этот протокол сломан, поскольку он допускает это неприемлемое поведение (или клиент сломан, поскольку не следует протоколу).

Действительно ли спецификация протокола говорит, что нужно ждать?навсегдадля данных? Если так, то я бы усомнился в здравомыслии разработчиков протокола.

Связанный контент