TCP-соединения не закрываются сами по себе;они либо явно закрыты, либо одна из конечных точек исчезла.(Примечание. Конечной точкой может быть прозрачный прокси-сервер или маршрутизатор с отслеживанием состояния в середине.) Я часто запускаю TCP-соединения, которые работают в течение нескольких дней, если не месяцев, даже без поддержки активности.
ВВ первом случае явное закрытие уведомит вашу сторону, но, похоже, этого не происходит.
В случае исчезнувшей конечной точки отправка данных - единственный способ выяснить,другая сторона ушла, и keep-alive - это прозрачный способ сделать это.
int delay = X; setsockopt(sockfd,SOL_TCP,TCP_KEEPIDLE,&delay,sizeof(delay));
int count = X; setsockopt(sockfd,SOL_TCP,TCP_KEEPCNT,&count,sizeof(count));
int interval = X; setsockopt(sockfd,SOL_TCP,TCP_KEEPINTVL,&interval,sizeof(interval));
int enable = 1; setsockopt(sockfd,SOL_SOCKET,SO_KEEPALIVE,&enable,sizeof(enable));
Если вы не хотите использовать keep-alive TCP, вам нужно отправить реальные данные на сервер.периодически или узнайте, что на вашем маршруте от клиента к серверу прерывает ваше соединение.