c# - 流套接字错误处理 winRT

标签 c# sockets exception windows-runtime

我正在研究流套接字,

根据 msdn文档:

处理异常

在 StreamSocket 类上调用异步方法时,您必须编写代码来处理异常。参数验证错误、名称解析失败和网络错误可能导致异常。网络错误异常(例如连接丢失、连接失败和服务器故障)随时可能发生。这些错误会导致抛出异常。如果您的应用未处理异常,则可能会导致整个应用被运行时终止。

Windows.Networking.Sockets 命名空间具有简化使用套接字时处理错误的功能。 SocketError 类上的 GetStatus 方法可以将 HRESULT 从异常转换为 SocketErrorStatus 枚举值。这对于在您的应用中以不同方式处理特定网络异常非常有用。应用还可以使用参数验证错误异常中的 HRESULT 来了解有关导致异常的错误的更多详细信息。

所以我使用以下代码来处理套接字连接错误状态。

  try
        {
            var socket = new StreamSocket();
            HostName host = new HostName("www.google.com");
            // connection is executed synchronously
            socket.ConnectAsync(host, "2000", SocketProtectionLevel.PlainSocket).AsTask().Wait();

            Debug.WriteLine("Success");
        }
        catch (Exception ex)
        {
            SocketErrorStatus socketErrorStatus = SocketError.GetStatus(ex.HResult);

            switch(socketErrorStatus)
            {
                case SocketErrorStatus.ConnectionTimedOut:
                    //do something
                    break;
                case SocketErrorStatus.HostNotFound:
                    //do something
                    break;
                default:
                    break;
            }
        }

但是套接字错误返回的异常对象不包含有效的 HResult。

以下是结果异常对象:

Count = 当前上下文中不存在名称“InnerExceptionCount” [System.AggregateException]: Count = 当前上下文中不存在名称“InnerExceptionCount”
数据:{System.Collections.ListDictionaryInternal}
帮助链接:null
HResult:-2146233088
InnerException: {System.Exception: 连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立的连接失败,因为连接的主机没有响应。 (HRESULT 异常:0x8007274C)}
消息:“发生了一个或多个错误。”
来源:“mscorlib”
StackTrace:“在 System.Threading.Tasks.Task.ThrowIfExceptional( bool 值 includeTaskCanceledExceptions)\r\n 在 System.Threading.Tasks.Task.Wait(Int32 毫秒超时,CancellationToken cancellationToken)\r\n 在 System.Threading.Tasks.Task.Wait()\r\n 在 StreamSokcetSample.MainPage.Button_Tapped(Object sender, TappedRoutedEventArgs e)"

在这种情况下,我总是得到 SocketErrorStatus.Unknown(default value) 结果,而当我将 HRESULT: 0x8007274C 的 int 值传递给 GetStatus 时,结果是正确的输出(ConnectionTimedOut = 3)。

InnerException: {System.Exception: 连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立的连接失败,因为连接的主机没有响应。 (HRESULT 异常:0x8007274C)

我可以依赖内部异常消息并从那里获取 HRESULT 吗?

还有其他方法可以得到想要的结果吗?

最佳答案

你得到一个 AggregateException 因为它是从 async 方法生成的

所以是的,你必须检查 InnerExceptionHResult

SocketErrorStatus socketErrorStatus = SocketError.GetStatus(ex.InnerException.HResult);

这将为您提供所需的输出。

关于c# - 流套接字错误处理 winRT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31513254/

相关文章:

c# - 多个按钮调用相同的功能,可以找出哪个按钮调用了该功能吗?

c# - 如何通过套接字发送外部库的可序列化对象?

java - ServerSocketChannel 已关闭,但 TCP ESTABLISHED 仍在

java - 在 ByteArrayInputStream 的 read 方法中抛出异常

c - 在 C 中是否有调用堆栈转储的函数?

java - android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java :1145)

c# - 使用字符串类型的参数进行线程化

c# - 如何明智地使用 StringBuilder?

c# - 无法加载工具箱项目。它将从工具箱中删除

python - 使用 Twisted (python) 为 UDP 套接字设置超时