跨平台网络库Cyclone

2023-10-11 06:38
文章标签 网络 跨平台 cyclone

本文主要是介绍跨平台网络库Cyclone,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转自:https://thecodeway.com/blog/?p=1472

非常好用,源码:https://github.com/thejinchao/cyclone

跨平台网络库Cyclone发布

       

       我在畅游工作时,曾经维护一个名为Cyclone的基础库,包括天龙八部在内的大部分端游产品都是使用的这个库,主要是网络通讯、消息包管理,加密等功能,但这个库本身的技术含量很低,网络部分只支持select,没有考虑多线程,代码也很丑陋。由于是关系现金流的核心产品,本着稳定压倒一切的原则,一直不敢动,所以至今畅游仍然还在用着这份十多年前的代码。2015年初的时候,我曾经有一段时间没什么事情,于是打算重新写一个全新的网络库,参考了Nginx、Skynet、Muduo、lwan、libevent的设计之后,有了一些心得,于是开始写新版的cyclone。在离开畅游之前,cyclone已经完成了第一版,并且应用在一个在研的手游项目上,但这个版本并不完善,后来我一直想找时间把cyclone再完善一下,但对于创业狗来说,坐下来写代码简直就是大逆不道的事情,于是一直断断续续的写。直到最近,cyclone终于完成一个比较满意的版本,也算完成了一个心愿。

       这个工程我放在了Github上,cyclone的设计从一开始就是比较清晰的,主要是以下几个特性

非阻塞+多路复用

      这应该是使用最为广泛的一种网络模型,适合大多数应用场景,multiplexing支持select、epoll、kqueue三种api

多线程+event loop机制

      cyclone是按照one loop per thread的思想设计的,线程通过event唤醒,线程之间的通讯通过pipe进行,这种模式可以最大程度上减少线程的空转以及线程之间的临界区。对于网游服务器来说,一种很不好的设计就是不考虑线程的空转成本,大量使用sleep+busy loop,这也是为什么很多情况下,一台网游服务器明明cpu占用很低,但玩家仍然觉得“卡”的原因,因为大量的空转逻辑,导致服务器线程的fps降低,对玩家的消息包的相应时间加长导致的。线程之间的通讯使用无锁队列+pipe机制,也就是把要传输的数据放在无锁队列中,然后通过pipe唤醒相应的目标线程。对于c++多线程程序来说,对象的生命周期管理是一个非常重要的问题,一不小心就会陷入泥潭,所以采用线程之间的消息通讯机制,再配合std::shared_ptr,可以大大降低问题的复杂度。

跨平台

      目前支持Windows、Linux、MacOSX、Android,后面会考虑支持iOS,因为用了很多c++11特性,所以跨平台并不是什么太麻烦的事情,主要的跨平台的差异还是在于EventLoop中针对不同平台的实现,cyclone的EventLoop支持socket,timer,pipe三种唤醒机制,其中pipe的实现在linux和mac上都有原生的支持,在windows上虽然也有pipe,但无法用在select上,所以我用了一对socket来模拟pipe,这个消耗会有些高,所以在windows的生产环境里尽量慎用pipe。timer在mac上使用了kqueue原生机制,linux和Android使用了timerfd,windows上使用了timer-queue + pipe的方式。
      cyclone使用CMake作为编译脚本,以及单元测试程序,如果需要编译单元测试的话,需要安装google test

工具函数

      cyclone的设计思想是宁缺毋滥,尽量保证库的简单,比如消息包的封装,加解密这样的代码是以工具的形式放在库里,我已经把dh-exchange密钥交换和aes加密放在库里,可以实现通讯双方的安全协议,另外adler32可以做简单的crc校验算法,xorshift128做异或加密。

