WEB开发网      濠电娀娼ч崐濠氬疾椤愶附鍋熸い鏍ㄧ〒闂勫嫰鏌﹀Ο渚Ц闁诲氦顕ч湁婵犲﹤楠告禍鍓х磼鏉堛劌绗氶柟宄版嚇閹晠宕归銈嗘濠电偞鍨堕幐鎾磻閹捐秮褰掓偐閻戞﹩妫勯梺鎼炲妼鐎涒晝绮嬪澶樻晝闁挎繂鏌婇敃鍌涚厵閻庢稒锚閻忥絾绻濇繝鍐ㄧ伌闁诡垰鍟村畷鐔碱敂閸♀晙绱樺┑鐐差嚟婵儳螞閸曨剚鍙忛柍鍝勬噹缁€澶嬬箾閹存繄锛嶆鐐灲閹綊宕惰濡插鏌涢妸銉ヮ劉缂佸倸绉归弫鎾绘晸閿燂拷 ---闂備焦瀵уú鈺呭箯閿燂拷
开发学院操作系统Linux/Unix 使用 kqueue 在 FreeBSD 上开发高性能应用服务器 阅读

使用 kqueue 在 FreeBSD 上开发高性能应用服务器

 2010-05-21 00:00:00 来源:WEB开发网 闂備線娼уΛ鎾箯閿燂拷闂備礁鎲¢崹鐢垫崲閹扮増鍎嶆い鎺戝€甸崑鎾斥槈濞嗗秳娌紓鍌氱▌閹凤拷濠电姭鎷冮崨顓濈捕闂侀潧娲ゅú銊╁焵椤掍胶鈯曢柕鍥╁仧缁辩偤鏁撻敓锟�闂備線娼уΛ鎾箯閿燂拷  闂備胶枪缁绘鈻嶉弴銏犳瀬闁绘劕鐏氱€氼剟姊洪崹顕呭剰闁逞屽墮缁夊綊寮婚妸褉鍋撻棃娑欏暈闁伙綀浜埀顒傛暬閸嬪﹪宕伴弽褏鏆﹂柨鐕傛嫹
核心提示: 29~40,创建监听 socket,使用 kqueue 在 FreeBSD 上开发高性能应用服务器(5),将监听 socket 注册到 kq,然后等待事件,当有事件过来时,kevent 返回, 90,这一行就是 kevent 事件等待方法

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 } 

上一页  1 2 3 4 5 6 7 8  下一页

Tags:使用 kqueue FreeBSD

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接