C++ 中的跨平台网络代码?

Mat*_*gan 3 c++ windows macos networking cross-platform

我开始开发一个新的应用程序,虽然我的背景主要是基于 Mac/iOS,但我需要在 Windows 应用程序上工作才能参与他们的 Imagine cup。

这个项目包括客户端之间通过套接字连接(到服务器,而不是临时)的通信,我需要 Mac 和 Windows 客户端能够相互通信。我还希望不必两次编写此网络代码,而只需在两个平台上编写不同的本机 UI 代码。这使得网络更容易(我相信两个不同的平台不会以不同的方式与服务器交互)并允许在两个平台上使用本机 UI。

C++ 是完成这项任务的最佳语言吗?两个平台上的标准库是否相同?我知道我将不得不使用 Microsoft 的 Visual C++ 库,因为从 C# 中使用 C++ 代码似乎很困难;这是真的?

我以前从未真正编写过跨平台应用程序,尤其是处理平台之间网络的应用程序。

aSt*_*eve 5

如果您打算使用 C++,我强烈建议您查看 Boost 中的 ASIO,我在上面的第二个“the_mandrill” - 这是编写一次代码并支持两个平台的好方法。

至于 C++ 是否是正确的语言,则更为主观。我的个人感觉是,如果您需要询问,可能不是最好的方法。

选择C++来实现网络代码的原因是:

  • 可以通过精心设计和实现的代码实现非常低的延迟和高吞吐量。
  • 可以对内存管理进行显式控制 - 避免与垃圾收集相关的性能变化。
  • 在进程中将网络代码与其他本机库紧密集成的潜力。
  • 构建适合在资源受限环境中部署的小组件的潜力。
  • 对 C 套接字 API 的低级访问公开了诸如套接字选项之类的功能,以使用普通 TCP/IP 和 UDP 之外的协议。

避免使用 C++ 的原因是:

  • 与高级语言(例如 Java/C#/Python 等)相比,开发代码的效率较低
  • 出现重大实现错误(指针滥用等)的可能性更大
  • 验证代码在每个平台上编译所需的额外工作。

您可能考虑的替代方案包括:

  • Python...直接使用低级套接字支持或高级 Twisted 库。使用方便的高级习语和最少的移植工作进行快速开发。最大的缺点 - 对为高吞吐量系统开发多个处理器内核的支持不佳。
  • Ruby(socket)/Perl(IO::Socket)... 高级语言,如果将通信信息表示为文本字符串,则可能特别适合。
  • Java...垃圾回收简化了内存管理;广泛的现有图书馆。
  • CLR 语言(C# 等)也可以进行垃圾收集——比如 Java……WCF 是一个有效的框架,可以在其中开发定制协议……这可能会被证明是有用的。

您还问:“我知道我必须使用 Microsoft 的 Visual C++ 库,因为使用 C# 中的 C++ 代码似乎很难;这是真的吗?

您可以完全避免使用 Visual C++ 库——通过使用 C++ 以外的语言进行开发,或者使用替代的 C++ 编译器——例如 Cygwin 或 MinGW 提供 G++...尽管我建议使用 Visual C++ 来构建 C 和 C++ 代码视窗。

使用 C# 中的 C++ 代码并不难 - 尽管我不推荐它作为一种方法......它可能过于复杂。Visual C++ 可以(可选)从 C++ 源代码编译“托管代码”(有一些语法扩展需要掌握,使用 Mono 而不是 Visual C++ 的互操作语法略有不同,但恕我直言,这些不是主要问题。)这些 CLR 对象直接与 C# 对象交互,并且可以毫无问题地链接到一个程序集中。使用 Pinvoke 访问本机 DLL(对于本机体系结构可能使用 C++ 编写)也很容易。然而,所有这些都有些无关紧要,因为 .Net 框架对 system.net 中的低级网络(类似于 Winsock[2] 提供的网络)有很好的支持——这为类似设施提供了一个方便的面向 C# 的接口,