golang中基于kevent的IO多路复用实践

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)
					}
				}
			}
posted @ 2024-06-02 14:54  zongzw  阅读(73)  评论(0)    收藏  举报