Как обнаружить разъединение сокета в C #
Я работаю над отношениями клиент / сервер, которые предназначены для перемещения данных назад и вперед в течение неопределенного периода времени.
Проблема, которую я пытаюсь преодолеть, находится на стороне клиента, так как мне не удается найти способ обнаружить разрыв соединения.
Я сделал несколько проходов для решений других людей, от простого перехвата исключений ввода-вывода до опроса сокета на всех трех режимах SelectModes. Я также пытался использовать комбинацию опроса с проверкой на "Доступно". поле розетки.
// Something like this
Boolean IsConnected()
{
try
{
bool part1 = this.Connection.Client.Poll(1000, SelectMode.SelectRead);
bool part2 = (this.Connection.Client.Available == 0);
if (part1 & part2)
{
// Never Occurs
//connection is closed
return false;
}
return true;
}
catch( IOException e )
{
// Never Occurs Either
}
}
На стороне сервера попытка написать «пустой» символ (\ 0) для клиента вызывает исключение ввода-вывода, и сервер может обнаружить, что клиент отключился (довольно легкий выход).
На стороне клиента та же операция не дает никаких исключений.
// Something like this
Boolean IsConnected( )
{
try
{
this.WriteHandle.WriteLine("\0");
this.WriteHandle.Flush();
return true;
}
catch( IOException e )
{
// Never occurs
this.OnClosed("Yo socket sux");
return false;
}
}
Я полагаю, что проблема, с которой я столкнулся при обнаружении разъединения с помощью опроса, заключается в том, что я довольно легко могу встретить ложное в SelectRead, если мой сервер еще ничего не записал обратно клиенту с момента последней проверки ... Не конечно, что делать здесь, я упустил все варианты, чтобы сделать это обнаружение, которое я могу найти, и ничто не было на 100% для меня, и в конечном итоге моя цель здесь состоит в том, чтобы обнаружить сбой сервера (или соединения), сообщить клиенту, ждать повторного подключения и т. д. Так что я уверен, что вы можете себе представить, что это неотъемлемая часть.
Цените любые предложения. Спасибо заранее
EDIT: Anyone viewing this question should note the answer below, and my FINAL Comments on it. I've elaborated on how I overcame this problem, but have yet to make a 'Q&A' style post.