随笔分类 - 网络编程
摘要:select模型支持IO多路复用,select函数如下 逐个解释每个参数意义: nfds:一个整型变量,表示比最大文件描述符+1 readfds: 这个集合监测读事件的描述符,将要监听 读事件的文件描述符放入readfds中,通过调用select, readfds中将没有就绪的读事件文件描述符清除,
阅读全文
摘要:上一篇讲到了libiop基本结构,这次根据libiop提供的test跟踪下消息和运行流程 echo_server_test 函数内部添加了一个tcpserver,将函数一层一层展开 展开iop_add_tcp_server 解读iop_add_tcp_server 函数参数iop_base_t 是i
阅读全文
摘要:最近朋友推荐,学习了libiop这个网络库,作者封装的很全面,代码很简洁 适合初学者学习基于事件驱动的网络io 先看看iop_def.h, 这里面定义了常用的数据结构 tag_iop_base_t 主要用于管理所有事件,每个事件是一个iop_t, maxio表示最大的文件描述符, free_list
阅读全文
摘要:上一篇讲述了eventloop的结构和创建,添加文件事件删除文件事件,派发等等。 而eventloop主要就是调用不同网络模型完成事件监听和派发的。 这一篇主要讲述epoll网络模型,redis是如何封装和调用的 下面是epoll_event的结构 Ae_epoll.c文件中回传的数据结构 Ae_e
阅读全文
摘要:上一篇讲完了initServer的大体流程,其中aeCreateEventLoop(),这个函数 没有详细说明,我们在这一篇里讲述Ae.h和Ae.c, 这里面的api阐述了如何创建 eventLoop和添加文件读写事件等等。 ae.h中的解释 ae.cpp中,一个函数一个函数解析 aeCreateE
阅读全文
摘要:之前梳理过redis main函数主体流程 大体是 initServerConfig() -> loadServerConfig() -> daemonize() -> initServer() -> aeSetBeforeSleepProc() ->aeMain() -> aeDeleteEven
阅读全文
摘要:基于之前讲述的简单循环服务器,做一个多个线程各自accept的服务器demo 由于多个线程各自accept,容易造成数据错误,需要在accept前后枷锁 先看下客户端 客户端创建socket,初始化服务器地址信息,然后进行连接 连接成功后发送信息给服务器,并且接受服务器回传的信息 服务器部分: 服务
阅读全文
摘要:客户端部分: 比较简单 创建socket 然后connect服务器,进行通讯 发送数据,并且接收数据,然后关闭 服务器部分: 服务器要做的是创建socket,初始化地址信息,并且绑定socket,然后进行监听 然互就是在循环里处理客户端连接上来的请求,并且接受信息,回发信息 循环服务器比较简单,而且
阅读全文
摘要:epoll技术前两节已经阐述过了,目前主要做一下封装,很多epoll的服务器都是采用事件回调方式处理, 其实并没有什么复杂的,我慢慢给大家阐述下原理。 在networking.h和networking.cpp里,这两个文件主要实现了一些文件读写功能的回调函数 。 acceptCallBack 负责新
阅读全文
摘要:前一篇介绍了epoll的LT模式,LT模式注意epollout事件在数据全部写成功后需要取消关注, 或者更改为EPOLLIN。 而这次epoll的ET模式,要注意的是在读和写的过程中要在循环中写完或者读完所有数据, 确保不要丢掉一些数据。 因为epoll ET模式只在两种边缘更改的时候触发,对于读事
阅读全文
摘要:网络通信中socket有自己的内核发送缓冲区和内核接受缓冲区,好比是一个水池, 当用户发送数据的时候会从用户缓冲区拷贝到socket的内核发送缓冲区,然后从 socket发送缓冲区发出去, 当用户要读取数据时,就是从socket内核读缓冲区读 到用户缓冲区。所以TCP中recv, send, rea
阅读全文
摘要:近期学习了redis底层框架,好多东西之前都没听说过,算是大开眼界了。 先梳理下redis正常的通讯流程吧 首先服务器启动都有主函数main,这个main函数就在redis.c里 首先是initserverconfig(),在这里初始化了redisserver基本的配置信息, 接着调用loadSer
阅读全文