首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++中的跨平台网络代码?

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

Stack Overflow用户
提问于 2011-12-05 17:27:35
回答 5查看 2.7K关注 0票数 3

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

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

是C++完成这项任务的最佳语言吗?标准库在两个平台上都是相同的吗?我知道我将不得不使用微软的VisualC++库,因为似乎很难利用来自C#的C++代码;这是真的吗?

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-12-05 18:10:07

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

至于C++是否是正确的语言,则是比较主观的。我个人的感觉是,如果你需要问,不同意,这不是最好的方法。

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

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

避免C++的原因是:

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

你可能考虑的替代办法包括:

  • Python..。直接使用低级别套接字支持或高级扭曲库。快速开发使用方便的高级成语和最小的移植努力。最大的缺点是不支持为高吞吐量系统开发多个处理器核。
  • Ruby(套接字)/Perl(IO::Socket)高级语言,如果所传递的信息表示为文本字符串,则这种语言可能特别适合。
  • 爪哇..。垃圾收集简化了内存管理;现有库的范围很广。
  • 语言(C#等)还有垃圾收集-像爪哇.WCF是一个有效的框架,可以在其中开发定制协议。这可能证明是有用的。

您还问:“我知道我将不得不使用微软的VisualC++库,因为似乎很难利用来自C#的C++代码;这是真的吗?”

您可以完全避免VisualC++库--要么使用C++以外的语言进行开发,要么使用备用C++编译器--例如Cygwin或MinGW提供G++.不过,我建议使用VisualC++为Windows构建C和C++代码。

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

票数 5
EN

Stack Overflow用户

发布于 2011-12-05 18:09:27

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

票数 3
EN

Stack Overflow用户

发布于 2011-12-05 17:33:54

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

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

我强烈建议您使用boost asio (和一般的boost库)来建立网络,它使用了非常高效的proactor设计模式。然而,这确实需要一些时间,让你的头绕过它。

asio.html

坚持使用标准库和boost,在大多数情况下,跨平台问题并不是主要关注的问题。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8389310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档