Re[2]: Прблема с сокетами.
От: Requiem  
Дата: 23.02.07 11:33
Оценка:
Здравствуйте, 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?
Just think...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.