使用 kqueue 在 FreeBSD 上开发高性能应用服务器
2010-05-21 00:00:00 来源:WEB开发网29~40,创建监听 socket,将监听 socket 注册到 kq,然后等待事件。 90,这一行就是 kevent 事件等待方法,将 changelist 和 nchangelist 分别置成 NULL 和 0,并且传一个足够大的 eventlist 空间给内核。当有事件过来时,kevent 返回,这时调用 HandleEvent 处理可用事件。
struct kevent data 字段在 accept 和 recv 时的用法
清单 3. 接收数据
101 void HandleEvent(int kq, struct kevent* events, int nevents)
102 {
103 for (int i = 0; i < nevents; i++)
104 {
105 int sock = events[i].ident;
106 int data = events[i].data;
107
108 if (sock == listener_)
109 Accept(kq, data);
110 else
111 Receive(sock, data);
112 }
113 }
114
115 void Accept(int kq, int connSize)
116 {
117 for (int i = 0; i < connSize; i++)
118 {
119 int client = accept(listener_, NULL, NULL);
125
126 if (!Register(kq, client))
131 }
132 }
133
134 void Receive(int sock, int availBytes)
135 {
136 int bytes = recv(sock, buf_, availBytes, 0);
145 Enqueue(buf_, bytes);
146 }
更多精彩
赞助商链接