一个单线程的epoll server示例
这个示例是一个echo server, 将回显client端send的64字节.
代码在 echoEpollServer
在OSX下 gcc 4.6, linux 下编译可用, 默认被写死了监听8886端口.
继续阅读 »
今天代码写着写着就莫名闪退了,手机也没有“程序停止运行”的提示,logcat也没有看到蓝色的调用栈log,这样的闪退最是蛋疼了,还好必现。复现几次之后,终于从logcat中看到了一行可疑的log:A/Looper: Could not create epoll instance. errno=24,看起来又是在native层闪退了。本文就把这个问题的分析解决过程记录了下来。
继续阅读 »
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: 三个位数组, 非别对应监听不同类型读写及错误事件的描述符。
继续阅读 »
这里的blocking signal里的blocking并不是传统意义上的针对IO的blocking, 尽管这可能是引起ioloop阻塞的一个原因之一。在这里,blocking指的是ioloop在epoll返回之后开始依次处理各监听文件句柄上的IO事件时,直到下一次进入epoll调用的这段时间的ioloop的状态。我们知道Tornado是单线程的,在处理完某次epoll调用返回的读写就绪事件之前,Tornado无法启动下次epoll监听,所以这段时间理论上是越短越好,这样,ioloop可以充分及时的获取就绪文件句柄,不会影响整体IO性能。然而在实际的使用过程中,难免会出现某次处理时间过长,从而导致ioloop的blocking时间过
继续阅读 »
网络层
一个思维导图
基本模块有:
SocketBase 抽象基类, 定义所有会共性的方法, 基本都是Epoll在回调,比如OnRead, OnWrite分别处理epoll的读写事件, ListenSocket也是继承这个基类.
m_fd 保存socket的fd属性
m_readBuffer 和 m_writeBuffer 分别是一个读写的buffer, 类型就是Buffer类
继续阅读 »
网关编码一
拆了又补, 补了又拆,边拆边想,发现之前用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
继续阅读 »
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
继续阅读 »
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
继续阅读 »
tbox内部的所有io操作都是原生支持协程的,可以在线程和协程间任意切换,内置基于轮询的io调度器(epoll, kqueue等,后续还会支持iocp).
我们在socket操作的时候,只需要像平常顺序编程那样操作就可以实现异步并发收发数据。
这里先给个简答的文件服务器的例子,可参考下,代码非常简单:
文件接收服务器
这个文件服务器的功能很简单,就是不停的接收连接,然后开新协程,进行文件传输。
通过协程,从原始socket写起,也只需要不到100行代码,就可以实现一个高并发的文件服务器。
此处用到了tb_socket_sendf直接对文件句柄操作,发送到socket,内部使用sendfile实现,不需要再上层开buffe
继续阅读 »
新特性
增加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边缘触发模
继续阅读 »