https://github.com/zongzw-learn/learn-go/tree/master/basics/tcp-poller
kqueue在golang语言下的使用实践
将kqueue的操作细节封装在NetPoller接口中,实现KqueuePoller的三个API:
- Start 启动基于kqueue的IO多路复用事件监听
- Close 停止kqueue
- SetHandler 设置可插入式的数据处理函数,目前只处理socket读取操作。亦可以根据需要添加写操作
使用方法参考 main函数
原理
- syscall + kqueue + kevent + socket API
核心代码解读
n, err := syscall.Kevent(np.kq, nil, np.events, nil)
if err != nil {
// ...
}
for i := 0; i < n; i++ {
ev := np.events[i]
if ev.Ident == uint64(np.socket) {
// 对于server socket的事件处理
// ...
} else {
// 对于客户socket的事件处理
switch ev.Filter {
case syscall.EVFILT_READ:
b, err := np.readFd(int(ev.Ident))
if err != nil {
if err == io.EOF {
// 客户socket的关闭情况
syscall.Close(int(ev.Ident))
} else {
log.Printf("failed to read from socket %d: %s", ev.Ident, err.Error())
}
} else {
// 客户socket的读操作
}
case syscall.EVFILT_WRITE:
// 客户socket的写操作
default:
log.Printf("not supported for Filter type: %d", ev.Filter)
}
}
}
标签:kqueue,socket,err,syscall,golang,IO,np,ev,kevent
From: https://www.cnblogs.com/zongzw/p/18227142