2015-05-06 刘太华
一个单线程的epoll server示例 这个示例是一个echo server, 将回显client端send的64字节. 代码在 echoEpollServer 在OSX下 gcc 4.6, linux 下编译可用, 默认被写死了监听8886端口. 继续阅读 »
2016-03-16 Piasy
今天代码写着写着就莫名闪退了,手机也没有“程序停止运行”的提示,logcat也没有看到蓝色的调用栈log,这样的闪退最是蛋疼了,还好必现。复现几次之后,终于从logcat中看到了一行可疑的log:A/Looper: Could not create epoll instance. errno=24,看起来又是在native层闪退了。本文就把这个问题的分析解决过程记录了下来。 继续阅读 »
2015-11-15 Li Shuai
Linux里的IO多路复用是有效提高IO效率的技术。主要有select、poll、epoll三种。 select select调用的函数接口是: int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); 参数说明: nfds: fdset中最大描述符值加1, fdset是一个位数组, 大小为__FD_SETSIZE(1024), 位数组的每一位表示该描述符是否被检查 readfds, writefds, exceptfds: 三个位数组, 非别对应监听不同类型读写及错误事件的描述符。 继续阅读 »
2016-08-04 Li Shuai
这里的blocking signal里的blocking并不是传统意义上的针对IO的blocking, 尽管这可能是引起ioloop阻塞的一个原因之一。在这里,blocking指的是ioloop在epoll返回之后开始依次处理各监听文件句柄上的IO事件时,直到下一次进入epoll调用的这段时间的ioloop的状态。我们知道Tornado是单线程的,在处理完某次epoll调用返回的读写就绪事件之前,Tornado无法启动下次epoll监听,所以这段时间理论上是越短越好,这样,ioloop可以充分及时的获取就绪文件句柄,不会影响整体IO性能。然而在实际的使用过程中,难免会出现某次处理时间过长,从而导致ioloop的blocking时间过 继续阅读 »
2015-04-10 刘太华
网络层 一个思维导图 基本模块有: SocketBase 抽象基类, 定义所有会共性的方法, 基本都是Epoll在回调,比如OnRead, OnWrite分别处理epoll的读写事件, ListenSocket也是继承这个基类. m_fd 保存socket的fd属性 m_readBuffer 和 m_writeBuffer 分别是一个读写的buffer, 类型就是Buffer类 继续阅读 »
2015-07-06 刘太华
网关编码一 拆了又补, 补了又拆,边拆边想,发现之前用asio socket的方式做gateway, 有不少问题。 1. 如果用asio做连接upstream server的socket, 还需要把byte buffer实现一遍, 虽然已有现成的buffer代码, 不过生搬过去还是显的略繁琐; 2. 如果用asio, 下游用的是epoll, 要在asio的async_read_some, 和epoll的 OnRead, OnWrite间穿梭, 感觉好脑残,之前的想法果然傻逼, 当然推翻它重来了; 3. 改成都用epoll监听, 方便很多。基本上就是设计一个新类 ProxySClientSocket 继承SClie 继续阅读 »
2015-06-18 刘太华
gateway的初步想法 已有一套基于epoll event的框架, 打算gateway在这个基础上, 配合boost::asio做。雏形先做个socket proxy出来. TODO: 1,设计一个AsioClient类, 它是gw到后端具体gs的连接封装. AsioClient类想到2个方案: a, 在原来的面向玩家的SClientSocket类和AsioClient类之间做friend, asio_write, asio_read, asio_connect的callback中, 回调SClientSocket中的对应Write, Read达到与epoll 事件打通, 因此打通玩家到后端gs的proxy 继续阅读 »
2016-10-30 ruki
New features Support make command and compile directly without xmake Add switch context interfaces into platform module Add coroutine module (supports i386, x86_64, arm, arm64 ..) Add simple http server demo using coroutine Add simple spider using coroutine Add io poller interfaces(with epoll, poll, kqueue, select) Su 继续阅读 »
2016-11-07 ruki
tbox内部的所有io操作都是原生支持协程的,可以在线程和协程间任意切换,内置基于轮询的io调度器(epoll, kqueue等,后续还会支持iocp). 我们在socket操作的时候,只需要像平常顺序编程那样操作就可以实现异步并发收发数据。 这里先给个简答的文件服务器的例子,可参考下,代码非常简单: 文件接收服务器 这个文件服务器的功能很简单,就是不停的接收连接,然后开新协程,进行文件传输。 通过协程,从原始socket写起,也只需要不到100行代码,就可以实现一个高并发的文件服务器。 此处用到了tb_socket_sendf直接对文件句柄操作,发送到socket,内部使用sendfile实现,不需要再上层开buffe 继续阅读 »
2017-08-30 ruki
新特性 增加ping测试程序 改进 修改license,使用更加宽松的Apache License 2.0 重命名--smallest=y|n选项到--small=y|n 使用stat64支持大文件信息获取 改进tb_file_copy,更加快速的文件copy,并且修复copy后文件权限丢失问题 改进posix平台下的路径操作 改进socket初始化接口,支持icmp协议 改进xmake.lua,移除内置二进制依赖包文件 Bugs修复 修复创建文件权限不对问题 修复文件和目录路径问题 修复无法移除带有无效软链的目录问题 修复无法移除只读文件问题 #34: 修复缓存时间和协程sleep不准问题 #35: 修复epoll边缘触发模 继续阅读 »