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)
					}
				}
			}
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号