我正在将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作为输入,可能来自特定尝试操作的异常处理。这需要进行大量的重构来进行此更改,所以我想确保在完成工作之前就已经完成了。
最后,是否有人可以引用我的文件来定义我正在寻找的映射?
答案 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,它们总是打印出字符串版本的异常中的错误消息。