gpt4 book ai didi

c# - 流套接字错误处理 winRT

转载 作者:行者123 更新时间:2023-11-30 17:42:59 25 4
gpt4 key购买 nike

我正在研究流套接字,

根据 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。

以下是结果异常对象:

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

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

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

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

还有其他方法可以得到想要的结果吗?

最佳答案

你得到一个 AggregateException 因为它是从 async 方法生成的

所以是的,你必须检查 InnerExceptionHResult

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

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

关于c# - 流套接字错误处理 winRT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31513254/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com