Winsock -> WinRT Windows.Networking.Sockets -- 映射错误代码

Winsock -> WinRT Windows.Networking.Sockets -- mapping error codes

本文关键字:Sockets Networking 映射 错误代码 Windows WinRT gt Winsock      更新时间:2023-10-16

我正在将C++库移植到WinRT。它使用Winsock。WinRT不支持Winsock。Microsoft指示您改用Windows.Networking.Sockets。我在尝试将Winsock API映射到Windows.Networking.Sockets API时遇到了一些问题。我在托管代码中使用过套接字,但在C++中没有。我不熟悉Winsock API。

我相信我会遇到其他问题,但首先,我需要确定获取套接字错误代码的正确方法。我认为这是正确的映射:WSAGetLastError()==SocketError.GetStatus(hresult)

正确吗?

  • 此文档详细说明了使用winsock时可能出现的错误代码:
    Windows套接字错误代码
  • 此文档详细介绍了一个枚举,我认为它是等效的,但非常不同:
    SocketErrorStatus枚举

这两个错误代码的数量非常不同。此外,WSAGetLastError()返回上一个失败的Windows套接字操作的错误状态,其中SocketError.GetStatus(hresult)需要一个hresult作为输入,可能来自特定尝试操作的异常处理。这需要进行大量的重构才能做出更改,所以我想在做这项工作之前确保我做对了。

最后,有没有一份文件可以让我参考,它定义了我正在寻找的映射?

WinRT不支持Winsock。

截至2014年10月。https://blogs.windows.com/buildingapps/2014/10/13/winsock-and-more-open-source-for-your-windows-store-apps/

已经用Winsock重建了我端的应用程序,并可以确认它是否有效。

将被阻止的WinRT C++/CX套接字调用都是异步的,因此它们不会立即返回结果代码。当出现问题时,异步任务将抛出一个异常,异常将被整理到等待它的任务中。假设你使用的是微软的任务库(ppltasks.h),将套接字连接到远程接口的代码将如下所示:

StreamSocket^ socket = ref new StreamSocket();
// Assume portStr and hostName are defined elsewhere
String ^portStr;
HostName^ hostName;
task<void>(_connectSocket->ConnectAsync(hostName, portStr)).then([this] (task<void> previousTask)
{
    try
    {
        previousTask.get();
    }
    catch (Exception^ exception)
    {
        // If ConnectAsync gets an error, this is where you can catch it
        SocketErrorStatus status = SocketError.GetStatus(exception->HResult);
        // Do something interesting with HResult
    }
});

Microsoft的StreamSocket示例中有进行标准套接字调用的示例,也有他们期望如何调用接口的示例,包括错误处理,只是他们总是在异常中打印出错误消息的字符串版本,而不是查看HResult。