首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

st_asio_wrapper应用FAQ

2012-11-23 
st_asio_wrapper使用FAQQ:服务端(st_curve)和客户端(st_client)都有个函数set_server_addr,有何区别?A:典

st_asio_wrapper使用FAQ
Q:服务端(st_curve)和客户端(st_client)都有个函数set_server_addr,有何区别?
A:典型的网络编程基本知识,服务端设置的是监听地址,客户端设置的是连接地址,举例如下:
假设服务端IP是192.168.0.1,客户端IP是192.168.0.2,则设置地址的时候,服务端指定IP无意义,只有在多IP系统才有意义,所以服务端调用set_server_addr(5050),其中5050是端口号,那么服务端就开始在192.168.0.1:5050上监听;客户端调用set_server_addr(5050, "192.168.0.1"),其中的地址指的是服务端的监听地址。当连接建立起来的时候,会得到两个socket对象,客户端是st_socket,服务端是st_server::server_socket,每个socket对象会有一个本地地址和远程地址,服务端socket的本地地址是192.168.0.1+随机端口1,服务端socket的远程地址是192.168.0.2+随机端口2;客服端socket的本地地址是192.168.0.2+随机端口2,客户端socket的远程地址是192.168.0.1+随机端口1,刚好调换了一下。
这个问题并不是st_asio_wrapper特有的,属于网络编程基础知道。

Q:如何不让st_connector重连接?
A:重连接分两种情况,首次连接和断线之后的连接,st_asio_wrapper做一样的处理,如果你想控制连接的次数(所谓次数是连接失败之后,再重试的次数,包括第一次,连接成功之后复位),需要定义RE_CONNECT_CONTROL宏,定义之后,st_connector会多出来一个函数——set_re_connect_times,你可以用它在运行时设置重连接次数,
设置为0即不重连接,注意,首次连接也用这个记数器。
另外,如果你重写了on_recv_error,并且没有调用父类的同名函数,也没有调用st_connector::restart函数的话,则也不会重新连接服务器(这种情况专指断线之后的重连)。

Q:什么是service,为什么有些时候service会自动退出?
A:从st_server、st_client、st_test_client继承得到的对象都是service对象,他们负责所能网络事件的调度,还有比如定时器之类。当service没有事可做的时候,就自动退出了,之前的st_asio_wrapper本来不会有service退出的情况,但最近由于添加了重连次数功能,所以客户端有可能会自动退出service(当设定的次数到达后,依然没连上服务器)。由于service退出之后不可再重新启动,只能重新创建一个serivce对象再start_service,那么如何防止客户端service自动退出呢,boost.asio有个类专门实现这种需求,但st_asio_wrapper没有使用这种方式,你可以开启一个定时器来让服务永远不退出(除非显示调用stop_service),记得在on_timer里面返回true,以继续定时器。

Q:为什么没有连接失败的事件?
A:在收到on_connect之前,都是连接失败的状态,不需要事件。

Q:接口被重写了,还需要调用父类的同名函数吗?
A:这个要看函数的具体功能,比如初始化之类的虚函数,重写之后,在最后一定要调用父类的同名函数,如果你不需要父类的逻辑(或者父类根本没有逻辑,比如on_msg_send),或者你的逻辑已经包括了父类的逻辑,则可以不调用父类的同名函数。
注意,on_timer里面一定要记得调用父类的同名函数,否则父类得不到定时事件(父类有自己的保留定时器ID,具体保留了哪些请参看st_asio_wrapper_timer.h)。


Q:如果不让st_asio_wrapper不输出到控制台?
A:定义NO_UNIFIED_OUT,则st_asio_wrapper里面所有输出就失效了(demo里面不会失败,因为是直接使用的crt函数)。

Q:st_asio_wrapper的类继承层次是怎样的?
A:箭头代表派生:

st_timer->st_socket->st_connector->st_client
st_timer->st_server
st_timer->st_socket->st_server::server_socket
st_test_client
st_timer->st_socket->st_connector->st_test_client::test_socket

其中,server_socket和test_socket是st_server和st_test_client的内部类。
其中,st_server、st_client、st_test_client是service对象。

boost.asio包装类st_asio_wrapper开发教程(一)


热点排行