C#SocketException没有被捕获
我的代码中有一个非常奇怪的引用。 我正在开发ac#chat客户端 – 服务器应用程序。 当我关闭服务器时,我希望客户端自动关闭。 客户端使用StremReader从TcpClient对象读取。 客户端处于while循环中,它读取一行(StreamReader.ReadLine()),然后使用它读取的行执行一些操作。 当serever关闭时,我也关闭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”第一次机会exception,但是我无法理解它。 为什么会这样? 我还尝试用a捕获任何genericsexception
catch { }
阻止,但这也不起作用。
任何帮助将不胜感激!
编辑:经过多次尝试后,我发现SocketException根本没有被提升。 这是如此奇怪,正如我在评论中所说,在相反的情况下,当客户端在服务器之前关闭时,exception会被提升并且我可以解决它。 我真的不知道发生了什么……
如果我理解你的情况就是当你在TcpListener
对象“ _server.Stop()
”调用Stop
方法时,它不会在客户端抛出SocketException
时调用流上的Read
…我不知道为什么这是发生了,但我有一个工作场所。 它是通过访问TcpListener
上的底层Socket
并在其上调用Shutdown
:
_server.Stop(); _server.Server.Shutdown(SocketShutdown.Both);//now at your "read.ReadLine();" will throw SocketException
编辑:您在评论中说:
实际上我正在关闭accept方法上的监听器返回的tcpclient。 connClient.Close()
如果正在停止tcpListerner
“ _server.Stop()
”然后关闭从_server.AcceptTcpCleint()
方法_server.AcceptTcpCleint()
的clients
,那么在at reader.ReadLine()
将抛出IOException: Unable to read data from the transport connection: A blocking operation was interrupted by a call to WSACancelBlockingCall
我自己测试了它。
如果您正在调用Invoke
,则可能是exception将包含在TargetInvocationException
。
visual studio告诉我在System.dll中引发了一个“System.Net.Sockets.SocketException”第一次机会exception,但我无法理解它。 为什么会这样?
调试器拦截第一次机会exception并中断您。 这是第二次机会exception,让你进入你的阻挡块,这就是为什么你没有第一次进入你的阻止块。 有关更多信息,请参阅此文章 。
摘自我上面提到的文章
第一次机会exception是否意味着我的代码存在问题? 第一次机会exception消息通常并不意味着代码中存在问题。 对于优雅处理exception的应用程序/组件,第一次机会exception消息让开发人员知道遇到并处理了exception情况。
另外,您始终可以将调试器配置为不会在第一次机会exception时停止。
关闭服务器套接字时,另一端收到零字节的消息。 这表示服务器已正常关闭:
如果远程主机使用Shutdown方法关闭Socket连接,并且已收到所有可用数据,则Receive方法将立即完成并返回零字节。
http://msdn.microsoft.com/en-us/library/8s4y8aff.aspx
仅在特殊情况下抛出exception – 例如,如果在客户端连接到服务器计算机时重新启动服务器计算机 – 而不是正常的程序流。
ReadLine()
操作也不应抛出exception,只是在发生这种情况时返回null
:
返回值
输入流的下一行,如果到达输入流的末尾,则为null。
http://msdn.microsoft.com/en-us/library/system.io.streamreader.readline.aspx
我之前遇到过这个问题,并且我已经激活了“当CLRexception被抛出并且没有取消选中时断开”
所以,检查你没有取消选中此function
按Alt + Ctr + E向下滚动到Common Runtime Language Exception并确保取消选中“Thrown”复选框。 我希望这对你有帮助。
这是因为.Net对发送/接收方法使用了不安全的方法。你必须处理你的程序Coontext的UnhandledException