Принятый ответ не работает, если вы отключите сетевой кабель. Или сервер вылетает. Или ваш маршрутизатор падает. Или, если вы забыли оплатить свой интернет-счет. Установите параметры поддержки TCP для повышения надежности.
public static class SocketExtensions
{
public static void SetSocketKeepAliveValues(this Socket instance, int KeepAliveTime, int KeepAliveInterval)
{
//KeepAliveTime: default value is 2hr
//KeepAliveInterval: default value is 1s and Detect 5 times
//the native structure
//struct tcp_keepalive {
//ULONG onoff;
//ULONG keepalivetime;
//ULONG keepaliveinterval;
//};
int size = Marshal.SizeOf(new uint());
byte[] inOptionValues = new byte[size * 3]; // 4 * 3 = 12
bool OnOff = true;
BitConverter.GetBytes((uint)(OnOff ? 1 : 0)).CopyTo(inOptionValues, 0);
BitConverter.GetBytes((uint)KeepAliveTime).CopyTo(inOptionValues, size);
BitConverter.GetBytes((uint)KeepAliveInterval).CopyTo(inOptionValues, size * 2);
instance.IOControl(IOControlCode.KeepAliveValues, inOptionValues, null);
}
}
// ...
Socket sock;
sock.SetSocketKeepAliveValues(2000, 1000);
Значение времени устанавливает время ожидания с момента последней отправки данных. Затем он пытается отправить и получить пакет поддержки активности. Если это не удается, он повторяет 10 попыток (число, жестко закодированное после Vista AFAIK) в интервале, указанном до принятия решения о разрыве соединения.
Таким образом, приведенные выше значения приведут к обнаружению 2 + 10 * 1 = 12 секунд. После этого любые операции чтения / записи / опроса должны завершиться ошибкой в сокете.