范例

      我提供了几个类似于helloworld的范例,比如echo和chat,另外samples里还有两个很有用的程序,socks5和relay。把这两个程序写出来的目的其实大家都懂得,socks5这个程序实现了简单的Socks5协议代理服务器,配合海外的vps,可以实现科学上网,但在我大天朝,仅仅靠sockes5还不行,因为这个协议本身并不支持消息加密,很容易就会莫名其妙的挂掉,所以我又实现了加密用的relay。原理可以参照云风的这篇文章。其中relay_local是一个n:1的工具,把多个链接收到一个链接中,relay_server是1:n的工具,把链接恢复出来去和真正的目标程序通讯,而relay_local和relay_server之间的协议是通过密钥交换和aes算法加密的,所以非常安全。
      具体操作是,在海外的vps上,运行socks5和relay_server,如下:

      在本地机器上运行relay_local


      然后设定本地浏览器使用127.0.0.1:1984作为socks5代理服务器地址即可,比如Chrome浏览器,加入命令行参数–proxy-server=”SOCKS5://127.0.0.1:1984″,或者使用pac文件设置复杂的代理设置,感兴趣的同学这部分可以研究一下ShadowSocks,ShadowSocks使用的是HTTP代理+加密协议,基本原理和我的是一样的,不过更完善和专业。
      除了n:1和1:n,我还提供了一个1:1的工具relay_pipe。这个程序如同水管中的管件,两端可以是listen和connect两种方式的组合,如同螺栓和螺母一样,这三个工具组合起来,可以实现一些很有趣的功能,比如实现局域网的穿透。举例来说,公司局域网内有一台FTP服务器,如果想在家的时使用,一般情况下可以找MIS的同事开通VPN权限,不过对于临时应急使用的话,完全可以直接用relay组合一个管道,把家里的电脑链接到公司内网的服务器上,前提是有一台公网上的vps服务器。
      首先是在公网vps上运行一个中转pipe,打开两个监听端口2001和2002

      在公司局域网找一台电脑,运行relay_server和relay_pipe

      在家里的电脑上运行relay_local

      然后就可以在家里的电脑上链接127.0.0.1:21使用ftp,如同在公司一样。


这篇关于跨平台网络库Cyclone的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/186238

相关文章

SSID究竟是什么? WiFi网络名称及工作方式解析

《SSID究竟是什么?WiFi网络名称及工作方式解析》SID可以看作是无线网络的名称,类似于有线网络中的网络名称或者路由器的名称,在无线网络中,设备通过SSID来识别和连接到特定的无线网络... 当提到 Wi-Fi 网络时,就避不开「SSID」这个术语。简单来说,SSID 就是 Wi-Fi 网络的名称。比如

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依

poj 3181 网络流,建图。

题意: 农夫约翰为他的牛准备了F种食物和D种饮料。 每头牛都有各自喜欢的食物和饮料,而每种食物和饮料都只能分配给一头牛。 问最多能有多少头牛可以同时得到喜欢的食物和饮料。 解析: 由于要同时得到喜欢的食物和饮料,所以网络流建图的时候要把牛拆点了。 如下建图: s -> 食物 -> 牛1 -> 牛2 -> 饮料 -> t 所以分配一下点: s  =  0, 牛1= 1~

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

poj 3068 有流量限制的最小费用网络流

题意: m条有向边连接了n个仓库,每条边都有一定费用。 将两种危险品从0运到n-1,除了起点和终点外,危险品不能放在一起,也不能走相同的路径。 求最小的费用是多少。 解析: 抽象出一个源点s一个汇点t,源点与0相连,费用为0,容量为2。 汇点与n - 1相连,费用为0,容量为2。 每条边之间也相连,费用为每条边的费用,容量为1。 建图完毕之后,求一条流量为2的最小费用流就行了

poj 2112 网络流+二分

题意: k台挤奶机,c头牛,每台挤奶机可以挤m头牛。 现在给出每只牛到挤奶机的距离矩阵,求最小化牛的最大路程。 解析: 最大值最小化,最小值最大化,用二分来做。 先求出两点之间的最短距离。 然后二分匹配牛到挤奶机的最大路程,匹配中的判断是在这个最大路程下,是否牛的数量达到c只。 如何求牛的数量呢,用网络流来做。 从源点到牛引一条容量为1的边,然后挤奶机到汇点引一条容量为m的边

配置InfiniBand (IB) 和 RDMA over Converged Ethernet (RoCE) 网络

配置InfiniBand (IB) 和 RDMA over Converged Ethernet (RoCE) 网络 服务器端配置 在服务器端,你需要确保安装了必要的驱动程序和软件包,并且正确配置了网络接口。 安装 OFED 首先,安装 Open Fabrics Enterprise Distribution (OFED),它包含了 InfiniBand 所需的驱动程序和库。 sudo

【机器学习】高斯网络的基本概念和应用领域

引言 高斯网络(Gaussian Network)通常指的是一个概率图模型,其中所有的随机变量(或节点)都遵循高斯分布 文章目录 引言一、高斯网络(Gaussian Network)1.1 高斯过程(Gaussian Process)1.2 高斯混合模型(Gaussian Mixture Model)1.3 应用1.4 总结 二、高斯网络的应用2.1 机器学习2.2 统计学2.3