加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

C/C++编程的网络库

(2022-03-31 15:57:39)

网络通信是一个复杂的功能,也是 C/C++ 编程的重点难点,在实际开发中往往会使用一些网络库,而不是手撸 socket/epoll/IOCP 代码。

使用 C/C++ 开发的第三方网络库众多,它们各有优缺点,本文仅仅推荐一些常用的。

ACE

ACE 是一款开源、免费、不依赖第三方库、跨平台的通信框架。

ACE 是现代面向对象网络编程的鼻祖,确立了许多重要模式,如 Reactor、Acceptor 等,重要到我们甚至觉得网络编程就应该是那样的。

不过,ACE 是一个大型的中间件产品,代码 20W 行左右,过于宏大,一堆的设计模式,架构了一层又一层,使用的时候,要根据情况,看你从哪一层来进行使用。

也就是说,ACE 是一个重量级的大家伙,它庞大而复杂,通常用于大型项目,一般不建议选择。

不少人认为 ACE 很难使用,非常容易出错,所以对程序员要求较高,

和 ACE 相比,下面推荐的几个网络库更加轻量级。

Asio

Asio 是 Boost 库的内置模块,用于网络通信和底层 I/O 编程。

Boost 库由 C++ 标准委员会发起,可以认为是除 C++ 标准库之外的另一个功能强大的官方库。

Boost 作为标准库的后备,是 C++ 标准化进程的发动机之一,其中有些内容有望成为下一代 C++ 标准库内容。目前的 C++ 标准库,有不少代码都是从 Boost 中“扣”出来的。

Boost 库为我们带来了最新、最酷、最实用的技术,是不折不扣的“准”标准库。

C++11 以后,Asio 已经能够单独编译了,可以脱离 Boost 库而使用了。

高效网络 I/O 在 Linux 上是 epoll,在 Windows 上是 IOCP,两者设计思想有很大不同,而 Boost 是跨平台库,所以要统一两者。

asio 大概是在 epoll 的基础上用 IOCP 的思想先垫了一层,然后封装为统一接口,所以在 Linux 上会损失一部分性能,这招来了不少人的吐槽,认为使用 asio 不如手撸 epoll。

但是,asio 集成了很多特性,使用更加方便,如果想自己手撸 epoll 实现类似的功能,肯定要封装很多类和函数,这样一来性能也会有所下降。

Libevent/libev/Libuv

这三个库都是使用C语言实现的异步事件库,其中:

  • Libevent 是一个跨平台的异步事件库,名气最大,应用最广泛,历史最悠久。

  • 相比 Libevent 而言,libev 设计更简练,性能更好,但对 Windows 支持不够友好。

  • Libuv 是 node.js 开发过程中的一个副产品,也是跨平台的。Node.js 首选了 libev,但又要支持 Windows,所以重新封装了一套,linux 下用 libev 实现,Windows 下用 IOCP 实现。


相比 ACE 和 Asio,这三个库推出较晚,设计思想较新,通常认为使用起来更加方便。

在 GitHub 上,Libuv 的影响力最大,其次是 Libevent,而 libev 的关注人数较少,这大概是由于 Node.js 光环使然吧。

但是在实际开发中,Libevent 使用最普遍,这大概是因为 Libevent 出现较早,首先抢夺了市场的吧。

Libevent 最先出现,它把复杂问题简单化,让异步网络编程返璞归真,确实是一个不错的网络库。但是 Libevent 也有一些缺陷,比如使用全局变量、定时器无法处理时间跳变等。

为了克服 Libevent 的缺陷,libev 就诞生了。但是遗憾的是,libev 却不支持 Windows 下的 IOCP。

为了给 libev 擦屁股,Libuv 又诞生了。Libuv 可以说是C语言异步事件库的巅峰之作了,完全触摸到了C语言自身的瓶颈。

But,Libuv 仍然有缺点,它是为 node.js 定向开发的,普遍适应性不好,且事件触发不可设定优先级。

WebSocket++

WebSocket++ 是一个跨平台的、高性能的、基于 C++ 的 WebSocket 库,它实现了 WebSocket 协议。

WebSocket++ 非常灵活,也非常轻量,既可以用在服务器端,也可以用在客户端。

libcurl

libcurl 是一个免费开源的、适用于客户端程序的 C++ 网络库,支持 HTTP、HPPTS、FTP、FTPS、IMAP、IMAPS、POP3、POP3S 等多种通信协议。

libcurl 也支持多种数据上传模式,包括 HTTP POST、HTTP PUT、FTP 上传、基于 HTTP 的表单上传等。

总结

对于服务器端的网络编程,目前是 Asio、Libevent、liev、Libuv 四足鼎立的局面,它们各有优点,又各有缺点,读者请根据实际情况选择。

而客户端的网络编程往往比较简单,能做到上传和下载数据即可,不会涉及服务器端的高并发和大容量,所以推荐一些非常轻量级的网络库,比如本文的 libcurl 或者 WebSocket++。

当然,如果你的项目中使用了某个内置网络模块的库/框架,那么你也可以使用这些内置模块,比如 Boost 中的 Asio 模块、Qt 中的 Network 模块。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有