длительный дуплекс с TCP без использования метода KeepAlive () - PullRequest
1 голос
/ 17 мая 2011

Мне нужно реализовать длительное дуплексное соединение TCP для уведомления о событиях. Клиент регистрируется на события и сервер сообщает об этих событиях всем подписчикам.

Проблема в том, что TCP-соединение закрывается через 10 минут. Я знаю о надежной сессии. таймауты закрытия и бездействия.

Мне нужно реализовать какое-то «всегда открытое соединение» между клиентом и сервером. Клиент переподключается, как только он замечает, что соединение потеряно. но может быть трудно заметить, что некоторые соединения теряются при соединении с TCP.

Мне удалось изобрести какое-то решение с длительными тайм-аутами приема и бездействия. Клиент "импульсно" проверяет сервер в течение короткого промежутка времени, если он все еще подключен и подключен с помощью какого-либо метода KeepAlive ().

Я хотел бы получить решение без использования метода KeepAlive () в контракте на обслуживание.

Есть идеи?

// Миро

1 Ответ

2 голосов
/ 31 мая 2011

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, вам нужно отправить реальные данные на сервер.периодически или узнайте, что на вашем маршруте от клиента к серверу прерывает ваше соединение.

...