目录

Q:CBEngine使用什么网络模型?

一.epoll_create

二.epoll_ctl

三.epoll_wait

四.accept

五.recv

六.send

总结


先看看官网关于网络的问答

Q:CBEngine使用什么网络模型?

A:由于正式运营环境在Linux下,所以网络模型选择了epoll, 生产环境在Windows比较方便所以CBEngine也支持了Windows系统,但是网络模型只是简单的select。

看看epoll用到的API, epoll_create epoll_ctl  epoll_wait

一.epoll_create

直接搜索关键字 epoll_create,创建epoll实例


EpollPoller::EpollPoller(int expectedSize) :epfd_(epoll_create(expectedSize))
{if (epfd_ == -1){ERROR_MSG(fmt::format("EpollPoller::EpollPoller: epoll_create failed: {}\n",kbe_strerror()));}
};

二.epoll_ctl

epoll_ctl, 设置epoll的事件

bool EpollPoller::doRegister(int fd, bool isRead, bool isRegister)
{struct epoll_event ev;memset(&ev, 0, sizeof(ev)); // stop valgrind warningint op;ev.data.fd = fd;// Handle the case where the file is already registered for the opposite// action.if (this->isRegistered(fd, !isRead)){op = EPOLL_CTL_MOD;ev.events = isRegister ? EPOLLIN|EPOLLOUT :isRead ? EPOLLOUT : EPOLLIN;}else{// TODO: Could be good to use EPOLLET (leave like select for now).ev.events = isRead ? EPOLLIN : EPOLLOUT;op = isRegister ? EPOLL_CTL_ADD : EPOLL_CTL_DEL;}if (epoll_ctl(epfd_, op, fd, &ev) < 0){const char* MESSAGE = "EpollPoller::doRegister: Failed to {} {} file ""descriptor {} ({})\n";if (errno == EBADF){WARNING_MSG(fmt::format(MESSAGE,(isRegister ? "add" : "remove"),(isRead ? "read" : "write"),fd,kbe_strerror()));}else{ERROR_MSG(fmt::format(MESSAGE,(isRegister ? "add" : "remove"),(isRead ? "read" : "write"),fd,kbe_strerror()));}return false;}return true;
}

三.epoll_wait

epoll_wait  等待事件

int EpollPoller::processPendingEvents(double maxWait)
{const int MAX_EVENTS = 10;struct epoll_event events[ MAX_EVENTS ];int maxWaitInMilliseconds = int(ceil(maxWait * 1000));#if ENABLE_WATCHERSg_idleProfile.start();
#elseuint64 startTime = timestamp();
#endifKBEConcurrency::onStartMainThreadIdling();int nfds = epoll_wait(epfd_, events, MAX_EVENTS, maxWaitInMilliseconds);KBEConcurrency::onEndMainThreadIdling();#if ENABLE_WATCHERSg_idleProfile.stop();spareTime_ += g_idleProfile.lastTime_;
#elsespareTime_ += timestamp() - startTime;
#endiffor (int i = 0; i < nfds; ++i){if (events[i].events & (EPOLLERR|EPOLLHUP)){this->triggerError(events[i].data.fd);}else{if (events[i].events & EPOLLIN){this->triggerRead(events[i].data.fd);}if (events[i].events & EPOLLOUT){this->triggerWrite(events[i].data.fd);}}}return nfds;
}

四.accept

accept,在这里等待连接

INLINE EndPoint * EndPoint::accept(u_int16_t * networkPort, u_int32_t * networkAddr, bool autosetflags)
{sockaddr_in        sin;socklen_t       sinLen = sizeof(sin);int ret = (int)::accept(socket_, (sockaddr*)&sin, &sinLen);#if KBE_PLATFORM == PLATFORM_UNIXif (ret < 0) return NULL;
#elseif (ret == INVALID_SOCKET) return NULL;
#endifEndPoint * pNew = EndPoint::createPoolObject(OBJECTPOOL_POINT);pNew->setFileDescriptor(ret);pNew->addr(sin.sin_port, sin.sin_addr.s_addr);if(autosetflags){pNew->setnonblocking(true);pNew->setnodelay(true);}if (networkPort != NULL) *networkPort = sin.sin_port;if (networkAddr != NULL) *networkAddr = sin.sin_addr.s_addr;return pNew;
}

五.recv

接收消息的 recv 函数

INLINE int EndPoint::recv(void * gramData, int gramSize)
{if (isSSL())return SSL_read(sslHandle_, (char*)gramData, gramSize);return ::recv(socket_, (char*)gramData, gramSize, 0);
}

接收消息,从线程工作函数 到系统API调用堆栈

从这里可以看到消息的接收的运行在主线程上的

读取的数据存放到类 MemoryStream上的成员变量 std::vector<uint8> data_;上

int len = ep.recv(data() + wpos(), (int)(size() - wpos()));
 uint8 *data() { return &data_[0]; }

接收到的消息后面是如何处理的,去登录的比较上层的地方下个断点看看

红框内就是消息从recv 到 loginapp类

经过一路分发,最终送到登录的逻辑处理函数

