Здравствуйте, Morpheus_, Вы писали:
M_>Не очень понятно в чем заключается проблема, этот exception появляется при попытке чтения из сокета соединение с которым уже закрыто.
M_>Возможно здесь речь идет о том что сервер сразу после отправки пакета закрывает соединение, а клиент не успевает его принять? Если так, то у сокета есть метод Shutdown, его нужно вызывать перед Close, тогда к моменту вызова Close все отправленные до этого данные будут гарантировано доставлены до закрытия соединения
Данная функция может быть вызвана в двух случаях:
1. если клиент отсылает на сервер команду завершить работу (000002):
while (Accept)
{
string message = sReader.ReadString();
string command = message.Substring(0, 6);
switch (command)
{
case "000002":
Disconnect(false); /* false, указывает что данная команда пришла с клиента, соответственно не требуется
посылать команду на отключение клиенту*/
break;
...
}
}
тоесть происходит вызов данной функции, в процессе которой флаг Accept устанавливается в положение false, поток завершается и все прекрасно работает (на сервере).
2. воторой случай вызов данной функции происходит допустим при обработке нажатия на кнопку (на сервере).
В данном случаае вызов функции осуществляется следующим образом:
Disconnect(true); // true, указывает что необходимо отправить клиенту комманду на отключение.
Во время вызова данной функции сервер ожидает прихода очередной (какой либо) команды от клиента:
string message = sReader.ReadString();
Проблема заключается в том, что при вызове Close() прочесть что либо из сокета соед. с которым уже закрыто с помощью BinaryReader уже не возможно и соответственно появляется данный exception сообщающий что "Программа на вашем хост-компьютере разорвала установленное подключение."
Я думаю что нечего страшного в этом нету, но мне крайне не нравится сам факт появления данного исключения. Соответственно вопрос стоит в том, что возможно пред методом Close() требуется вызвать еще какой нибудь метод, который прекратит ожидание чтения с помощью BinaryReader?