用于 WinRT 网络合理性的 Berkeley Socket 外观?

Posted

技术标签:

【中文标题】用于 WinRT 网络合理性的 Berkeley Socket 外观?【英文标题】:Berkeley Socket facade for WinRT Networking plausibility? 【发布时间】:2012-09-09 14:19:00 【问题描述】:

这是我发送到 ZeroMQ 邮件列表的帖子的副本。然而,问题是它不是特定于 ZeroMQ,而是更普遍地涉及在 WinRT 中提供的网络功能上需要一个“映射”层,以便在针对 WinRT 编译时为 C++ 代码提供更正常的“伯克利套接字外观”:

大家好,我之前在 iPhone 和 android 版本的移动应用程序中使用过 ZeroMQ(请参阅 http://www.ibuzzedfirst.com),因为这些平台支持原生/C++/Socket 开发,因此支持 ZeroMQ。

对于 WindowsPhone 7.5 (OS 7.1) 版本,我必须从头开始重新实现任何所需的 ZeroMQ 功能,因为 WinPhone 7.5 只支持 C#,而不支持 C++(它实际上是一个 C# Silverlight 应用程序)。此外,WinPhone 7.5 仅提供其自己的 Socket 支持“版本”(http://msdn.microsoft.com/en-us/library/sb27wehh%28v=vs.95%29.aspx),仅支持异步版本的功能,例如ConnectAsync、SendAync、ReceiveAsync 等。然而,缺乏 C++ 使得这成为一个争论点。

因此,对于 WindowsPhone 7.5 版本,我仅将应用程序限制为“客户端”(参赛者)功能,并没有实现“服务器”(测验大师)部分。这是因为应用程序的客户端部分只向服务器发送和接收请求、回复和订阅,而服务器利用 ZeroMQ 固有的多线程多用户功能。重新创建 ZeroMQ 传输协议/标头以供客户端使用并使用 WindowsPhone Socket 支持来提供通信是(相对)简单的。

好的,现在我正在考虑将应用程序移植到 Windows 8 上的 WinRT。(首先是桌面/平板电脑版本 - Windows Phone 8 RT SDK 尚未推出,但会类似)。好消息是 WinRT 支持 C++,是的! (实际上,仍然没有那么简单,当只编写 C# WinRT 应用程序时,您可以为“AnyCPU”编译,只要包含 C++ 部分,您就必须构建 3 个不同的版本 - x86/Win32、x64 和ARM 版本,但这是一个不同的问题)。

不幸的是,与 Windows 7/8 Phone 一样,WinRT 不支持“普通”Berkeley Socket 访问,而是提供自己的“版本”Socket 编程,具有用于不同套接字场景的离散类,例如StreamSocket 用于连接的 TCP 客户端 (http://msdn.microsoft.com/en-us/library/windows/apps/windows.networking.sockets.streamsocket.aspx#methods),StreamSocketListener 用于可绑定的 TCP 服务器 (http://msdn.microsoft.com/en-us/library/windows/apps/windows.networking.sockets.streamsocketlistener.aspx#methods),DatagramSocket / DatagramSocketListener 用于 UDP 版本。此外,仅提供所有方法的异步版本。

看起来,为了让 ZeroMQ 在 WinRT 上成功编译,我将不得不编写一个 Facade 层来提供类似 Berkeley Socket 的 C++ 接口,并在下面执行到 Socket 编程版本的必要映射由 WinRT 提供。

有没有其他人开始这个旅程或写过类似的外观?有兴趣听听大家的想法,尤其是 WinRT 看起来很“大”!

【问题讨论】:

我刚刚意识到这是一项更大的工作,因为 ZeroMQ 使用 C 运行时函数 _beginthreadex() 根据需要创建线程。 WinRT 也不支持直接创建和操作线程(msdn.microsoft.com/en-us/library/windows/apps/…msdn.microsoft.com/en-us/library/windows/apps/hh701576.aspx),仅支持 Task.Run() 和 RunAsync() 样式的后台处理。让 ZeroMQ 在 WinRT 中工作并非易事。 嗯,也许线程不是太大的问题,其他人已经看过了,例如blogs.msdn.com/b/shawnhar/archive/2012/03/12/… 将伪创建线程调用填充到 Metro 应用程序中 最后一点 - 以上所有缺乏原生 C/C++ WinSock 的情况都适用于 Windows 8 RT(台式机/平板电脑)。事实证明,仅适用于 Windows 8 Phone RT(Win 8 Phones)- 完全支持 C/C++ WinSock。因此,您可以在 Win PRT 中进行本机 WinSock 调用,但不能在桌面 Win RT 中调用。比 WinRT 更容易开发 WinPho8 网络应用程序! WinRT 中缺乏对 C 库的支持使得为需要系统代码的 C/C++ 代码编写适配器相当令人生畏。您正在有效地为多个系统调用编写适配器。相反的方法是否更可行:将 ZeroMQ 移植到 WinRT? arstechnica 上有这篇文章,它在某种程度上解释了一些事情 (arstechnica.com/features/2012/10/…)。在与不同的同事讨论这个问题时,似乎有人怀疑那篇文章是否完全正确,但它仍然是一本有用的读物​​。所有 I/O 都是异步的,这意味着对所有内容都使用回调。这似乎与 ZeroMQ 和 Berkley 套接字的编程模型相去甚远! 【参考方案1】:

虽然它远非完整或正确并且有很多错误,但我已经在https://winrtsock.codeplex.com 开始了这个项目。到目前为止还没有实现任何监听/接受

【讨论】:

Jeremiah,你的 winrtsock 目前处于什么状态?【参考方案2】:

您可以考虑ACE 之类的东西。它在套接字上提供了更高级别的抽象,并支持较旧的 Windows 嵌入式操作系统,例如 WinCE 等。它是开源的,因此您可以尝试、修改以使其工作并回馈。或者,您可以联系提供支持和承包工作的多个商业组织或人员之一。

【讨论】:

以上是关于用于 WinRT 网络合理性的 Berkeley Socket 外观?的主要内容,如果未能解决你的问题,请参考以下文章

用于 WinRT 的 TFS 2012 构建和 SQLite

WinRT:阻止任务

在DataGrid的WinRT端口中,神秘的“没有足够的配额可用于处理此命令”

ASP.NET vNext 与 WinRT 相比如何?

订阅 MediaCapture RecordLimitationExceeded 以录制音频 (WinRT)

在 Berkeley DB Core 和 Berkeley DB JE 之间进行选择