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