Stream Socket错误处理winRT

时间:2015-07-20 09:42:34

标签: c# sockets exception-handling 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。

以下是结果异常对象:

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

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

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

的例外情况

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

有没有其他方法可以获得理想的结果?

2 个答案:

答案 0 :(得分:1)

您获得AggregateException,因为它是从async方法生成的

是的,你必须检查HResult

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

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

答案 1 :(得分:0)

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

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