st_asio_wrapper使用FAQ(2019.10.17更新)

Q:tcp服务端(server_base)和tcp客户端(client_socket_base)都有个函数set_server_addr,有何区别?

A:典型的网络编程基本知识,服务端设置的是监听地址,客户端设置的是连接地址,这个问题并不是st_asio_wrapper特有的,属于网络编程基础知识。

Q:如何不让client_socket_base重连接?

A:重连接分两种情况,首次连接和断线之后的连接,st_asio_wrapper做一样的处理。当连接失败,或者连接断开之后,client_socket_base会回调prepare_reconnect虚函数,期望得到一个单位为毫秒的整数值,如果这个值大于等于0,则在相应毫秒数之后,开始重连接,如果小于0,则不再重连接。
另外,如果你重写了on_recv_error,并且没有调用父类的同名函数,则也不会重新连接服务器(这种情况专指断线之后的重连)。

Q:什么是service,为什么有些时候service会自动退出?

A:从i_service继承得到的对象都是service对象,他们负责所有网络事件的调度,还有比如定时器之类。当service没有事可做的时候,就自动退出了(这是asio的设计),之前的st_asio_wrapper本来不会有service退出的情况,但最近由于添加了重连次数功能,所以客户端有可能会自动退出service(使用者放弃重连接)。那么如何防止客户端service自动退出呢,答案是定义ST_ASIO_AVOID_AUTO_STOP_SERVICE宏。

Q:为什么没有连接失败的事件?

A:在收到on_connect回调之前,都是连接失败的状态,不需要事件;如果已经成功的连接断开了,则会收到on_recv_error回调。

Q:接口被重写了,还需要调用父类的同名函数吗?

A:这个要看函数的具体功能,比如初始化之类的虚函数,重写之后,在最后一定要调用父类的同名函数,如果你不需要父类的逻辑(或者父类根本没有逻辑,比如on_msg_send),或者你的逻辑已经包括了父类的逻辑,则可以不调用父类的同名函数。

Q:如何不让st_asio_wrapper输出到控制台?

A:定义ST_ASIO_NO_UNIFIED_OUT,则st_asio_wrapper里面所有输出就失效了(demo里面的输出不会失败,因为是直接使用的crt函数,比如printf)。

Q:st_asio_wrapper的类继承层次是怎样的?

Q:st_asio_wrapper主要业务时序图?

客户端连接时序图

服务端接受连接时序图

消息接收并处理时序图,不使用消息缓存(客户端和服务端完全一样)

消息接收并处理时序图,使用消息缓存(客户端和服务端完全一样)

消息发送时序图(客户端和服务端完全一样,图片有点小错误,send_msg之后只是post一个消息给service_pump,然后在异步回调里面调用async_write)

Q:如何防止端口重用?

A:定义ST_ASIO_NOT_REUSE_ADDRESS宏。

 

Q:下载地址在哪里?

git:https://github.com/youngwolf-project/st_asio_wrapper/,ascs在与st_asio_wrapper同级目录里面,另外,我的资源里面也有下载,但不是最新的。
QQ交流群:198941541,这里面有每个版本的压缩包,全是最新的。

 

Q:在linux下如何编译demo?

release 版本是make;
debug版本是make debug。

 

 

C/S框架 st_asio_wrapper 开发教程(五)

