C # SocketException не попадает - PullRequest
6 голосов
/ 12 июля 2011

У меня действительно странная ситуация в моем коде.Я разрабатываю клиент-серверное приложение ac # chat.Когда я закрываю сервер, я хочу, чтобы клиент автоматически закрывался.Клиент читает из объекта TcpClient, используя StremReader.Клиент находится в цикле while, где он читает строку (StreamReader.ReadLine ()) и затем выполняет некоторые операции со строкой, которую он читает.Когда сервер закрывается, я также закрываю серверную часть соединения TCP.Итак, я ожидаю, что клиент увидит исключение SocketException, вызванное readline, перехватит его и завершится.Но исключение не попадает!Вот код цикла клиента:

 while (true)
 {
     try
     {
          ricev = read.ReadLine();
     }
     catch(SocketException exc)
     {
         //It never gets in here
     }
     chat.Invoke(showMessage, ricev);
 }

Когда я закрываю сервер, Visual Studio сообщает мне, что в System.dll было сгенерировано исключение «System.Net.Sockets.SocketException», но я не могуЛови.Почему это происходит?я также пытался перехватить любое общее исключение с помощью блока

catch
{
}

, но это тоже не сработало.

Любая помощь будет оценена!попробовав еще несколько раз, я обнаружил, что SocketException вообще не вызывается.Это так странно, как я сказал в комментарии, в противоположной ситуации, когда клиент закрывается перед сервером, возникает исключение, и я могу это сделать.Я действительно не знаю, что происходит ....

Ответы [ 6 ]

1 голос
/ 12 июля 2011

Если я вас хорошо понимаю, сценарий, когда вы вызываете метод Stop для TcpListener объекта "_server.Stop()", не вызовет SocketException на стороне клиента при вызове Read в потоке.Я не знаю, почему это происходит, но у меня есть работа вокруг этого.это путем доступа к базовому Socket на TcpListener и вызова Shutdown на нем:

_server.Stop();
_server.Server.Shutdown(SocketShutdown.Both);//now at your "read.ReadLine();" will throw SocketException

Редактировать: Вы указали в комментарии:

на самом деле я закрываю tcpclient, возвращаемый слушателем в методе accept.connClient.Close ()

Если вы остановите tcpListerner "_server.Stop()", а затем закроете метод clients, полученный из _server.AcceptTcpCleint(), то в at reader.ReadLine() будет выброшено IOException: Unable to read data from the transport connection: A blocking operation was interrupted by a call to WSACancelBlockingCall Я сам проверил.

0 голосов
/ 02 апреля 2017

У меня раньше была эта проблема, и оказалось, что я активировал "Разбить, когда выбрано исключение CLR, и не снял флажок обратно"

Итак, проверка того, что вы не сняли эту опцию,
Нажмите Alt + Ctr + E прокрутите вниз до Common Exception Language Exception и обязательно снимите флажок «Брошенный». Я надеюсь, что это поможет вам.

0 голосов
/ 22 января 2013

Когда вы закрываете сокет сервера, другая сторона получает сообщение нулевого байта. Это указывает на то, что сервер закрылся правильно:

Если удаленный хост завершает соединение Socket методом Shutdown, и все доступные данные были получены, метод Receive завершится немедленно и вернет ноль байтов.

http://msdn.microsoft.com/en-us/library/8s4y8aff.aspx

Исключения генерируются только для исключительных ситуаций, например, если вы перезагружаете сервер, когда к нему подключен ваш клиент, а не для нормального выполнения программы.

Операция ReadLine() также не должна вызывать исключение, а просто возвращает null, когда это происходит:

Возвращаемое значение

Следующая строка из входного потока или ноль, если достигнут конец входного потока.

http://msdn.microsoft.com/en-us/library/system.io.streamreader.readline.aspx

0 голосов
/ 07 июля 2012

Visual Studio сообщает мне, что «System.Net.Sockets.SocketException» исключение первого шанса возникло в System.dll, но я не могу поймать Это. Почему это происходит?

Исключения первого шанса перехвачены отладчиком и прерывают вас. Это второе случайное исключение, которое приводит вас в ваш блок catch, и поэтому вы не попадаете в свой блок catch при первом шансе. См. статью для получения дополнительной информации.

Извлечено из статьи, о которой я упоминал выше

Означает ли исключение первого шанса, что в моем коде есть проблема? Сообщения об исключениях первого шанса чаще всего не означают, что существует проблема в коде. Для приложений / компонентов, которые обрабатывают Изящные исключения, сообщения об исключениях первого шанса позволяют Разработчик знает, что возникла исключительная ситуация и была обрабатываются.

Кроме того, вы всегда можете настроить свой отладчик так, чтобы он не останавливался на исключениях первого шанса.

0 голосов
/ 07 июля 2012

Это связано с тем, что .Net использует небезопасные методы для методов отправки / получения. Вам необходимо обработать UnhandledException

вашей программы Coontext
0 голосов
/ 13 июля 2011

Если вы звоните Invoke, вероятно, исключение будет заключено в TargetInvocationException.

...