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

时间:2013-07-15 22:16:56

标签: c++ windows-runtime winsock

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

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

正确?

这两者之间的错误代码数量差别很大。此外,WSAGetLastError()返回失败的最后一个Windows套接字操作的错误状态,其中SocketError.GetStatus(hresult)需要一个hresult作为输入,可能来自特定尝试操作的异常处理。这需要进行大量的重构来进行此更改,所以我想确保在完成工作之前就已经完成了。

最后,是否有人可以引用我的文件来定义我正在寻找的映射?

2 个答案:

答案 0 :(得分:1)

  

WinRT不支持Winsock。

截至10月和14日,它是。 https://blogs.windows.com/buildingapps/2014/10/13/winsock-and-more-open-source-for-your-windows-store-apps/

使用Winsock在我的最后重建了应用程序并确认它有效。

答案 1 :(得分:0)

将阻止的WinRT C ++ / CX套接字调用都是异步的,因此它们不会立即返回结果代码。当出现问题时,异步任务将抛出异常,异常将被编组到等待它的任务。假设您正在使用Microsoft's task library (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's StreamSocket example有一些例子,说明标准套接字调用有关于如何调用接口的示例,包括错误处理,除了不是查看HResult,它们总是打印出字符串版本的异常中的错误消息。