
C++asio服务器开发
asio服务器开发所需的技术
昔拉天使
I wanna the world know my existence.
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
基于photonserver的游戏Demo
以下是个人自学自写的一款MOBA游戏源码,欢迎有兴趣的关注与下载https://github.com/hlslml77/fist/原创 2020-02-04 08:57:33 · 509 阅读 · 0 评论 -
asio编写多线程异步服务器与gdb调试工具的使用
在服务器代码中加入以下方法开启多个线程:std::vector<std::thread> threadGroup;for(int i = 0; i < 5; ++i) { threadGroup.emplace_back([&io_service, i]{ std::cout << i << " name is " << s...原创 2020-01-26 15:16:27 · 912 阅读 · 0 评论 -
作为一名合格C++程序员应该避免的一些坑
以下例子只有父类的析构函数被调用了。子类的析构函数并没有被调用,则产生错误。这一点上,对于原始的指针、类或者std::unique_ptr。其表现是一致的。也符合C++基本的语法。但是对于std::shared_ptr。即便父类析构函数并非虚函数,其子类的析构函数依然可以被调用。对于此种行为的原因尚未查明(待更新)。也许这是std::shared_ptr专门设计的一种特性。但为谨慎起见,我们...原创 2020-01-17 15:29:44 · 573 阅读 · 0 评论 -
ubuntu下使用shell的一些基本命令总结(linux相关)
服务器开发所需的一些基本的shell命令who:现在有哪些用户连到本机sudo apt-get update 系统自检更新sudo apt-get upgrade 更新sudo apt-get dist-upgrade 系统内核更新sudo apt-get install 安装远端程序pwd:打印现在当前的目录ls:列出文件信息可以用*,?,-sail:查看文件硬盘位置 -l 列出详...原创 2020-01-27 14:40:10 · 610 阅读 · 0 评论 -
VIM的一些基本命令总结(linux相关)
VIM的一些基本命令:vim --version:查看vim版本vim:运行vim默认状态下进行normal模式,键盘是输入命令而不是输入文本敲入:vim会认为你要输入特殊命令:e编辑新文件:q退出vim:q!强制退出:set hlsearch显示查找高亮:set number显示文本行号:N 直接去N行:x 必要时存盘,再退出:w test.cpp存盘,后面可以跟文件名...原创 2020-01-27 01:25:13 · 604 阅读 · 1 评论 -
cmake工具在linux平台下面的使用
在windows下用vs编程,在linux下用cmake管理项目用cmake维护makefile文件用得比较多好处:在不同平台下生成对应的makefile文件每次写一遍就行src放主逻辑,utility放辅助功能通过 sudo apt-get install cmake安装cmakelists会把一个目录作为一个整体使用,使用cmake最主要的工作就是维护和编写cmakelists...原创 2020-01-29 14:01:57 · 514 阅读 · 0 评论 -
C++signal捕获中断信号的使用
程序按ctrl+c意味着系统产生了中断信号kill -s INT然后发给程序头文件包含signal.h 但asio.hpp已经包含了退出方式:直接挂在ASIO或在全局处理static std::function<void()> safeQuit;void signalHandler(int sig) { BOOST_LOG_TRIVIAL(info) << ...原创 2020-01-29 00:15:19 · 4727 阅读 · 0 评论 -
C++结合lua的使用
联网部分,CPU密集型,IO密集型用C++写,控制上的普通代码用其他脚本语言可以方便调试,方便响应需求,只需要改动一点点代码C++可复用性并不强C语言用得多,C++挂脚本少,因为C++本身也提供了不少强大的库本身用得就非常顺手在业务需求上频繁更新代码驱动用脚本,C++也能做就比较费劲一般用lua多,lua比较快,比较简单,比较轻量化嵌入脚本一般有两种方式:一是系统真正跑在脚本里二是...原创 2020-01-28 18:36:49 · 1788 阅读 · 0 评论 -
boost日志库的使用
在boost中有自带的日志库供开发人员使用但效率不是最高的:加入头文件#include <boost/log/trivial.hpp>即可引入日志库boost中的log库有以下六种级别:BOOST_LOG_TRIVIAL(trace) << "A trace severity message";BOOST_LOG_TRIVIAL(debug) << "A...原创 2020-01-27 18:45:54 · 2087 阅读 · 0 评论 -
常用的四种设计消息协议方式优劣对比
C结构体:包扩展性太差包长度固定,大小限制,多了少了都不行,数据包太大int不是跨平台通用要用int32_t序列化方式:可以定义非常复杂的结构体限制了服务器客户端都用C++,都用同样的类库数据包大小依然很大json:消息紧凑,极大地优化了包的大小,压缩率非常高可视化好,可以直接打印包的内容protobuf:消息文档化容易理解,可以交给数值策划填写协议包的大小与json相比...原创 2020-01-25 18:44:34 · 508 阅读 · 0 评论 -
使用protobuf设计消息协议(C++asio网络库相关)
protobuf是目前应用最广范的设计消息协议工具,具有以下一些特点:1、proto2只支持python,c++,JAVA,proto3可以支持更多语言2、定义协议以proto作为文件后缀名,在第一行用syntax指定proto版本3、C++使用protobuf官方文档:http://developers.google.com/protocol-buffers/docs/cpptutoria...原创 2020-01-25 12:11:58 · 2255 阅读 · 4 评论 -
使用json设计消息协议(C++asio网络库相关)
用json设计消息协议有以下好处:1、可以让服务器和客户端跨语言传输数据,只要支持json就行2、可读性强缺点:1、因为跨语言太灵活需要字段一一对应沟通好2、因为可读性很好冗余信息太多总体来说还是可以作为客户端和服务器处理消息的,并不是所有客户端都能支持protobuf但基本都能支持json处理json的库很多,在boost中可以用property_tree进行处理以下是用json...原创 2020-01-25 01:02:28 · 874 阅读 · 0 评论 -
超越原始的结构体——序列化c++设计消息协议(C++asio网络库相关)
如果服务器和客户端都是用C++语言写的就可以用序列化方法将数据存放到流或文件中可以用boost自带的serialization::accessarchive可以看成是文件或内存,是内存就可以通过tcp传输到客户端&和<<,>>等价,表示数据写入以下是用boost序列化库写的一个例子://SerilizationObject.cppclass SBindN...原创 2020-01-24 16:26:08 · 656 阅读 · 0 评论 -
用原始时代的C结构设计消息协议(C++asio网络库相关)
pod类型都可以用memcpy进行赋值string的find_first_of返回的不是迭代器是位置,因为实现不是同个时代的产物通过reinterpret_cast将结构体类型转换成char *指针string.assign赋值类似memcpy将结构体按字符串形式放入string类型的outbuffer里...原创 2020-01-24 10:38:48 · 670 阅读 · 0 评论 -
asio聊天室客户端(C++asio网络库相关)
以下ASIO库官方例子:#include “chat_message.h”//client.cpp#include <boost/asio.hpp>#include <deque>#include <iostream>#include <thread>#include <cstdlib>using boost::as...原创 2020-01-23 15:09:41 · 585 阅读 · 0 评论 -
asio聊天室服务器(C++asio网络库相关)
以下是根据asio官方库改写的一个例子://main.cpp#include "chat_message.h"#include <boost/asio.hpp>#include <deque>#include <iostream>#include <list>#include <memory>#include <...原创 2020-01-23 00:49:50 · 1196 阅读 · 0 评论 -
asio编写echo同步客户端(C++asio网络库相关)
asio官方库中的一个例子:#include <cstdlib>#include <cstring>#include <iostream>#include <boost/asio.hpp>using boost::asio::ip::tcp;enum { max_length = 1024 };int main(int argc,...原创 2020-01-22 18:01:33 · 430 阅读 · 0 评论 -
asio编写echo服务器(C++asio网络库相关)
echo服务器:服务器接收客户端消息再原封不动回传给客户端,可以保证服务器完整收到客户端消息包再回传完整信息比如写gameserver的时候首先就需要一个echo知道两端通信是没问题的,还可以改造成一个时间戳的包特点:收到客户端消息长度是不确定的以下是BOOST库中的例子:#include <cstdlib>#include <iostream>#includ...原创 2020-01-22 16:26:40 · 445 阅读 · 0 评论 -
asio编写异步时间服务器(C++asio网络库相关)
enable_shared_from_this:表示在类方法里需要把自己包装成智能指针using pointer = boost::shared_ptr<tcp_connection> 等价于 typedef boost::shared_ptr<tcp_connection> pointer以下两种生成智能指针的写法,第一种return内存分配了两次,第二种有些地方是不...原创 2020-01-22 14:44:34 · 1591 阅读 · 2 评论 -
asio编写同步阻塞时间服务器(对应同步客户端)(C++asio网络库相关)
同步服务器:一次只接收一个客户端,对某些需求已经足够了既简单又不容易出错Ctime函数在多线程编程下是不安全的tcp::acceptor 绑定监听接口(三次握手)最好用ignored_error来接收某一客户端发生的异常而不是直接抛出异常停止服务socket默认析构=服务器主动断开(四次挥手)本系统应用层并不支持指定IP地址的客户端连接,因为在socket已经连接进来了才检查IP地址...原创 2020-01-22 11:24:03 · 1336 阅读 · 0 评论 -
asio编写同步阻塞时间客户端(C++asio网络库相关)
io_service:跟操作系统底层打交道tcp::resolver:调用系统函数解析地址tcp::resolver::query:通过resolver.resolve解析成代码实际能用的地址便于之后生成的socket使用query参数argv[1]表示IP地址执行命令行时传入,后面跟服务名称配置文件放在/etc/services,直接写服务端口号也行/etc/hosts 是IP地址的配置...原创 2020-01-21 22:07:03 · 535 阅读 · 0 评论 -
IO_service在多线程下的使用注册事件和调用事件顺序不能乱(C++asio网络库相关)
多线程编译需要链接lpthread库g++ -02是优化方式printer p 注册事件如果调换thread t和printer p注册事件顺序可能会出现什么都没输出,看操作系统心情。主线程run也不起作用是因为线程是同时执行的,子线程中会改变io的状态表示IO已经无事件了,所以即使后面又注册了新事件主线程也不会run因为状态已经改变了解决方法可以先注册事件执行printer p再r...原创 2020-01-21 18:01:02 · 902 阅读 · 0 评论 -
C++async_wait的使用(C++asio网络库相关)
async_wait传参数调用回调函数通过bind方式绑定,可以用lambda表达式代替本来调用一次print就会失效,可以通过expires_at定义下一次的失效时间来多次执行print需要占一位参数error_code是系统参数async_wait形参只有一个所以需要bind绑定函数和函数参数...原创 2020-01-20 20:44:04 · 7232 阅读 · 0 评论 -
asio网络库同步和异步编程的两个简单例子(C++asio网络库相关)
boost/asio.hpp头文件包括了所需的所有库先定义io_service连接代码和网络底层的桥梁deadline_timer停留时间date_time库主要用于处理具体时间,Chrono时间库用于处理时间段同步调用例子:异步调用例子:callback在run中执行的deadline_timer和async_wait是事件的注册...原创 2020-01-20 15:06:38 · 970 阅读 · 0 评论 -
基于事件驱动的编程模型(C++asio网络库相关)
基于事件驱动的编程模型1、reactor模式:lighttpd,libevent,libev,poco2、Proactor模式:Asio,locprector模式简单一点reactor模式:有一个中心部分处理事件告诉回调通知initiation dispatcher:中心模块,handle_events()调用synchronous event根据返回值知道handle哪些事件已经完成...原创 2020-01-20 11:35:50 · 1228 阅读 · 0 评论 -
boost库中的网络库asio简介(C++asio网络库相关)
BOOST C++第三方库:库大且复杂标准库的备选库绝大多数的库的水准很高(同僚复审)主题丰富string and text processing Containers iterators algorithms…boost里面的网络库asio:是用于网络和低层IO编程的跨平台C++库,为开发者提供了C++环境下稳定的异步模型可移植性Portability可扩展性效率可以像BS...原创 2020-01-20 00:13:27 · 2467 阅读 · 0 评论 -
Windows下原生API用IOCP编写一个简易的服务器模型(C++服务器开发相关)
可以用function来生成一些回调用函数让代码耦合度更小WSAStartup:加载dll动态库以下是简易服务器完整代码://Server.h#ifndef YT_WIN_IOCP_SERVER_H#define YT_WIN_IOCP_SERVER_H#ifndef UNICODE#define UNICODE#endif#define WIN32_LEAN_AND_MEAN...原创 2020-01-15 11:18:35 · 822 阅读 · 0 评论 -
C++thread的使用(C++多线程相关)
thread默认析构函数是调用了abort()让程序中止子线程可以自己管理资源也可以在子线程结束时自动将线程杀死,需要程序员显示指定用的是哪种行为,一般都自己来管理资源由j.join()来结束线程...原创 2020-01-13 22:24:43 · 6075 阅读 · 0 评论 -
C++mutex临界区的使用(C++多线程相关)
临界区可用于解决不同线程不同变量之间的相互读取用头文件mutex引入可以定义为类的成员函数来控制成员变量的增加与减少但完全不推荐,通过lock()和unlock()来保证区间代码只有一个线程运行但是写成成员函数容易用错,代码的可读性大大降低,也有可能上锁之后而忘记解锁造成程序崩溃。所以用mutex有的实现会让程序崩溃,以下是两次调用mutex的情况:即使完全保证一次lock()后...原创 2020-01-13 14:24:08 · 1035 阅读 · 0 评论 -
C++原子操作变量类型的使用和解析(C++多线程相关)
atomic只适用于多个线程操作同个变量时不会出错可以用原子操作变量来让变量能够在多个线程中使用用atomic头文件引入原子操作以下用atomic包裹变量让int变成原子操作可以用aotmic操作变量进行如下操作从而保证变量的原子性:但是当用两个变量两个原子类型数据进行数据操作时还是依然会存在问题当一个程序线程运行完addCount已经切换时下一个程序线程可能在还未执行ad...原创 2020-01-12 20:54:07 · 1852 阅读 · 0 评论 -
C++当线程间需要共享非const资源(问题引出)(C++多线程相关)
可以通过不共享变量的方式来解决多线程共享变量造成信息不一致问题所以如果没有必要的话,线程间不要共享资源线程传入参数可以通过lambda函数传入也可以直接在函数后加参数方式传入,但函数后加参数方式默认都是值拷贝形式传入的,可以用std::ref引用传入但有的时候必须共享非const的资源如以下例子需要通过conter2计算来让循环终止,conster2的计算又是通过多个线程分别计算来获...原创 2020-01-12 16:18:03 · 222 阅读 · 0 评论 -
C++多线程在用共享变量时容易引起并发读取数据错误(C++多线程相关)
当无法确定自己需要开多少线程来运行程序时可以用以下命令查看用于确认自己当前机器开多少线程效率是最高的(仅仅作为参考):直接用lambda函数方式进行线程调用:此时b就可以调用该lambda函数调用线程资源用自定义函数方式+lambda方式进行线程调用:统计数量的时候有可能在单线程下是正确的,在多线程下是错误的以下例子在单线程下是正确的:在多线程分区间进行vector计算时会出问...原创 2020-01-12 12:17:13 · 3431 阅读 · 0 评论 -
C++多线程的一个简单应用(C++多线程相关)
开的线程要放在主线程逻辑前否则并不会利用好主线程资源用join来等待线程结束可以通过mainThreadId = std::this_thread::get_id()来获取主函数ID,通过auto id = s.get_id()来获取子线程ID,判断两个ID来确定自己当前函数是运行在主线程还是分线程:可以用std:this_thread::sleep_for()让线程暂停,头文件引入c...原创 2020-01-12 00:53:59 · 751 阅读 · 0 评论 -
C++多线程特点与缺点(C++多线程相关)
mutithread主要特点:对于一个程序的地址空间是共享的代码段共享,数据不能共享mutithread单核会有线程切换,多核没有仅仅是数据处理就可以不同操作系统接口比较统一用多线程既能快速处理数据又能快速进行计算缺点:代码容易出错,mutithread类似于goto可以能的问题包括:1、死锁 (两个线程相互等待对方释放资源)2、乱序3、并发访问数据造成的问题(问题查错困难)...原创 2020-01-11 14:01:18 · 1392 阅读 · 0 评论 -
C++STLunordered_map unordered_set的使用和解析(c++STL相关)
,以hash table为基础,效率是惊人的,跟容量存储数量无关内部元素没有明显的顺序缺点:1、元素无序2、平均算法是常数,但极端序列元素性能会下降。3、空间可能会不紧凑。4、元素在1千万以下不如unorderd但1千万以上不如二叉树,因为有大量重复的key。equal_to用来判断两个不同的key的hash值是否一样...原创 2020-01-11 10:30:56 · 841 阅读 · 0 评论 -
C++STLmap的使用和特点(C++STL相关)
map是C++98中引入的二叉树数据结构map有四个参数count()和find()函数传入的参数都是key*findIter迭代器返回的是const int如果用以下方法赋值会重新生成pair进行拷贝构造函数赋值由于不是同一个东西,影响效率在map中插入元素需要用make_pairinsert有返回两个参数第一个是迭代器的位置,第二个表示插入是否成功emplace比insert...原创 2020-01-10 22:18:01 · 671 阅读 · 0 评论 -
STLset中存放类时需要注意的地方(c++STL相关)
set使用查找需要小心,可能查到的不是自己所需要的比如:名字是对的,年龄是错的。原创 2020-01-10 20:25:23 · 351 阅读 · 0 评论 -
C++std::set、multiset的使用的特点(c++STL相关)
是C++98中引入的二叉树数据结构有三个参数,compare参数是进行排序的,默认小于multiset可以有两个一样的值如果需要频繁插入删除和查找且有序就用set,效率都是logn元素必须支持严格的弱顺序不能改变元素的值set内部重新分配空间,内存消耗很高,二叉树有左右结点和父结点指针,前驱和后继结点指针要40个字节。low_bound:返回第一个>=可以插入该元素的位置up...原创 2020-01-10 15:54:04 · 466 阅读 · 0 评论 -
C++相关:智能指针的一个陷阱(大家实际中应该避免这个坑)
用weakptr来存大量遍历会有效率问题。有lock会转化成shared_ptr消耗是非常大的原创 2020-01-10 14:18:13 · 543 阅读 · 0 评论 -
STLforward_list的使用(c++STL相关)
forward_list是C++11中引入的单向串列:具有以下特点:具有以下接口(//表示未提供的接口):before_begin()指向是第一个元素前面位置erase_after()删除下一个位置的元素insert_after只能在头部进行插入在指定位置插入元素可以如下写:...原创 2020-01-10 10:55:14 · 283 阅读 · 0 评论