6

我的代码中有一个非常奇怪的情况。我正在开发 ac# 聊天客户端-服务器应用程序。当我关闭服务器时,我希望客户端自动关闭。客户端正在使用 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”第一次机会异常,但我无法捕捉到它。为什么会这样?我还尝试用 a 捕获任何通用异常

catch
{
}

块,但这也不起作用。

任何帮助将不胜感激!

编辑:在尝试了更多次之后,我实际上发现 SocketException 根本没有被提出。这太奇怪了,正如我在评论中所说,在相反的情况下,当客户端在服务器之前关闭时,会引发异常并且我可以解决它。我真的不知道发生了什么事......

4

6 回答 6

1

如果我理解你的情况是当你在对象“ ”调用Stop方法时,在流上调用时它不会在客户端抛出......我不知道为什么会发生这种情况,但我有一个围绕它的工作. 它是通过访问底层证券并调用它:TcpListener_server.Stop()SocketExceptionReadSocketTcpListenerShutdown

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

编辑:您在评论中说:

实际上我正在关闭接受方法上的侦听器返回的 tcpclient。connClient.Close()

如果停止tcpListerner_server.Stop()”然后关闭clientsgetted from_server.AcceptTcpCleint()方法,那么我会随意reader.ReadLine()抛出IOException: Unable to read data from the transport connection: A blocking operation was interrupted by a call to WSACancelBlockingCall 我自己测试它。

于 2011-07-12T17:50:08.230 回答
0

如果您正在调用Invoke,则异常可能会被包装在TargetInvocationException.

于 2011-07-13T10:40:41.570 回答
0

当您关闭服务器套接字时,另一端会收到一条零字节的消息。这表明服务器已正常关闭:

如果远程主机使用 Shutdown 方法关闭了 Socket 连接,并且已经接收到所有可用数据,则 Receive 方法将立即完成并返回零字节。

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

仅在特殊情况下引发异常 - 例如,如果您在客户端连接到服务器计算机时重新启动服务器计算机 - 而不是正常的程序流程。

ReadLine()操作也不应引发异常,而应null在发生这种情况时简单地返回:

返回值

输入流的下一行,如果到达输入流的末尾,则返回 null。

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

于 2013-01-22T13:51:32.140 回答
0

Visual Studio 告诉我在 System.dll 中引发了“System.Net.Sockets.SocketException”第一次机会异常,但我无法捕捉到它。为什么会这样?

调试器拦截第一次机会异常并中断您。这是让您进入 catch 块的第二次机会异常,这就是为什么您不会catch在第一次机会时进入您的块。有关更多信息,请参阅本文

摘自我上面提到的文章

第一次机会异常是否意味着我的代码存在问题?首次机会异常消息通常并不意味着代码中存在问题。对于优雅地处理异常的应用程序/组件,第一次机会异常消息让开发人员知道遇到并处理了异常情况。

附带说明一下,您始终可以将调试器配置为在第一次机会异常时不停止。

于 2012-07-07T19:03:01.883 回答
0

我之前遇到过这个问题,结果我已经激活了“抛出 CLR 异常时中断并且没有取消选中它”

所以,检查你没有通过
按 Alt+Ctr + E 向下滚动到通用运行时语言异常并确保取消选中“抛出”复选框来取消选中此功能。我希望这对你有帮助。

于 2017-04-02T10:02:17.183 回答
-2

这是因为 .Net 对发送/接收方法使用了不安全的方法。你必须处理你的程序上下文UnhandledException

于 2012-07-07T18:49:42.870 回答