void Loginapp::login(Network::Channel* pChannel, MemoryStream& s)
{AUTO_SCOPED_PROFILE("login");COMPONENT_CLIENT_TYPE ctype;CLIENT_CTYPE tctype = UNKNOWN_CLIENT_COMPONENT_TYPE;std::string loginName;std::string password;std::string datas;bool forceInternalLogin = false;// 前端类别s >> tctype;ctype = static_cast<COMPONENT_CLIENT_TYPE>(tctype);// 附带数据s.readBlob(datas);// 帐号登录名s >> loginName;// 密码s >> password;loginName = KBEngine::strutil::kbe_trim(loginName);

在login内经过校验,最后通过网络发送给dbmgr进行数据库查询

 // 向dbmgr查询用户合法性Network::Bundle* pBundle = Network::Bundle::createPoolObject(OBJECTPOOL_POINT);(*pBundle).newMessage(DbmgrInterface::onAccountLogin);(*pBundle) << loginName << password;(*pBundle).appendBlob(datas);dbmgrinfos->pChannel->send(pBundle);

六.send

去API,send下个断点看看是如何一路走到这里的, 红框内就是login一路到send的调用。

调用API send的实现

INLINE int EndPoint::send(const void * gramData, int gramSize)
{if (isSSL())return SSL_write(sslHandle_, (char*)gramData, gramSize);return ::send(socket_, (char*)gramData, gramSize, 0);
}

总结

自此可以看到epoll的初始化,一条消息从recv进来,再到send出去的过程。整个过程都是在主线程内运行的。

KBEngine网络代码分析相关推荐

  1. ue4 网络代码分析

    http://blog.csdn.net/xiaozhi0999/article/details/51326200 ue4实现了rpc,还是比较好用的,下面简单分析一下ue4网络部分的实现. ue4中 ...

  2. 20145236《网络攻防》Exp4 恶意代码分析

    20145236<网络攻防>Exp4 恶意代码分析 一.基础问题回答 如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作有哪些 ...

  3. 20145328 《网络对抗技术》恶意代码分析

    20145328 <网络对抗技术>恶意代码分析 ------看到这句话说明还没写完-------- 实践内容: 使用schtasks指令监控系统运行 使用sysmon工具监控系统运行 使用 ...

  4. 2018-2019-2 网络对抗技术 20165324 Exp4:恶意代码分析

    2018-2019-2 网络对抗技术 20165324 网络对抗技术 Exp4:恶意代码分析 课下实验: 实践目标 是监控你自己系统的运行状态,看有没有可疑的程序在运行. 是分析一个恶意软件,就分析E ...

  5. 2018-2019-2 网络对抗技术 20165320 Exp4 恶意代码分析

    2018-2019-2 网络对抗技术 20165320 Exp4 恶意代码分析 一.实践目标 监控你自己系统的运行状态,看有没有可疑的程序在运行 分析一个恶意软件,就分析Exp2或Exp3中生成后门软 ...

  6. 20155317《网络对抗》Exp4 恶意代码分析

    20155317<网络对抗>Exp4 恶意代码分析 基础问题回答 如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作有哪些,用 ...

  7. 2017-2018-2 20155228 《网络对抗技术》 实验四:恶意代码分析

    2017-2018-2 20155228 <网络对抗技术> 实验四:恶意代码分析 1. 实践内容 1.1 系统运行监控 使用如计划任务,每隔一分钟记录自己的电脑有哪些程序在联网,连接的外部 ...

  8. 2018-2019-2 20165114《网络对抗技术》Exp4 恶意代码分析

    Exp4 恶意代码分析 目录 一.实验目标 (1)监控你自己系统的运行状态,看有没有可疑的程序在运行. (2)分析一个恶意软件,就分析Exp2或Exp3中生成后门软件:分析工具尽量使用原生指令或sys ...

  9. 2018-2019-2 20165209 《网络对抗技术》Exp4:恶意代码分析

    2018-2019-2 20165209 <网络对抗技术>Exp4:恶意代码分析 1 基础问题回答和实验内容 1.1基础问题回答 如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监 ...

最新文章

  1. 华岩资本--微生物领域项目投递通道
  2. Oracle获取LOB长度的两种方法效率对比
  3. libpcap介绍(一)
  4. (Spring)依赖注入
  5. mysql用大白话解释_Java基础--2021Java面试题系列教程--大白话解读
  6. 【C++深度剖析教程19】前置操作符与后置操作符
  7. Linux的标准I/O和管道
  8. no route to host什么意思_Day 74:Vue里的route和router
  9. 4怎么打开项目_基于车位引导系统的捷顺室内导航项目怎么调试?
  10. js系列教程8-事件全解
  11. python学习笔记 程序执行过程 基本数据类型
  12. 微信公众号是html页面吗,微信公众号网页开发
  13. openh264限制slice/nal分片大小导致的编码数据错误
  14. [双目视差] 单双目MATLAB 相机标定(二)双目摄像机标定
  15. 【CSDN竞赛第四期】编程赛后总结与分享
  16. winrar命令行打自解压安装包不生效问题
  17. 《程序设计基础》 第五章 函数 6-6 字符金字塔 (15 分)
  18. 2022中国深圳国际医疗器械博览会
  19. 《大型数据库技术,传智播客Java百度网盘
  20. 浙江网新恒天软件有限公司企业云报表集成解决方案

热门文章

  1. edusoho阿里云直播php源代码披露
  2. Simulink仿真问题汇总
  3. web前端 使用iconfont阿里巴巴线上矢量图标
  4. 布隆过滤器在hbase的应用
  5. C++如何禁止对象的复制操作
  6. Nordic 52832 BLE Central Demo 分析
  7. uview 2.x版本 tabbar在uniapp小程序里头点击两次才能选中图标
  8. 关于AD(Altium Designer)-遇到Modified Polygon或者类似“引脚粘连”现象-2021-08-13
  9. nodejs 解析http_如何在NodeJS中大规模解析PDF:做什么和不做什么
  10. Linux 集群大全