Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 流套接字错误处理winRT_C#_Sockets_Exception Handling_Windows Runtime - Fatal编程技术网

C# 流套接字错误处理winRT

C# 流套接字错误处理winRT,c#,sockets,exception-handling,windows-runtime,C#,Sockets,Exception Handling,Windows Runtime,我正在处理流套接字 根据文件: 处理异常 在StreamSocket类上调用异步方法时,必须编写代码来处理异常。异常可能由参数验证错误、名称解析失败和网络错误引起。网络错误(例如连接丢失、连接故障和服务器故障)的异常随时都可能发生。这些错误导致抛出异常。如果应用程序未处理异常,则运行时可能会终止整个应用程序 Windows.Networking.Sockets命名空间具有简化使用套接字时处理错误的功能SocketError类上的GetStatus方法可以将HRESULT从异常转换为SocketE

我正在处理流套接字

根据文件:

处理异常

在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]:计数=名称“InnerExceptionCount”在当前上下文中不存在
数据:{System.Collections.ListDictionaryInternal}
帮助链接:空
HResult:-2146233088
InnerException:{System.Exception:连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立的连接失败,因为连接的主机没有响应。(HRESULT中的异常:0x8007274C)}
消息:“发生了一个或多个错误。”
来源:“mscorlib”
StackTrace:“在System.Threading.Tasks.Task.ThrowifeException(布尔值includeTaskCanceledException)\r\n在System.Threading.Tasks.Task.Wait(Int32毫秒超时,CancellationToken CancellationToken)\r\n在System.Threading.Tasks.Task.Wait()\r\n在StreamSokcetSample.MainPage.Button(对象发送器,TappedRoutedEventArgs e)”

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

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

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


是否有其他方法可以获得所需的结果?

根异常是一个AggregateException(它是一个.NET级别的异常),它通常是从另一个线程引发的异常的包装异常。在这种情况下,这是因为您使用了在线程池中运行的“ConnectAsync”方法


因此,为了获得正确的套接字状态,您应该使用从Windows运行时级别抛出的InnerException。

您将获得一个
AggregateException
,因为它是由
async
方法生成的

因此,是的,您必须检查
InnerException

SocketErrorStatus socketErrorStatus = SocketError.GetStatus(ex.InnerException.HResult);
这将为您提供所需的输出