У меня есть клиент connect() на сервере, а при простоя он истекает через пару часов. Я добавил setsockopt (socket, SOL_SOCKET, SO_KEEPALIVE ...) с 1 сек. , но это не помогло. Любые подсказки о том, почему keepalive не работает? Будет ли это иметь значение, если я использовал SOL_TCP вместо SOL_SOCKET? Это на Linux.Socket keepalive не работает
ответ
int val = 1;
setsockopt(socket, SOL_SOCKET, SO_KEEPALIVE, &val, sizeof val)
Просто позволяет keepalives. Вы получите таймеры по умолчанию для поддержки активности зондов, которые можно просмотреть с помощью команды:
sysctl net.ipv4.tcp_keepalive_time
Обычно по умолчанию пара часов.
Если вы хотите изменить таймеры по умолчанию, вы можете использовать это:
struct KeepConfig cfg = { 60, 5, 5};
set_tcp_keepalive_cfg(fd, &cfg);
С вспомогательными функциями здесь:
struct KeepConfig {
/** The time (in seconds) the connection needs to remain
* idle before TCP starts sending keepalive probes (TCP_KEEPIDLE socket option)
*/
int keepidle;
/** The maximum number of keepalive probes TCP should
* send before dropping the connection. (TCP_KEEPCNT socket option)
*/
int keepcnt;
/** The time (in seconds) between individual keepalive probes.
* (TCP_KEEPINTVL socket option)
*/
int keepintvl;
};
/**
* enable TCP keepalive on the socket
* @param fd file descriptor
* @return 0 on success -1 on failure
*/
int set_tcp_keepalive(int sockfd)
{
int optval = 1;
return setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, &optval, sizeof(optval));
}
/** Set the keepalive options on the socket
* This also enables TCP keepalive on the socket
*
* @param fd file descriptor
* @param fd file descriptor
* @return 0 on success -1 on failure
*/
int set_tcp_keepalive_cfg(int sockfd, const struct KeepConfig *cfg)
{
int rc;
//first turn on keepalive
rc = set_tcp_keepalive(sockfd);
if (rc != 0) {
return rc;
}
//set the keepalive options
rc = setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPCNT, &cfg->keepcnt, sizeof cfg->keepcnt);
if (rc != 0) {
return rc;
}
rc = setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPIDLE, &cfg->keepidle, sizeof cfg->keepidle);
if (rc != 0) {
return rc;
}
rc = setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPINTVL, &cfg->keepintvl, sizeof cfg->keepintvl);
if (rc != 0) {
return rc;
}
return 0;
}
То, что я искал. Спасибо – excalibur
Большое спасибо. Это спасло мой день. Есть ли установленный тайм-аут для «чата», например, приложения? Будет полезно, если вы опишете, что эти методы делают внутри? Они отправляют 0 пакетов полезной нагрузки на серверный сокет? Это дорогостоящая операция (например, может быть создан новый поток)? BTW, @excalibur, вы должны принять этот ответ, нажав правую отметку ниже голосов, если вы удовлетворены. – iammilind
Несмотря на свое название, поддержание активности не о сохранении связи живой, речь идет об обмене пакетов периодически, чтобы убедиться, что существует сетевой путь между одноранговыми узлами. Он убивает соединения, которые будут выдерживать продолжительные отключения сети в режиме ожидания.
В связи с этим поведение keep-alive не должно использоваться, если нет веских причин, таких как telnet или SSH-соединения, где разумно убивать сеанс, когда клиент выходит из прикосновения.
Скорее всего, это сервер, который закрывает соединение через n часов независимо от использования keepalive из-за некоторой политики обработки соединений.
№ Сервер не закрывает его. Соединение отключается только при его простоях. Цель keepalive состоит в том, чтобы заставить его казаться «не праздным» - и это то, что не работает – excalibur
Возможно, какой-то промежуточный маршрутизатор/брандмауэр/NAT установил таймаут соединения. В Linux общий тайм-аут NAT составлял 1 час (3600 секунд). – epx
Когда сетевой посредник, такой как брандмауэр/NAT, решает убить незанятое соединение, он (в большинстве случаев) просто устранит его, не уведомив соединительные одноранговые узлы о том, что соединение прошло (например, пакет FIN). В результате, с точки зрения сверстников, соединения живы, и единственный способ узнать, что сокет ушел, - использовать тайм-аут чтения. С помощью механизма keepalive стек TCP/IP обнаруживает разъединение, и поэтому приложение будет уведомлено об отключении намного раньше (если настройки времени простоя будут соответственно опущены). –
- 1. Socket heartbeat vs keepalive
- 2. C# tcp socket keepalive
- 3. richfaces keepAlive не работает
- 4. Apache & Node Обратный прокси, Socket Timeout, Keepalive
- 5. MVC/JQuery keepalive/heartbeat - не работает?
- 6. Директива Nginx keepalive, возможно, не работает
- 7. socket keepalive работает с xp, но не с окнами 7 C#
- 8. Почему NodeJS KeepAlive работает не так, как ожидалось?
- 9. Как установить параметр keepalive для induvidual socket в VxWorks
- 10. Socket IO runOnUiThread не работает
- 11. Python socket прослушиватель не работает
- 12. Настройка Socket Streams не работает
- 13. RAW Socket send не работает
- 14. socket http request не работает
- 15. Ionic Socket setup не работает
- 16. Почему UWSGI не соблюдает флаг «-http-keepalive»?
- 17. Как работает расширение Socket Keep-Alive? C#
- 18. grunt-contrib-connect работает только с keepalive
- 19. uWSGI keepalive
- 20. Настройка TCP keepalive после принятия
- 21. socket socket socket не подключен android
- 22. Почему KeepAlive не работает в моем файле .htaccess?
- 23. Как сделать HA Proxy KeepAlive
- 24. Как работает PrimeFaces Socket?
- 25. C# HttpClient соединение KeepAlive
- 26. IndyTCP Socket работает непредсказуемо
- 27. Программа проверки Java KeepAlive не возвращает true для .checkError
- 28. Включить Tcp Keepalive в Windows CE 6.0
- 29. MOSS 2007 KeepAlive Файл
- 30. переменные экземпляра iOS keepAlive
Определить время после нескольких часов. Какой именно симптом этого? – EJP
errno 110 - Время ожидания подключения. Я сделал tcpdump и не вижу сообщений keepalive. – excalibur