asio kcp代码走读
(1)kcp_client_wrap类
a 提供方法接口如下:
send_msg
kcp_client_.send_msg(msg);
stop //等待工作线程退出
set_event_callback
connect //main函数中调用connect进行kcp client的初始化
kcp_client_.connect_async
do_asio_kcp_connect_loop
connect_async
connect_result
b 包含的私有方法:
start_workthread
client_event_callback_func
handle_client_event_callback
do_asio_kcp_connect_loop
while(){kcp_client_.update();} //主线程中kcp的tick
workthread_loop //工作线程入口函数
do_workthread_loop
while(){kcp_client_.update();} //工作线程中kcp的tick,kcp update时间间隔是KCP_UPDATE_INTERVAL 5ms
c 封装的成员变量有:
kcp_client kcp_client_;
相关状态变量
d kcp client创建实例:
asio_kcp::kcp_client_wrap net;
Client client;
net.set_event_callback(Client::client_event_callback, (void*)(&client));
int ret = net.connect(0, "127.0.0.1", 32323);
asio_kcp::millisecond_sleep(10);
net.send_msg(std::string("1234567890"));
asio_kcp::millisecond_sleep(510);
(2)kcp_client类
a 提供方法接口如下:
connect_async
init_udp_connect
//设置udp连接的状态,in_connect_stage_置为true,获得当前时间作为connect_start_time_
send_msg //主线程调用此函数将待发送消息push到发送队列中,供工作线程使用
send_msg_queue_.push(msg);
update
do_asio_kcp_connect //向udp server发送“标志连接”的消息,并请求udp server端分配kcp conv
//若udp连接成功 (connect_succeed_字段为true,当client的kcp初始化完成)
do_send_msg_in_queue //一次全部取出发送队列中的消息,并调用ikcp_send,交给kcp模块进行处理
while(){ikcp_send();}
do_recv_udp_packet_in_loop
recv
handle_udp_packet
is_disconnect_packet //是否断连消息
ikcp_input //交给kcp将收到的udp消息由kcp消息格式转化为应用层消息格式
while(1){recv_udp_package_from_kcp();}//
//recv_udp_package_from_kcp()的内容:
ikcp_recv //利用ikcp_recv获取经kcp解析(去掉头)后的应用层消息
ikcp_update
//距上次ts_flush超过一定阈值,则调用ikcp_flush,并更新kcp->ts_flush
ikcp_flush //利用ikcp_output调用注册的回调函数将各类kcp消息(ack/数据/请求窗口/告知窗口)发送给udp server
b 包含的私有方法:
init_udp_connect
//servaddr_内容填充,udp服务端ip、监听端口号、
socket //SOCK_DGRAM,建立udp socket,设置为非阻塞模式
bind//填充struct sockaddr_in bind_addr,利用bind绑定本地端口号
connect(udp_socket_, &servaddr_,...) //
connect_timeout //kcp重连时间间隔 500ms
need_send_connect_packet
do_asio_kcp_connect
do_send_connect_packet
try_recv_connect_back_packet //
udp_output //静态方法,在kcp模块中被调用,下面方法所属的应用层类实例指针为kcp_client*
((kcp_client*)user)->send_udp_package(buf, len); //
send//利用应用层创建的udp网络连接将kcp封装后的udp消息发送出去
send_udp_package
send//利用应用层创建的udp网络连接将kcp封装后的udp消息发送出去
do_send_connect_packet
making_connect_packet //udp client向udp server发送特定“标志连接”的消息,用于udp服务端记录udp client信息
send
do_recv_udp_packet_