1

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

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

正确的?

这两者之间的错误代码数量非常不同。此外,WSAGetLastError() 返回最后一个失败的 Windows Sockets 操作的错误状态,其中 SocketError.GetStatus(hresult) 需要一个 hresult 作为输入,可能来自特定尝试操作的异常处理。这将需要进行大量重构才能进行此更改,因此我想确保在开始工作之前我已经正确完成了它。

最后,是否有人可以参考我的文档来定义我正在寻找的映射?

4

2 回答 2

1

WinRT 不支持 Winsock。

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

用 Winsock 重建了我的应用程序,并且可以确认它可以工作。

于 2015-09-02T12:36:30.880 回答
0

会阻塞的 WinRT C++/CX 套接字调用都是异步的,因此它们不会立即返回结果代码。当出现问题时,异步任务将抛出异常,并将异常编组到等待它的任务。假设您使用的是Microsoft 的任务库 (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 之外,它们总是只打印出错误消息的字符串版本例外。

于 2013-07-16T02:59:01.817 回答