我的代码中发生了非常奇怪的事情。我正在开发一个C#聊天客户端-服务器应用程序。当我关闭服务器时,我希望客户端自动关闭。客户端正在使用StremReader从TcpClient对象读取。客户端处于while循环中,在该循环中,它读取一行(StreamReader.ReadLine()),然后对其读取的行进行一些操作。
当服务器关闭时,我还关闭了服务器端的tcp连接。因此,我希望客户端看到由readline引起的SocketException,将其捕获并退出。但是,异常不会被捕获!
这是客户端循环代码:

 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根本没有引发。就像我在评论中所说的那样,这真是太奇怪了,在相反的情况下,当客户端在服务器之前关闭时,就会引发异常,并且我可以取消它。
我真的不知道发生了什么...。

最佳答案

如果我很了解您的情况,那么当您在Stop对象“TcpListener”上调用_server.Stop()方法时,当在流上调用SocketException时,它不会在客户端抛出Read……我不知道为什么会这样,但是我有周围的工作场所。这是通过访问Socket上的基础TcpListener并在其上调用Shutdown来实现的:

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

编辑:您在评论中说过:



如果要停止tcpListerner_server.Stop()”,然后关闭从clients方法获取的_server.AcceptTcpCleint(),则在reader.ReadLine()处将抛出IOException: Unable to read data from the transport connection: A blocking operation was interrupted by a call to WSACancelBlockingCall我自己对其进行了测试。

关于C#SocketException不会被捕获,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6665563/

10-11 10:44