流套接字错误处理 winRT
Stream Socket error handling winRT
我正在研究流套接字,
根据 msdn 文档:
处理异常
当您在 StreamSocket 上调用异步方法时,您必须编写代码来处理异常 class。参数验证错误、名称解析失败和网络错误可能导致异常。网络错误异常(例如连接丢失、连接失败和服务器故障)随时可能发生。这些错误会导致抛出异常。如果您的应用程序未处理异常,则可能会导致整个应用程序被运行时终止。
Windows.Networking.Sockets 命名空间具有简化使用套接字时处理错误的功能。 SocketError 上的 GetStatus 方法 class 可以将 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)}
留言: "One or more errors occurred."
来源:"mscorlib"
StackTrace: " at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)\r\n at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)\r\n 在 System.Threading.Tasks.Task.Wait()\r\n 在 StreamSokcetSample.MainPage.Button_Tapped(对象发送者,TappedRoutedEventArgs e)
在这种情况下,我总是得到 SocketErrorStatus.Unknown(默认值)作为结果,而当我将 HRESULT: 0x8007274C 的 int 值传递给 GetStatus 时,它导致正确的输出(ConnectionTimedOut = 3)。
InnerException: {System.Exception: 连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立的连接失败,因为连接的主机有没有回应。 (来自 HRESULT 的异常:0x8007274C)}
我可以依赖内部异常消息并从那里获取 HRESULT 吗?
还有其他方法可以得到想要的结果吗?
根异常是一个AggregateException(它是一个.NET级别的异常),它通常是另一个线程抛出的异常的包装异常。在这种情况下,这是因为您使用了 "ConnectAsync" 线程池中的 运行 方法。
因此,要获得正确的套接字状态,您应该使用从 Windows 运行时级别抛出的 InnerException。
你得到一个 AggregateException
因为它是从 async
方法生成的
所以是的,你必须检查 InnerException
的 HResult
SocketErrorStatus socketErrorStatus = SocketError.GetStatus(ex.InnerException.HResult);
这将为您提供所需的输出。
我正在研究流套接字,
根据 msdn 文档:
处理异常
当您在 StreamSocket 上调用异步方法时,您必须编写代码来处理异常 class。参数验证错误、名称解析失败和网络错误可能导致异常。网络错误异常(例如连接丢失、连接失败和服务器故障)随时可能发生。这些错误会导致抛出异常。如果您的应用程序未处理异常,则可能会导致整个应用程序被运行时终止。
Windows.Networking.Sockets 命名空间具有简化使用套接字时处理错误的功能。 SocketError 上的 GetStatus 方法 class 可以将 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)}
留言: "One or more errors occurred."
来源:"mscorlib"
StackTrace: " at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)\r\n at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)\r\n 在 System.Threading.Tasks.Task.Wait()\r\n 在 StreamSokcetSample.MainPage.Button_Tapped(对象发送者,TappedRoutedEventArgs e)
在这种情况下,我总是得到 SocketErrorStatus.Unknown(默认值)作为结果,而当我将 HRESULT: 0x8007274C 的 int 值传递给 GetStatus 时,它导致正确的输出(ConnectionTimedOut = 3)。
InnerException: {System.Exception: 连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立的连接失败,因为连接的主机有没有回应。 (来自 HRESULT 的异常:0x8007274C)}
我可以依赖内部异常消息并从那里获取 HRESULT 吗?
还有其他方法可以得到想要的结果吗?
根异常是一个AggregateException(它是一个.NET级别的异常),它通常是另一个线程抛出的异常的包装异常。在这种情况下,这是因为您使用了 "ConnectAsync" 线程池中的 运行 方法。
因此,要获得正确的套接字状态,您应该使用从 Windows 运行时级别抛出的 InnerException。
你得到一个 AggregateException
因为它是从 async
方法生成的
所以是的,你必须检查 InnerException
HResult
SocketErrorStatus socketErrorStatus = SocketError.GetStatus(ex.InnerException.HResult);
这将为您提供所需的输出。