st_asio_wrapper是一组类库,功能是对boost.asio的包装(调试环境:boost-1.51.0),目的是简化boost.asio开发; 其特点是效率高、跨平台、完全异步(当然这是从boost.asio继承而来)、自动重连,数据透明传输,自动解决分包粘包问题(你可以像udp一样使用它); 注:只支持tcp协议; 教程:http://blog.csdn.net/yang79tao/article/details/7724514 2.3版更新内容: 消息(std::string包装)不再用boost::shared_ptr包装,之前有过度使用智能指针之嫌。效率上,std::string如果支持引用记数,或者编译器支持std::move语义,是没有损失的(因为也不存在内存的拷贝,反而省了智能指针使用上的开销),幸好vc支持std::move语义(虽然它不支持引用记数,linux则都支持)。这样带来一个问题,原来所有的接口中的boost::shared_ptr<std::string>数据类型,全部换成了std::string引用,升级到2.3的朋友要注意修改之前重写虚函数的签名,如果不改,则重写肯定不生效,变成了新增加虚函数了(因为签名不一样)。这样向大家道歉,接口签名以后应该不会变化了,但可能增加接口; 修复使用std::advance的一个BUG,此BUG在linux下不存在,这里顺便向大家说一下,std::advance在vc和gcc下面,语义一样,但处理方式有些不同,一定要注意; 增加了个专门用于服务端压力测试的客户端框架st_test_client,并写了一个demo test_client,可以在performance_test目录下面找到; 把连接服务端逻辑从st_client剥离出来,定义了一个新的类st_connector,st_client和st_test_client将从它继承; 增加对vc2010的支持,和编译时对编译器版本的检测,如果达不到vc2010及其以上的版本,st_asio_wrapper将直接报错。
st_asio_wrapper是一组类,功能是对boost.asio的包装(调试环境:boost-1.51.0),目的是简化boost.asio开发; 其特点是效率高、跨平台、完全异步,当然这是从boost.asio继承而来; 自动重连,数据透明传输,自动解决分包粘包问题(你可以像udp一样使用它); 注:只支持tcp协议; 教程:http://blog.csdn.net/yang79tao/article/details/7724514 1.1版更新内容: 增加了自定义数据模式的支持,可用于st_asio_wrapper server与其它客户端的通信、或者st_asio_wrapper client与其它服务端的通信;当然,两端都是st_asio_wrapper的话,就用透明传输即可(1.0版已经支持了)。 1.2版更新内容: 修复BUG:当stop_service之后,再start_service时,client_base内部某些成员变量可能没有得到复位; 服务端增加修改监听地址功能,当然仍然要在start_service之前调用set_server_addr函数。 1.3版更新内容: 增加自定义消息格式的发送,这个本来是在1.1版本实现的,结果我漏掉了,只实现了自定义消息格式的接收。 1.4版更新内容: 将打包与解包器从client_base分离出来,以简化这个日益复杂的基类; 可以在运行时修改打包解包器。 1.5版更新内容: 增加ipv6支持,默认是ipv4,服务端和客户端都通过设置一个ipv6的地址来开启这个功能; 增加了一些服务端helper函数,小改了一下客户端set_server_addr函数签名(调换了两个参数的位置以保持和服务端一样)。 1.6版更新内容: 增加了接收消息缓存(改动较大,on_msg的语义有所变化,请看开发教程第三篇)。 1.7版更新内容: 修复vc2010下编译错误; 修复默认解包器BUG(同时修改解包器接口); 修复log输出BUG; 更好的包装了服务端类库,现在服务端可以像客户端一样简单的使用了(完全不用继承或者重写虚函数,申请一个对象即可); 结构大调整,类名大调整,请参看开发教程第一篇。 1.8版更新内容: 增加健壮性和稳定性; 退出服务更新优雅。 1.9版更新内容: 提高代码通用性; 可以指定服务端同时投递多少个async_accept; 修复BUG,此BUG可能造成数据发送不完全。 2.0版更新内容: 服务端增加对象池功能; 优化美化代码; 更规范化接口签名。 2.1版更新内容: 修复BUG,此BUG会造成st_client在stop_service之后,仍然可能尝试重新连接服务器; 在消息发送的时候,增加了一个参数can_overflow,用于确定是否在缓存满的时候返回失败,这在某些不能阻塞等待直到缓存可用的场合非常有用,比如on_msg; 当消息接收缓存满的时候,st_socket现在可以保证消息不丢失,之前的行为是调用on_recv_buffer_oveflow之后,丢弃消息; 更规范化接口签名; 更多更新请看st_asio_wrapper_socket.h,所有更新都会罗列在这个头文件的开头处,另外st_asio_wrapper_server.h的开头部分注释也很重要,有工作原理相关的说明。
评论 47
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值