罗剑锋的 C++ 实战笔记
罗剑锋
前奇虎 360 技术专家,Nginx/OpenResty 开源项目贡献者
34779 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 32 讲
结束语 (1讲)
罗剑锋的 C++ 实战笔记
15
15
1.0x
00:00/00:00
登录|注册

16 | 网络通信:我不想写原生Socket

你好,我是 Chrono。
在上一节课,我讲了 JSON、MessagePack 和 ProtoBuffer 这三种数据交换格式。现在,我们手里有了这些跨语言、跨平台的通用数据,该怎么与外部通信交换呢?
你肯定首先想到的就是 Socket 网络编程,使用 TCP/IP 协议栈收发数据,这样不仅可以在本地的进程间通信,也可以在主机、机房之间异地通信。
大方向上这是没错的,但你也肯定知道,原生的 Socket API 非常底层,要考虑很多细节,比如 TIME_WAIT、CLOSE_WAIT、REUSEADDR 等,如果再加上异步就更复杂了。
虽然你可能看过、学过不少这方面的资料,对如何处理这些问题“胸有成竹”,但无论如何,像 Socket 建连 / 断连、协议格式解析、网络参数调整等,都要自己动手做,想要“凭空”写出一个健壮可靠的网络应用程序还是相当麻烦的。
所以,今天我就来谈谈 C++ 里的几个好用的网络通信库:libcurl、cpr 和 ZMQ,让你摆脱使用原生 Socket 编程的烦恼。

libcurl:高可移植、功能丰富的通信库

第一个要说的库是 libcurl,它来源于著名的curl 项目,也是 curl 的底层核心。
libcurl 经过了多年的开发和实际项目的验证,非常稳定可靠,拥有上百万的用户,其中不乏 Apple、Facebook、Google、Netflix 等大公司。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《罗剑锋的 C++ 实战笔记》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(43)

  • 最新
  • 精选
  • 屈肖东
    老师什么时候可以推荐几个值得读的比较通用的开源代码,因为很多开源代码虽然很好,但是太过复杂庞大,很难阅读。或者写一篇针对如何更好的阅读源码的文章。毕竟读代码应该是学习写代码最好的方式

    作者回复: C++开源库很多都比较大、比较复杂,找合适学习的还真不是件容易的事情。 我觉得比较好的开始方式是看课程里推荐的这几个库,都不是特别大,功能比较单一,比较容易聚焦学习点。 看的时候可以先从代码风格看起,再熟悉C++关键字的用法,再到整体架构、接口设计。不能心急,不要想着几天或者一个月就能看完。而且也没必要完全看懂,只要能从中学到一两个点就可以说是值得了。

    20
  • 赖阿甘
    说实在在看文章之前,我还不知道ZMQ这个网络通信库,哈哈。老师怎么没提到libevent、libev、asio、muduo等网络通信库,是否这些库的接口比较原始,不好用,还望解答

    作者回复: 你说的很对,这些库用起来比较复杂,一时半会说不清楚,光里面的epoll、多线程机制就要解释半天,要用起来更是要很多步骤。 我的想法还是让大家尽量快速上手,能用起来最重要。

    3
    15
  • 编程国学
    军工行业,用户强调实时,一般采用udp,目前我们采用qt 自己的库,有没有好的建议

    作者回复: qt我没用过,不好评价,我觉得可以试试zmq,它的性能也很不错。

    4
    7
  • Seven
    我也知道别人的东西好,但是老师也用,会不会这样的依赖,而让我们进步缓慢,怎么看这个问题。如何破?

    作者回复: 我觉得这个要从两方面去看,一个是要知道底层的运行原理,是基本功,另一个是要快速高效地开发出稳定可靠的应用。 这两者并不矛盾,可以齐头并行,一个是学习自身修炼,一个是工作的要求,而且两者也可以互相促进。 我们不自己造轮子,但要懂造轮子的原理,必要的时候能够自己造。

    6
  • robonix
    疑惑同楼上~ ASIO 据说要加到c++ 20了,应该介绍呀?

    作者回复: asio推迟到了C++23,而且从它的前身boost.asio来看,用起来也是很复杂的,里面的概念很多,不好一下子说清楚,以后如果有机会可以专门写一篇。

    5
  • 请教罗老师,如何看待Go语言在网络编程上的发展势头~

    作者回复: go了解的不多,但它后面有Google撑腰,所以发展的势头比较好,而且也有了很多成功的应用,今后应该还会继续保持这个势头吧。 不过我还是喜欢C++。

    3
  • Stephen
    确实感觉nanomsg更新的很慢,而且资料,影响力都不如zeromq.请教老师一个事情,如果想要学习这一块,是选择ZMQ还是nanomsg呢,我最近在看zmq作者写的一本书《ZeroMQ:云时代极速消息通信库》.但同事说,zmq已经过时了,应该学习nanomsg,给我搞的很无语,老师怎么看?

    作者回复: nanomsg很早就停止维护了吧,反而zmq一直在更新。不建议用nanomsg了,zmq有文档,有社区,这个技术支持是最重要的。

    2
    2
  • ryan
    老师好,最近项目中用到了Windows平台的libcurl,https通信的时候一般通过系统的证书验证服务器的证书,有两种编译方式:一种是支持win sspi的,这种情况编译的libcurl不用手动加载系统证书就可以发起https请求,但是不同的Windows系统上可能运行不了一样的程序;另一种是编译支持openssl的版本,但是Windows平台openssl有点特殊,要手动指定ca证书文件。我目前用的是后者,有个疑惑:curl根证书可以从官网手动下载,但是如何预防证书过期呢?证书过期了就访问不了https了吧,一般在项目中我们如何处理根证书的过期问题?谢谢!

    作者回复: 我想应该可以调用openssl接口解析证书,再检查它的有效期吧。

    归属地:广东
    1
  • 忧天小鸡
    有流媒体udp特别适合的库吗?刚接触c++,对编译什么的还不熟

    作者回复: C++的库太多了,可以在GitHub上搜一下awesome C++之类的。

    1
  • henry
    请问下罗老师,ZMQ的pub/sub, push/pull模式和redis相比有哪些优势? 如果多个进程之间要 pub,push 不同的业务类型数据,需要在一些进程中开多个端口,管理上有点麻烦,如果加一个Broker的中间层,又有点类似redis用法的意思

    作者回复: zmq和redis的差距很大,用途也不同。 zmq的主要目的是为了高效地传输数据,消息不丢失,支持超大消息,而redis是内存存储,虽然有的模式比较像,但对应的业务场景是不同的。 具体怎么用还是要看实际情况,一般要求不高用redis简单,zmq用在高流量的时候。

    1
收起评论
显示
设置
留言
43
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部