-
Notifications
You must be signed in to change notification settings - Fork 0
fumeboy/netio
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
# netio
一个依赖 epoll 实现的网络IO库
## 实例
请见 ./http/test/main.go
## 流程
初始化
创建全局单例 globalServer
创建全局单例 globalEpoll
go 协程 执行 globalEpoll.run()
创建 TCP listener
循环执行 Accept, 除非程序被强制退出
accept 得到 conn 后,添加到 connections 中, connections 是一个 map
同时添加 conn.fd 到 epoll 中进行监听
globalEpoll 通过 wait() 得到 conn fd 上发生的 事件
归纳这些事件为 可读 / 可写 / 错误 事件
接收到 可读事件 后, 读出数据, 并传给 业务 函数
业务函数通常会有发送数据的操作
如果 可写, 则写出要发送的数据
退出时,
globalEpoll.close()
遍历 connections 执行 conn.close()
对 globalServer 和 globalEpoll 置空
## 下一步
0
在 net/http 中, 对每一个 conn 都开了一个协程,这被认为是浪费的
需要写一个协程池用于处理 conn 读写
1
每个 conn 有一个上下文,用于存储必要的数据, 比如 http 请求
需要写一个对象池,用于复用这些上下文结构体
2
实现应用层协议,比如 HTTP
这是最重要的一步, 绝大多数同这个项目一类的项目都放弃了做这件事
因为真正要处理协议太麻烦了!
如果有信心,可以借鉴 net/http 中的程序自己实现对 HTTP1.1 TLS HTTP2 这些协议的支持
About
依赖 epoll 实现的异步网络IO库
Resources
Stars
Watchers
Forks
Releases
No releases published
Packages 0
No packages published