
C++
C++常用的网络库都不怎么好用。它们或许有着很强的性能,可对使用者来说,心理负担却极重。先讲讲libevent和libev吧。这两个程序库实际上是C库,而非
C++库。并且它们仅仅是对事件循环做了跨平台的包装处理,并非完整的网络库。这意味着它们虽然提供了跨平台的select(),但却没有跨平台的recv()和send()。要是想接收和发送网络数据包,就还得自行调用与平台相关的函数。这样的程序库,你觉得能放到标准库中去使用吗?再来说说boost::asio,它的使用格外复杂。出于性能和高并发的考量,boost::asio没有采用多线程的网络编程方式。容易理解的阻塞式接收和发送方式不存在了,取而代之的是,你告知asio想要进行读写操作,等数据到来后,asio就会通过回调函数将数据传送给你的代码。不过数据是否完整就得你自己去判断了。写入数据时,也要等asio通知你的代码缓冲区可以写入了才能写入,而且一次只能写一半,要等下一次回调才能写另外一部分。上面的话不好理解吧?没关系,我写的时候也觉得很绕。
C++的网络编程就是这样。Qt的网络编程也大体如此。而且由于QtNetwork采用的是比较少见的signal/slot模式,一般人用QtNetwork进行网络编程时会感觉更糟糕。最近
C++的网络编程终于有了好的转变,那就是
C++20已经支持协程了。也许以后
C++的网络编程能像Go和
Python那样简单,但目前还不行。到时候协程化的boost::asio或许会被纳入标准库吧。不过其他
C++的网络编程库也可能有希望。我是qtng的作者,我提供的网络编程库是以QtCore为基础开发的,目前我们
公司已经将其用于生产环境了。大家可以去了解一下。我自己没什么时间了,希望有人能从中获得一些灵感,给不太理想的
C++网络编程带来一丝清爽吧。
https://github.com/hgoldfish/qtnetworkng/blob/master/README.HANS.md