Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中的跨平台网络代码+;?_C++_Windows_Macos_Networking_Cross Platform - Fatal编程技术网

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

C++ C+中的跨平台网络代码+;?,c++,windows,macos,networking,cross-platform,C++,Windows,Macos,Networking,Cross Platform,我正在开始开发一个新的应用程序,虽然我的背景主要是基于Mac/iOS的,但我需要开发一个Windows应用程序来参加他们的Imagine cup 这个项目包括客户端之间通过套接字连接(到服务器,而不是临时)的通信,我需要Mac和Windows客户端能够相互通信。我还希望不必编写两次网络代码,只需在两个平台上编写不同的本机UI代码。这使得联网更容易(我相信两个不同的平台不会以不同的方式与服务器交互),并允许在两个平台上都使用本机UI C++是这个任务的最佳语言吗?两种平台上的标准库是否相同?我

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

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

<强> C++是这个任务的最佳语言吗?两种平台上的标准库是否相同?我明白我必须使用微软的Visual C++库,因为它似乎很难利用C++代码从C++;这是真的吗?


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

< P>最佳语言是非常主观的,但是如果你想用有用的抽象和C风格的语法来移植可移植的快速代码,C++是一个不错的选择。注意如果你不知道任何C++已经有一个陡峭的学习曲线。 根据定义,ISO标准定义的库在每个平台上都是相同的,但是它的实现可能会更不兼容。也就是说,gcc、clang和MSVC(post.net)都很好地实现了C++98。只要不使用特定于编译器的扩展

我强烈建议您在网络中使用boost asio(以及一般的boost库),它使用非常高效的proactor设计模式。然而,这确实需要一些时间才能让你的头脑清醒过来

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


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

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

< P>如果你要用C++,那么我第二个“THE-MangRepe”,强烈推荐你在Apple中查看ASIO,这是一次编写代码并支持两个平台的好方法。 至于C++是否是正确的语言,则更为主观。我个人的感觉是,如果你需要问,这不是最好的方法

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

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

  • 与高级语言(如Java/C#/Python等)相比,开发代码的效率较低
  • 更大的潜在重大实现错误(指针滥用等)
  • 验证每个平台上的代码编译所需的额外工作
<>你可以考虑的备选方案有:

  • 巨蟒。。。直接使用低级套接字支持或高级扭曲库。使用方便的高级习惯用法和最小的移植工作量进行快速开发。最大的缺点-对利用多处理器核心实现高吞吐量系统的支持较差
  • Ruby(套接字)/Perl(IO::套接字)。。。高级语言,如果通信信息表示为文本字符串,则可能特别适合
  • 爪哇。。。垃圾收集简化了内存管理;广泛的现有图书馆
  • CLR语言(C#等)也像Java一样进行垃圾收集。。。WCF是一个可以开发定制协议的有效框架。。。这可能是有用的

你也问:“我知道我必须使用微软的Visual C++库,因为看起来很难利用C++代码从C++中来,这是真的吗?” <>你可以完全避免Visual C++库——或者通过使用C++以外的语言开发,或者使用一个替代的C++编译器——例如CygWin或MIWW提供G+…虽然我建议使用Visual C++来构建Windows的C和C++代码。


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

试试Boost的ASIO:看看这个问题:非常好,谢谢!有什么我要做的吗