TeamTalk Netlib详解
1.简介
主要用于处理tcp连接,自己实现了一个网络库
2.类与接口
2.1 CBaseSocket:socket基础类,封装了常用网络api
void CBaseSocket::_SetReuseAddr(SOCKET fd):
SO_REUSEADDR复用地址
void CBaseSocket::_SetNonblock(SOCKET fd):
O_NONBLOCK设置非阻塞
void CBaseSocket::_SetAddr(const char* ip, const uint16_t port, sockaddr_in* pAddr):
创建sockaddr_in,内部调用gethostbyname支持域名
void AddBaseSocket(CBaseSocket* pSocket):
插入到g_socket_map,通过全局map建立每一个socket fd和CBaseSocket的对应关系
int CBaseSocket::Listen(const char* server_ip, uint16_t port, callback_t callback, void* callback_data):
设置OnRead回调函数m_callback,创建socket、bind、listen 并设置m_state为SOCKET_STATE_LISTENING;
同时调用 AddBaseSocket(this)将listen socket加入g_socket_map;
调用CEventDispatch::Instance()->AddEvent(m_socket, SOCKET_READ | SOCKET_EXCEP)添加socket可读事件(epoll)。void CBaseSocket::_AcceptNewSocket():
accept,设置新连接状态(SOCKET_STATE_CONNECTED)属性(NoDelay NoBlock)并将新连接存入g_socket_map
void CBaseSocket::OnRead():
处理epoll可读事件,m_state为SOCKET_STATE_LISTENING时调用_AcceptNewSocket,其他状态是调用m_callback,m_callback在 listen时通过callback设置了回调函数
net_handle_t CBaseSocket::Connect(const char* server_ip, uint16_t port, callback_t callback, void* callback_data):
设置OnWrite回调函数m_callback,连接服务器,创建socket,connect,设置状态为SOCKET_STATE_CONNECTING,将当前CBaseSocket(this)加入g_socket_map
void CBaseSocket::OnWrite():
处理epoll可写事件,m_callback在Connect时通过callback设置了回调函数
2.2 CEventDispatch:socket事件基础类
void CEventDispatch::AddEvent(SOCKET fd, uint8_t socket_event):
EPOLL_CTL_ADD添加epoll事件
void CEventDispatch::StartDispatch(uint32_t wait_timeout):
while(running)处理epoll io事件,通过类似于Reactor模型的方法,调用FindBaseSocket从g_socket_map中找到socket fd对应的CBaseSocket来触发相应事件处理回调函数(OnRead OnWrite OnClose等),running用于控制该消息泵的持续和退出;
void CEventDispatch::StopDispatch():
将running置为false终止StartDispatch内部的while循环。
定时loop
//定时任务基本单元结构 typedef struct {callback_t callback; //定时器回调函数void* user_data; //定时器回调参数uint64_t interval; //定时器周期uint64_t next_tick; //下次触发时刻 } TimerItem;//使用链表保存所有定时任务 list<TimerItem*> m_timer_list; //函数指针,指向任务处理函数,msg表示消息类型 typedef void (*callback_t)(void* callback_data, uint8_t msg, uint32_t handle, void* pParam);//向定时任务loop里添加定时任务 //若链表里已存在该任务则更新定时周期和下一个触发时刻,若不存在则使用TimerItem封装任务,加入链表中 void CEventDispatch::AddTimer(callback_t callback, void* user_data, uint64_t interval);//从m_timer_list里删除定时任务 void CEventDispatch::RemoveTimer(callback_t callback, void* user_data) //处理m_timer_list里定时任务 //遍历m_timer_list,若当前时刻大于下次触发时刻则执行任务并更新下一触发时刻 //StartDispatch函数是一个while(true)会不断执行_CheckTimer,保证定时任务的执行 void CEventDispatch::_CheckTimer()优点:StartDispatch里利用epoll_wait(m_epfd, events, 1024, wait_timeout),不会长时间阻塞在这里而占用过多cpu资源 缺点:定时器周期受限于wait_timeout,适合处理周期比wait_timeout大的定时任务
任务Loop
//使用链表存储loop待执行的任务,复用了TimerItem list<TimerItem*> m_loop_list;//添加任务到m_loop_list void CEventDispatch::AddLoop(callback_t callback, void* user_data);//遍历执行m_loop_list里的任务 //StartDispatch函数是一个while(true)会不断执行_CheckLoop,保证任务的执行。 void _CheckLoop();
2.3 NetLib网络库: 通过new CBaseSocket()或FindBaseSocket(handle)使用CBaseSocket内部接口
int netlib_listen(const char* server_ip, uint16_t port, callback_t callback, void* callback_data):
new CBaseSocket,再调用BaseSocket的Listen接口,同时设置OnRead的回调函数;
OnRead里m_callback(m_callback_data, NETLIB_MSG_READ, (net_handle_t)m_socket, NULL)调用的就是netlish设置的回调函数。net_handle_t netlib_connect(const char* server_ip,uint16_t port,callback_t callback,void* callback_data);
new CBaseSocket,再调用BaseSocket的Connect接口
void netlib_eventloop(uint32_t wait_timeout):
调用CEventDispatch内部StartDispatch接口
int netlib_option(net_handle_t handle, int opt, void* optval):
根据opt(NETLIB_OPT_SET_CALLBACK NETLIB_OPT_SET_CALLBACK_DATA…)进行重置回调函数,回调函数参数,读写缓冲区大小,获取ip,port等操作;
如建立新连接时重置OnRead回调函数为imconn_callback并获取对端ip port:
netlib_option(handle, NETLIB_OPT_SET_CALLBACK, (void*)imconn_callback)
netlib_option(handle, NETLIB_OPT_GET_REMOTE_IP, (void*)&peer_ip)
netlib_option(handle, NETLIB_OPT_GET_REMOTE_PORT, (void*)&peer_port)int netlib_recv(net_handle_t handle, void* buf, int len):
调用FindBaseSocket从g_socket_map找到相应socket,调用Recv接收数据。
int netlib_send(net_handle_t handle, void* buf, int len):
调用FindBaseSocket从g_socket_map找到相应socket,调用Send发送数据。
int netlib_close(net_handle_t handle):
调用FindBaseSocket从g_socket_map找到相应socket,调用Close关闭连接。
int netlib_register_timer(callback_t callback, void* user_data, uint64_t interval):
调用 CEventDispatch::AddTimer添加定时任务
int netlib_delete_timer(callback_t callback, void* user_data)
调用CEventDispatch::RemoveTimer删除定时任务
int netlib_add_loop(callback_t callback, void* user_data)
调用 CEventDispatch::AddLoop添加任务
void netlib_stop_event()
调用 CEventDispatch::StopDispatch停止消息泵
3.源码
- 链接:TeamTalk_BlueBling
- 测试demo: tests/test_netlib.cpp
4.test_netlib说明
- 测试用例模拟login server,teamtalk客户端登录时会先连接login server获取msg_server的情况再连接msg_server,由于没有模拟msg_server,
teamtalk客户端第一阶段获取msg_server的情况会成功,第二阶段连接msg_server会出错,但测试效果(能正常连接收发数据)达到了; - teamtalk客户端代码void DoLoginServerHttpOperation::processOpertion()用于第一阶段连接login server获取msg server信息;void LoginOperation::processOpertion()用于第二阶段连接msg server这才是真正的连接。
- 效果图
TeamTalk Netlib详解相关推荐
- TeamTalk slog详解
1.简介 slog模块依赖于log4cxx,实际是对log4cxx的进一步封装. 2.主要类关系说明: CSLog teamtalk日志类,利用内部成员(CSLogObject* m_log)调用CS ...
- 【转】WebSocket详解(一):初步认识WebSocket技术
1.前言 HTML5规范在传统的web交互基础上为我们带来了众多的新特性,随着web技术被广泛用于web APP的开发,这些新特性得以推广和使用,而websocket作为一种新的web通信技术具有巨大 ...
- WebSocket详解(一):初步认识WebSocket技术
WebSocket详解(一):初步认识WebSocket技术 1.前言 HTML5规范在传统的web交互基础上为我们带来了众多的新特性,随着web技术被广泛用于web APP的开发,这些新特性得以推广 ...
- P2P技术详解(一):NAT详解——详细原理、P2P简介(转)
这是一篇介绍NAT技术要点的精华文章,来自华3通信官方资料库,文中对NAT技术原理的介绍很全面也很权威,对网络应用的应用层开发人员而言有很高的参考价值. <P2P技术详解>系列文章 ➊ 本 ...
- 015. P2P技术详解(一):NAT详解——详细原理、P2P简介
http://www.52im.net/thread-50-1-1.html 这是一篇介绍NAT技术要点的精华文章,来自华3通信官方资料库,文中对NAT技术原理的介绍很全面也很权威,对网络应用的应用层 ...
- sstream类的详解
sstream类的详解 sstream类详细介绍 C++引入了ostringstream.istringstream.stringstream这三个类,要使用他们创建对象 ...
- (转)理论经典:TCP协议的3次握手与4次挥手过程详解
摘要: 本文将分别讲解经典的TCP协议建立连接(所谓的"3次握手")和断开连接(所谓的"4次挥手")的过程. 1.前言 尽管TCP和UDP都使用相同的网络层(I ...
- Web端即时通讯技术原理详解
Web端即时通讯技术原理详解 前言 在web端的IM即时通讯应用,由于浏览器的兼容性以及其固有的"客户端请求服务器处理并响应"的C/S通信模型,造成了要在浏览器中实现一个兼容性较好 ...
- 从命令行到IDE,版本管理工具Git详解(远程仓库创建+命令行讲解+IDEA集成使用)
首先,Git已经并不只是GitHub,而是所有基于Git的平台,只要在你的电脑上面下载了Git,你就可以通过Git去管理"基于Git的平台"上的代码,常用的平台有GitHub.Gi ...
最新文章
- 在Sharepoint中批量删除大量条目
- 浅谈机器人产品落地全过程
- python建立数据库并序列化_python之数据的序列化
- Tensorflow-相关API-交叉熵
- 开发自上而下的Web服务项目
- Install Python3.6 on Amazon Linux/EC2 在Amazon Linux实例中安装使用Python3.6
- 二维码原来可以这样玩
- 【Python爬虫】存储格式化数据
- oracle函数大全-字符串处理函数
- EVC下如何直接访问寄存器?
- 安信可nbiot模块_安信可无线模组
- 三位一体的漏洞分析方法-web应用安全测试方法
- URL短网址生成算法原理
- jenkins api使用_使用管理API和Jenkins作为IBM App Connect Professional部署自动化的持续集成引擎
- 2.天猫商品数据爬虫(已模拟登录)
- ASP.NET的隐藏功能[关闭]
- Norton AntiVirus (诺顿杀毒)v9.0 简体中文企业版http://down.hotlife.cn/html/download/2006/5/30/1148978165.shtml
- 2021年G3锅炉水处理考试总结及G3锅炉水处理模拟试题
- 详细解释下小波去噪的原理
- linux下如何装NVIDIA显卡驱动(gt940m为例)