我正在使用流套接字,
根据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吗?
有没有其他方法可以获得理想的结果?
答案 0 :(得分:1)
您获得AggregateException
,因为它是从async
方法生成的
是的,你必须检查HResult
InnerException
SocketErrorStatus socketErrorStatus = SocketError.GetStatus(ex.InnerException.HResult);
这将为您提供所需的输出。
答案 1 :(得分:0)
根异常是AggregateException(它是一个.NET级别的异常),它通常是从另一个线程抛出异常的包装器异常。在这种情况下,这是因为您使用了在线程池中运行的“ConnectAsync”方法。
因此,要获得正确的套接字状态,您应该使用从Windows运行时级别抛出的InnerException。