я не уверен, полностью ли я понимаю проблему, но думаю, что она связана с той, которая у меня была, я использую Qt с соединением по сокету TCP, все неблокируемые, как в Windows, так и в Linux ..
хотел получить быстрое уведомление о том, что уже подключенный клиент вышел из строя или полностью исчез, и не ждал по умолчанию более 900 секунд, пока не будет подан сигнал отключения. Хитрость для получения этой работы состояла в том, чтобы установить для параметра сокета TCP_USER_TIMEOUT слоя SOL_TCP требуемое значение, заданное в миллисекундах.
это сравнительно новый вариант, пожалуйста, смотрите http://tools.ietf.org/html/rfc5482, но, видимо, он работает нормально, пробовал с WinXP, Win7 / x64 и Kubuntu 12.04 / x64, мой выбор на 10 с оказался немного длиннее , но гораздо лучше, чем все, что я пробовал раньше; -)
Единственная проблема, с которой я столкнулся, заключалась в том, чтобы найти правильные включения, так как, очевидно, это не добавлено в стандартные включения сокетов (пока ...), поэтому, наконец, я определил их сам следующим образом:
#ifdef WIN32
#include <winsock2.h>
#else
#include <sys/socket.h>
#endif
#ifndef SOL_TCP
#define SOL_TCP 6 // socket options TCP level
#endif
#ifndef TCP_USER_TIMEOUT
#define TCP_USER_TIMEOUT 18 // how long for loss retry before timeout [ms]
#endif
установка этой опции сокета работает только тогда, когда клиент уже подключен, строки кода выглядят так:
int timeout = 10000; // user timeout in milliseconds [ms]
setsockopt (fd, SOL_TCP, TCP_USER_TIMEOUT, (char*) &timeout, sizeof (timeout));
и сбой начального соединения фиксируется таймером, запускаемым при вызове connect (), так как для этого не будет сигнала Qt, сигнал соединения не будет повышен, так как соединения не будет, и Сигнал разъединения также не будет подан, так как соединение еще не было ..