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

时间:2011-12-05 17:27:36

标签: c++ windows macos networking cross-platform

我正在开发一个新的应用程序,虽然我的背景主要是基于Mac / iOS,但我需要使用Windows应用程序来参与他们的Imagine杯。

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

C ++是这项任务的最佳语言吗?两个平台上的标准库是否相同?我知道我必须使用Microsoft的Visual C ++库,因为好像很难利用C#中的C ++代码;这是真的吗?

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

3 个答案:

答案 0 :(得分:4)

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

关于C ++是否是正确的语言是更主观的。我个人的感受是,如果你需要问,赔率,这不是最好的方法。

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

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

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

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

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

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

您还问:“我知道我必须使用Microsoft的Visual C ++库,因为好像很难利用C#中的C ++代码;这是真的吗?”< / p>

您可以完全避免使用Visual C ++库 - 通过使用C ++以外的语言进行开发,或使用备用C ++编译器 - 例如Cygwin或MinGW提供G ++ ...虽然我建议使用Visual C ++来构建C和适用于Windows的C ++代码。

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

答案 1 :(得分:2)

我建议你看看Qt。 IMO Qt是用于跨平台应用程序的最佳C ++库之一。与Boost相比,Qt的好处是Qt甚至还有GUI类。

答案 2 :(得分:1)

最好的语言是非常主观的,但是如果你想要具有有用的抽象和C风格语法的可移植快速代码,那么C ++是一个不错的选择。请注意,如果您不知道任何C ++,那么学习曲线会很陡峭。

ISO标准定义的库在每个平台上的定义都是相同的,但是它的实现可能更少或更符合。也就是说,gcc,clang和MSVC(post .net)都能很好地实现C ++ 98。只要您不使用编译器特定的扩展名。

我强烈建议您查看针对您的网络的boost asio(以及一般的boost库),它使用非常有效的proactor设计模式。然而,它确实需要一些时间来解决它。

http://www.boost.org/doc/libs/1_48_0/doc/html/boost_asio.html

坚持使用标准库并提升并且大多数情况下跨平台问题不是主要问题。

最后,我会避免使用C ++ 11的功能编写跨平台代码,因为MSVC,GCC和Clang都实现了标准的不同部分。