C# 流套接字错误处理winRT
我正在处理流套接字 根据文件: 处理异常 在StreamSocket类上调用异步方法时,必须编写代码来处理异常。异常可能由参数验证错误、名称解析失败和网络错误引起。网络错误(例如连接丢失、连接故障和服务器故障)的异常随时都可能发生。这些错误导致抛出异常。如果应用程序未处理异常,则运行时可能会终止整个应用程序 Windows.Networking.Sockets命名空间具有简化使用套接字时处理错误的功能SocketError类上的GetStatus方法可以将HRESULT从异常转换为SocketErrorStatus枚举值。这对于在应用程序中以不同方式处理特定网络异常非常有用。应用程序还可以使用参数验证错误异常的HRESULT来了解导致异常的错误的详细信息 所以我使用以下代码来处理套接字连接错误状态C# 流套接字错误处理winRT,c#,sockets,exception-handling,windows-runtime,C#,Sockets,Exception Handling,Windows Runtime,我正在处理流套接字 根据文件: 处理异常 在StreamSocket类上调用异步方法时,必须编写代码来处理异常。异常可能由参数验证错误、名称解析失败和网络错误引起。网络错误(例如连接丢失、连接故障和服务器故障)的异常随时都可能发生。这些错误导致抛出异常。如果应用程序未处理异常,则运行时可能会终止整个应用程序 Windows.Networking.Sockets命名空间具有简化使用套接字时处理错误的功能SocketError类上的GetStatus方法可以将HRESULT从异常转换为SocketE
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);
这将为您提供所需的输出