{"id":46090,"date":"2025-07-30T02:21:03","date_gmt":"2025-07-29T18:21:03","guid":{"rendered":"https:\/\/www.wsisp.com\/helps\/46090.html"},"modified":"2025-07-30T02:21:03","modified_gmt":"2025-07-29T18:21:03","slug":"%e3%80%90%e7%bd%91%e7%bb%9c%e7%bc%96%e7%a8%8b%e3%80%91%e4%ba%8b%e4%bb%b6%e9%a9%b1%e5%8a%a8-reactor-%e5%bc%8f%e7%9a%84%e6%9c%8d%e5%8a%a1%e5%99%a8%ef%bc%88epoll%e6%9c%ba%e5%88%b6%ef%bc%89","status":"publish","type":"post","link":"https:\/\/www.wsisp.com\/helps\/46090.html","title":{"rendered":"\u3010\u7f51\u7edc\u7f16\u7a0b\u3011\u4e8b\u4ef6\u9a71\u52a8 reactor \u5f0f\u7684\u670d\u52a1\u5668\uff08EPOLL\u673a\u5236\uff09"},"content":{"rendered":"<\/p>\n<h4>\u6587\u7ae0\u76ee\u5f55<\/h4>\n<ul>\n<li>\u4e1a\u52a1\u62c6\u89e3<\/li>\n<li>\n<ul>\n<li>\u4e8b\u4ef6\u9a71\u52a8\u7684 reactor<\/li>\n<li>\u603b\u6d41\u7a0b\u56fe<\/li>\n<\/ul>\n<\/li>\n<li>C \u4ee3\u7801\u5b9e\u73b0<\/li>\n<li>\n<ul>\n<li>\u51c6\u5907\u5de5\u4f5c<\/li>\n<li>\n<ul>\n<li>\u7f16\u5199\u5934\u6587\u4ef6 reactor.h<\/li>\n<li>\u51c6\u5907\u5934\u6587\u4ef6<\/li>\n<li>\u51c6\u5907\u5b8f\u5b9a\u4e49<\/li>\n<li>\u58f0\u660e\u4e09\u5927\u6a21\u5757\u51fd\u6570\u548c\u57fa\u7840\u7684\u5185\u5b58\u53d8\u91cf\u957f\u5ea6<\/li>\n<li>\u5b9a\u4e49\u5168\u5c40\u53d8\u91cf<\/li>\n<li>\u5b9a\u4e49 EPOLL \u5b9e\u4f8b\u4e8b\u4ef6\u5904\u7406\u7684\u51fd\u6570\u4e0e\u91ca\u653e\u8d44\u6e90\u7684\u51fd\u6570<\/li>\n<li>\u6ce8\u518c\u670d\u52a1\u5668\u76d1\u542c\u5957\u63a5\u5b57\u7684\u51fd\u6570<\/li>\n<\/ul>\n<\/li>\n<li>accept_cb \u6a21\u5757<\/li>\n<li>read_cb \u6a21\u5757<\/li>\n<li>send_cb \u6a21\u5757<\/li>\n<li>\u670d\u52a1\u5668\u4ee3\u7801<\/li>\n<\/ul>\n<\/li>\n<li>\u4ee3\u7801\u8fd0\u884c\u6548\u679c<\/li>\n<li>\u603b\u7ed3<\/li>\n<\/ul>\n<p>\u63a8\u8350\u4e00\u4e2a\u96f6\u58f0\u6559\u80b2\u5b66\u4e60\u6559\u7a0b&#xff0c;\u4e2a\u4eba\u89c9\u5f97\u8001\u5e08\u8bb2\u5f97\u4e0d\u9519&#xff0c;\u5206\u4eab\u7ed9\u5927\u5bb6&#xff1a;[Linux&#xff0c;Nginx&#xff0c;ZeroMQ&#xff0c;MySQL&#xff0c;Redis&#xff0c;fastdfs&#xff0c;MongoDB&#xff0c;ZK&#xff0c;\u6d41\u5a92\u4f53&#xff0c;CDN&#xff0c;P2P&#xff0c;K8S&#xff0c;Docker&#xff0c;TCP\/IP&#xff0c;\u534f\u7a0b&#xff0c;DPDK\u7b49\u6280\u672f\u5185\u5bb9&#xff0c;\u70b9\u51fb\u7acb\u5373\u5b66\u4e60: https:\/\/github.com\/0voice \u94fe\u63a5\u3002<\/p>\n<h2>\u4e1a\u52a1\u62c6\u89e3<\/h2>\n<p>\u5728\u4e0a\u4e00\u7bc7 \u6587\u7ae0 \u91cc&#xff0c;\u6211\u4eec\u4f7f\u7528 EPOLL \u673a\u5236\u53bb\u642d\u5efa\u670d\u52a1\u5668&#xff0c;\u80fd\u591f\u4f4e\u6210\u672c\u9ad8\u6548\u7387\u7684\u6267\u884c \u201c\u591a\u8def\u590d\u7528\u7f51\u7edc I\/O \u9ad8\u5e76\u53d1\u201d\u3002\u5728\u672c\u7bc7\u6587\u7ae0\u91cc&#xff0c;\u6211\u4eec\u5c06\u8981\u628a\u4e0a\u4e00\u7bc7\u95ee\u6587\u7ae0\u7684\u4ee3\u7801\u5207\u5206\u5f00\u6765&#xff0c;\u4f7f\u4e4b\u6a21\u5757\u5316&#xff0c;\u66f4\u597d\u5730\u6ee1\u8db3\u4e1a\u52a1\u7279\u8272\u5316\u9700\u6c42\u3002\u6bd4\u5982&#xff0c;\u6700\u57fa\u7840\u7684\u7f51\u7edc I \u4efb\u52a1&#xff0c;\u5c31\u662f\u8bfb\u53d6\u4fe1\u606f&#xff0c;\u5982\u679c\u4e1a\u52a1\u6709\u7279\u6b8a\u9700\u6c42&#xff0c;\u6211\u4eec\u8981\u7279\u6b8a\u5904\u7406\u6240\u8bfb\u53d6\u7684\u4fe1\u606f&#xff0c;\u6211\u4eec\u5c31\u8981\u4e13\u95e8\u5728\u6e90\u4ee3\u7801\u7684\u57fa\u7840\u4e0a\u989d\u5916\u5199\u591a\u51e0\u4e2a\u4e1a\u52a1\u8bfb\u51fd\u6570&#xff1b;\u518d\u6bd4\u5982&#xff0c;\u6700\u57fa\u7840\u7684\u7f51\u7edc O \u4efb\u52a1&#xff0c;\u662f\u53d1\u9001\u7279\u5b9a\u8d44\u6e90\u4fe1\u606f&#xff0c;\u5982\u679c\u4e1a\u52a1\u6709\u7279\u6b8a\u9700\u6c42&#xff0c;\u6211\u4eec\u8981\u7279\u6b8a\u5904\u7406\u5c06\u8981\u53d1\u9001\u7684\u4fe1\u606f&#xff0c;\u6bd4\u5982\u4ee5 HTTP \u62a5\u6587\u5f62\u5f0f\u53d1\u9001\u7ed9\u7528\u6237&#xff0c;\u4f7f\u5f97\u7528\u6237\u53ef\u4ee5\u5728\u6d4f\u89c8\u5668\u4e0a\u770b\u5230\u6211\u4eec\u6240\u53d1\u7684\u5185\u5bb9\u3002<\/p>\n<p>\u603b\u4e4b&#xff0c;\u6211\u4eec\u8981\u5b9e\u73b0\u4e00\u4e2a\u670d\u52a1\u5668\u5e95\u5ea7&#xff0c;\u4e00\u4e2a\u53ef\u6839\u636e\u4e1a\u52a1\u5185\u5bb9\u505a\u7b80\u5355\u6269\u5c55\u7684\u670d\u52a1\u5668\u4ee3\u7801&#xff0c;\u964d\u4f4e\u5f00\u53d1\u96be\u5ea6\u3002\u6211\u4eec\u79f0\u4e4b\u4e3a \u201c\u4e8b\u4ef6\u9a71\u52a8\u7684 reactor\u201d\u3002<\/p>\n<h3>\u4e8b\u4ef6\u9a71\u52a8\u7684 reactor<\/h3>\n<p>reactor \u987e\u540d\u601d\u4e49\u5c31\u662f\u53cd\u5e94\u5668\u7684\u539f\u7406&#xff0c;\u4e0d\u540c\u7684\u4fe1\u53f7\u5c31\u4f1a\u6709\u4e0d\u540c\u7684\u53cd\u5e94&#xff0c;\u56de\u987e\u4e0a\u4e00\u7bc7 \u6587\u7ae0 \u7684 EPOLL \u670d\u52a1\u5668&#xff0c;\u4e3b\u8981\u6709\u4e09\u7c7b\u7f51\u7edc I\/O \u4efb\u52a1<\/p>\n<ul>\n<li>\u8f93\u5165\u4efb\u52a11&#xff1a;\u76d1\u542c\u5957\u63a5\u5b57 sockfd \u76d1\u542c\u5230\u6765\u8bbf IP&#xff0c;\u8bfb\u53d6\u8fde\u63a5\u4fe1\u606f&#xff0c;\u5206\u914d\u5957\u63a5\u5b57 clientfd&#xff0c;\u4ee5\u8d1f\u8d23\u5bf9\u5e94\u7f51\u7edc I\/O\u3002<\/li>\n<li>\u8f93\u5165\u4efb\u52a12&#xff1a;\u5ba2\u6237\u7aef\u53d1\u6765\u4fe1\u606f&#xff0c;epoll \u8c03\u7528\u64cd\u4f5c\u7cfb\u7edf\u5185\u6838\u901a\u77e5\u8fdb\u7a0b\u5904\u7406\u8bfb\u4e8b\u4ef6\u3002<\/li>\n<li>\u8f93\u51fa\u4efb\u52a1&#xff1a;\u6cbf\u7740\u5bf9\u5e94\u5957\u63a5\u5b57 clientfd \u5411\u5ba2\u6237\u7aef\u53d1\u9001\u4fe1\u606f\u3002<\/li>\n<\/ul>\n<p>\u4e5f\u5c31\u662f\u8bf4\u6211\u4eec\u8981\u628a\u4ee3\u7801\u5206\u6210\u4e09\u4e2a\u6a21\u5757&#xff0c;\u5b9e\u73b0\u4e09\u79cd\u56e0\u4e8b\u4ef6\u4fe1\u53f7\u800c\u5f02\u7684\u53cd\u5e94&#xff0c;\u7efc\u5408\u8d77\u6765\u5c31\u662f\u4e00\u4e2a\u53cd\u5e94\u5668 reactor\u3002\u6211\u4eec\u5728\u6bcf\u4e00\u4e2a\u6a21\u5757\u4e2d\u9884\u7559\u4e00\u4e2a\u5730\u65b9\u7ed9\u5404\u81ea\u7684\u4e1a\u52a1\u4ee3\u7801\u51fd\u6570\u3002\u8fd9\u4e09\u4e2a\u6a21\u5757\u6211\u4eec\u5206\u522b\u8bb0\u6210<\/p>\n<li>accept_cb \u6a21\u5757&#xff0c;<\/li>\n<li>read_cb \u6a21\u5757&#xff0c;<\/li>\n<li>send_cb \u6a21\u5757<\/li>\n<h3>\u603b\u6d41\u7a0b\u56fe<\/h3>\n<p>\u4e3a\u4e86\u7b80\u5316\u8868\u8fbe&#xff0c;\u907f\u514d\u50cf\u4e0a\u4e00\u7bc7 \u6587\u7ae0 \u90a3\u6837\u5199\u7684\u90a3\u4e48\u590d\u6742\u3002\u6211\u4eec\u4e5f\u5206\u6a21\u5757\u6765\u5199\u6d41\u7a0b\u56fe&#xff0c;\u5404\u4e2a\u6a21\u5757\u518d\u7ed9\u51fa\u5b83\u81ea\u5df1\u7684\u6d41\u7a0b\u56fe\u3002\u6211\u4eec\u5148\u7ed9\u603b\u4f53\u7684\u6d41\u7a0b\u56fe\u3002<\/p>\n<p>   Created with Rapha\u00ebl 2.3.0<\/p>\n<p>    \u5f00\u59cb<\/p>\n<p>    init_server \u5360\u7528\u82e5\u5e72\u4e2a\u7aef\u53e3\u5efa\u7acb\u670d\u52a1\u5668\u5957\u63a5\u5b57 sockfds&#xff0c;\u4f7f\u8fd9\u4e9b sockfds \u5904\u4e8e\u76d1\u542c\u72b6\u6001<\/p>\n<p>    \u521b\u5efa epoll \u5b9e\u4f8b epfd&#xff08;\u88ab\u4e00\u4e2a\u5957\u63a5\u5b57\u6240\u8868\u793a&#xff09;&#xff0c;\u4f5c\u4e3a\u603b\u96c6<\/p>\n<p>    \u521b\u5efa\u957f\u5ea6\u56fa\u5b9a\u7684 struct epoll_event \u4e8b\u4ef6\u6570\u7ec4&#xff0c;\u4f5c\u4e3a epfd \u5185\u6838\u4e2d\u5c31\u7eea\u94fe\u8868\u7684\u8a8a\u5199\u767d\u7eb8<\/p>\n<p>    \u628a\u82e5\u5e72\u4e2a\u76d1\u542c\u5957\u63a5\u5b57 sockfds \u7684\u5173\u6ce8\u4e8b\u4ef6\u7c7b\u578b\u8bbe\u7f6e\u6210 EPOLLIN&#xff0c;\u4ee5 epoll_event \u5f62\u5f0f\u52a0\u5165\u5b9e\u4f8b epfd<\/p>\n<p>    \u8c03\u7528 epoll_wait \u51fd\u6570&#xff0c; epoll \u5b9e\u4f8b\u540c\u65f6\u76d1\u89c6\u670d\u52a1\u5668\u7684\u76d1\u542c\u5957\u63a5\u5b57 sockfd \u4ee5\u53ca\u6240\u6ce8\u518c\u6240\u6709\u7684\u6765\u8bbf IP \u8fde\u63a5\u7684\u5957\u63a5\u5b57 clientfd&#xff0c;\u5e76\u4e14\u7edf\u8ba1\u54cd\u5e94\u6570\u91cf nready<\/p>\n<p>    \u5bf9\u8fd9 nready \u4e2a\u5185\u6838\u54cd\u5e94\u7684\u5957\u63a5\u5b57-\u4e8b\u4ef6&#xff0c;\u6211\u4eec\u9010\u4e2a\u6765\u5904\u7406<\/p>\n<p>    \u8fd9 nready \u4e2a\u5957\u63a5\u5b57-\u4e8b\u4ef6\u662f\u5426\u8fd8\u6ca1\u6709\u5904\u7406\u5b8c&#xff1f;<\/p>\n<p>     \u5f53\u524d\u6240\u68c0\u67e5\u7684\u5957\u63a5\u5b57\u662f\u5426\u6b63\u5e38&#xff08;\u6ca1\u51fa\u73b0\u9519\u8bef EPOLLERR &#xff09;&#xff1f;<\/p>\n<p>     \u5f53\u524d\u6240\u68c0\u67e5\u7684\u5957\u63a5\u5b57\u4e0d\u662f\u76d1\u63a7\u5957\u63a5\u5b57\u5417&#xff1f;<\/p>\n<p>    \u5f53\u524d\u6240\u68c0\u67e5\u7684 \u5957\u63a5\u5b57-\u4e8b\u4ef6 \u4e0d\u662f EPOLLIN \u4e8b\u4ef6\u5417&#xff1f;<\/p>\n<p>    \u5f53\u524d\u6240\u68c0\u67e5\u7684 \u5957\u63a5\u5b57-\u4e8b\u4ef6 \u4e0d\u662f EPOLLOUT \u4e8b\u4ef6\u5417&#xff1f;<\/p>\n<p>    \u5173\u95ed\u5957\u63a5\u5b57&#xff0c;\u91ca\u653e\u8d44\u6e90&#xff0c;\u5feb\u8fdb\u5230\u4e0b\u4e00\u4e2a\u5957\u63a5\u5b57-\u4e8b\u4ef6<\/p>\n<p>    \u5df2\u5904\u7406\u7684 \u5957\u63a5\u5b57-\u4e8b\u4ef6 \u8ba1\u6570\u52a0 1<\/p>\n<p>    send_cb \u6a21\u5757&#xff0c;\u53d1\u9001\u5185\u5bb9\u7ed9\u5ba2\u6237\u7aef<\/p>\n<p>    recv_cb \u6a21\u5757&#xff0c;ET \u8fb9\u6cbf\u6a21\u5f0f\u9700\u5faa\u73af\u8bfb\u53d6 I\/O \u6587\u4ef6<\/p>\n<p>    accept_cb \u6a21\u5757&#xff0c;\u6ce8\u518c\u65b0\u7684\u5957\u63a5\u5b57-\u4e8b\u4ef6\u5165 EPOLL \u5b9e\u4f8b<\/p>\n<p>    \u5173\u95ed\u5957\u63a5\u5b57&#xff0c;\u91ca\u653e\u8d44\u6e90&#xff0c;\u5feb\u8fdb\u5230\u4e0b\u4e00\u4e2a\u5957\u63a5\u5b57-\u4e8b\u4ef6<\/p>\n<p>    yes<\/p>\n<p>    no<\/p>\n<p>    yes<\/p>\n<p>    no<\/p>\n<p>    yes<\/p>\n<p>    no<\/p>\n<p>    yes<\/p>\n<p>    no<\/p>\n<p>    yes<\/p>\n<p>    no<\/p>\n<h2>C \u4ee3\u7801\u5b9e\u73b0<\/h2>\n<h3>\u51c6\u5907\u5de5\u4f5c<\/h3>\n<h4>\u7f16\u5199\u5934\u6587\u4ef6 reactor.h<\/h4>\n<p>\u6b64\u6587\u4ef6\u5185\u5b9a\u4e49\u4e86\u7279\u6b8a\u7684\u7ed3\u6784\u4f53&#xff0c;\u8bb0\u5f55\u4e86\u82e5\u5e72\u4e2a\u5957\u63a5\u5b57\u6bcf\u6b21 I\/O \u7684\u5185\u5bb9<\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">ifndef<\/span> <span class=\"token expression\">__SERVER_H__<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">__SERVER_H__<\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">BUFFER_LENGTH<\/span><span class=\"token expression\"><span class=\"token number\">1024<\/span><\/span><\/span><\/p>\n<p><span class=\"token keyword\">typedef<\/span> <span class=\"token keyword\">int<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>RCALLBACK<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> fd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">conn<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">int<\/span> fd<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/\u7533\u8bf7\u7f13\u51b2\u533a\u7684\u5927\u5c0f 1024 &#8211;&gt; 2048 &#8230;&#8230; \u9010\u6b65\u9012\u589e KB&#xff0c;\u5728 accept_cb \u51fd\u6570\u4e2d\u7528 malloc \u5efa\u7acb&#xff0c;\u5728 recv_cb \u548c send_cb \u51fd\u6570\u4e2d\u7528 realloc \u51fd\u6570\u8c03\u6574\u5176\u5927\u5c0f<\/span><br \/>\n<span class=\"token keyword\">char<\/span> <span class=\"token operator\">*<\/span>rbuffer<span class=\"token punctuation\">;<\/span><span class=\"token comment\">\/\/\u8fb9\u6cbf\u6a21\u5f0f\u4e0b&#xff0c;\u6211\u4eec\u662f\u4e0d\u80fd\u591f\u5047\u8bbe\u6211\u4eec\u8981\u8bfb\u53d6\u603b\u91cf\u591a\u5c11\u7684\u5185\u5bb9&#xff0c;\u53ea\u80fd\u662f\u5168\u90e8\u8bfb\u53d6<\/span><br \/>\n<span class=\"token class-name\">ssize_t<\/span> rlength<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token class-name\">ssize_t<\/span> rcap<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u8bfb\u7f13\u51b2\u533a\u5bb9\u91cf<\/span><\/p>\n<p><span class=\"token keyword\">char<\/span> <span class=\"token operator\">*<\/span>wbuffer<span class=\"token punctuation\">;<\/span><span class=\"token comment\">\/\/\u8fb9\u6cbf\u6a21\u5f0f\u4e0b&#xff0c;\u6211\u4eec\u662f\u4e0d\u80fd\u591f\u5047\u8bbe\u6211\u4eec\u8981\u8bfb\u53d6\u603b\u91cf\u591a\u5c11\u7684\u5185\u5bb9&#xff0c;\u53ea\u80fd\u662f\u5168\u90e8\u5199\u5165<\/span><br \/>\n<span class=\"token class-name\">ssize_t<\/span> wlength<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token class-name\">ssize_t<\/span> wcap<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u5199\u7f13\u51b2\u533a\u5bb9\u91cf<\/span><\/p>\n<p>RCALLBACK send_callback<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">union<\/span> <span class=\"token punctuation\">{<\/span><br \/>\nRCALLBACK recv_callback<span class=\"token punctuation\">;<\/span><br \/>\nRCALLBACK accept_callback<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span> r_action<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">endif<\/span><\/span><\/p>\n<p>\u5176\u4e2d\u4ee5\u4e0b\u4ee3\u7801\u7ed3\u6784\u662f\u5934\u6587\u4ef6\u4e3a\u4e86\u4fdd\u62a4\u5b9a\u4e49\u800c\u4e13\u95e8\u8bbe\u7f6e\u7684&#xff0c;\u907f\u514d\u540c\u4e00\u4e2a\u5934\u6587\u4ef6\u91cd\u590d\u5b9a\u4e49<\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">ifndef<\/span> <span class=\"token expression\">__SERVER_H__<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">__SERVER_H__<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u5b9a\u4e49\u7c7b\u578b<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">endif<\/span><\/span><\/p>\n<p>\u6240\u5b9a\u4e49\u7684 struct conn \u7c7b\u578b\u4e2d\u6709\u4e00\u4e2a\u6210\u5458\u503c\u5f97\u6ce8\u610f&#xff0c;\u90a3\u5c31\u662f r_action&#xff0c;\u5b83\u662f\u4e00\u4e2a\u8054\u5408\u4f53\u800c\u975e\u7ed3\u6784\u4f53&#xff0c;\u5b83\u6709\u4e00\u8bcd\u591a\u4e49\u6027&#xff0c;\u6211\u4eec\u77e5\u9053 RCALLBACK \u662f\u4e00\u4e2a\u56de\u8c03\u51fd\u6570&#xff0c;<\/p>\n<p><span class=\"token keyword\">typedef<\/span> <span class=\"token keyword\">int<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>RCALLBACK<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> fd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>\u56de\u8c03\u51fd\u6570\u53ef\u4ee5\u662f\u4efb\u4f55 \u540c (\u8fd4\u56de\u7c7b\u578b\u3001\u4f20\u5165\u53c2\u6570\u7c7b\u578b)\u7684\u51fd\u6570\u3002\u800c\u5728\u7c7b\u578b struct conn \u4e2d\u7684\u6210\u5458 r_action \u5c31\u597d\u6bd4 \u201c\u9762\u5411\u5bf9\u8c61\u7f16\u7a0b\u4e2d\u7684\u591a\u6001\u201d&#xff0c;\u6210\u5458\u90fd\u53eb\u540c\u4e00\u4e2a\u540d\u5b57&#xff0c;\u4f46\u662f\u5177\u4f53\u7684\u5b9a\u4e49\u662f\u4e0d\u4e00\u6837\u7684\u3002\u4e0b\u6587\u7684\u4e3b\u51fd\u6570&#xff08;\u670d\u52a1\u5668\u4ee3\u7801&#xff09;\u4e2d\u4f1a\u51fa\u73b0\u4e24\u884c\u7c7b\u4f3c\u7684\u4ee3\u7801&#xff0c;\u5c31\u662f\u6765\u81ea\u4e8e\u56de\u8c03\u51fd\u6570\u7684\u4f7f\u7528&#xff0c;\u5b83\u4eec\u5206\u522b\u662f&#xff08;\u8bfb\u8005\u53ef\u4ee5\u901a\u7bc7\u9605\u8bfb\u5b8c\u8fd9\u7bc7\u6587\u7ae0\u540e\u518d\u56de\u6765&#xff09;<\/p>\n<p><span class=\"token number\">1<\/span>\u3001conn_list<span class=\"token punctuation\">[<\/span>sockfd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>r_action<span class=\"token punctuation\">.<\/span>accept_callback <span class=\"token operator\">&#061;<\/span> accept_cb<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token number\">2<\/span>\u3001conn_list<span class=\"token punctuation\">[<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>r_action<span class=\"token punctuation\">.<\/span>recv_callback <span class=\"token operator\">&#061;<\/span> recv_cb<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token number\">3<\/span>\u3001conn_list<span class=\"token punctuation\">[<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>send_callback <span class=\"token operator\">&#061;<\/span> send_cb<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token number\">4<\/span>\u3001<span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> j <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> j <span class=\"token operator\">&lt;<\/span> MAX_PORTS<span class=\"token punctuation\">;<\/span> j<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>connfd <span class=\"token operator\">&#061;&#061;<\/span> listen_fds<span class=\"token punctuation\">[<\/span>j<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\nconn_list<span class=\"token punctuation\">[<\/span>connfd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>r_action<span class=\"token punctuation\">.<\/span><span class=\"token function\">accept_callback<\/span><span class=\"token punctuation\">(<\/span>connfd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\nis_listener <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token number\">5<\/span>\u3001<span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>conn_list<span class=\"token punctuation\">[<\/span>connfd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>r_action<span class=\"token punctuation\">.<\/span><span class=\"token function\">recv_callback<\/span><span class=\"token punctuation\">(<\/span>connfd<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&gt;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token comment\">\/\/ \u8fd4\u56de0\u8868\u793a\u6210\u529f<\/span><br \/>\n<span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;[%ld] RECV: %s\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span>conn_list<span class=\"token punctuation\">[<\/span>connfd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>rlength<span class=\"token punctuation\">,<\/span> conn_list<span class=\"token punctuation\">[<\/span>connfd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>rbuffer<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/\/\u8fde\u63a5\u5728 recv \u51fd\u6570\u5904\u65e9\u5df2\u91ca\u653e<\/span><br \/>\n<span class=\"token keyword\">continue<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u8df3\u8fc7\u540e\u7eed\u5904\u7406<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token number\">6<\/span>\u3001conn_list<span class=\"token punctuation\">[<\/span>connfd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">send_callback<\/span><span class=\"token punctuation\">(<\/span>connfd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<h4>\u51c6\u5907\u5934\u6587\u4ef6<\/h4>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;errno.h&gt;<\/span><span class=\"token comment\">\/\/ \u8fd9\u662f\u5168\u5c40\u53d8\u91cf errno&#xff0c;\u7528\u4e8e\u5065\u58ee\u7684\u8bfb\u53d6\u529f\u80fd<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;stdio.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;stdlib.h&gt;<\/span><span class=\"token comment\">\/\/ \u52a8\u6001\u5185\u5b58\u5206\u914d<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;sys\/socket.h&gt;<\/span><span class=\"token comment\">\/\/ \u521b\u5efa\u548c\u7ba1\u7406\u5957\u63a5\u5b57\u3002\u7ed1\u5b9a\u5730\u5740\u3001\u76d1\u542c\u8fde\u63a5\u548c\u63a5\u53d7\u8fde\u63a5\u3002\u53d1\u9001\u548c\u63a5\u6536\u6570\u636e\u3002\u8bbe\u7f6e\u548c\u83b7\u53d6\u5957\u63a5\u5b57\u9009\u9879\u3002 socket()\u3001connect()\u3001sendto()\u3001recvfrom()\u3001accept()<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;netinet\/in.h&gt;<\/span><span class=\"token comment\">\/\/ \u63d0\u4f9b\u4e86\u7ed3\u6784\u4f53 sockaddr_in<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;string.h&gt;<\/span><span class=\"token comment\">\/\/ strerror \u51fd\u6570<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;fcntl.h&gt;<\/span><span class=\"token comment\">\/\/ \u7528\u4e8e\u66f4\u6539\u5957\u63a5\u5b57\u7684\u6a21\u5f0f&#xff0c;\u6bd4\u5982\u975e\u963b\u585e\u6a21\u5f0f<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;unistd.h&gt;<\/span><span class=\"token comment\">\/\/ close \u51fd\u6570&#xff0c;\u5173\u95ed\u5957\u63a5\u5b57<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;sys\/types.h&gt;<\/span><span class=\"token comment\">\/\/ ssize_t \u662f\u4e00\u4e2a\u6709\u7b26\u53f7\u7684\u6574\u6570\u7c7b\u578b<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;sys\/epoll.h&gt;<\/span><span class=\"token comment\">\/\/ EPOLL \u9ad8\u5e76\u53d1\u673a\u5236<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;sys\/time.h&gt;<\/span><span class=\"token comment\">\/\/ timeval \u7c7b\u578b&#xff0c;\u7528\u4e8e\u8868\u8ff0\u7b49\u5f85\u65f6\u95f4<\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;reactor.h&#034;<\/span><span class=\"token comment\">\/\/ \u5e95\u5c42\u6570\u636e\u7ed3\u6784&#xff0c;\u56de\u8c03\u51fd\u6570\u3001\u4e1a\u52a1\u7aef\u51fd\u6570\u7684\u7edf\u4e00\u58f0\u660e<\/span><\/span><\/p>\n<p>\u6b64\u5904\u6ce8\u610f\u5230\u6211\u4eec\u662f\u5bfc\u5165\u4e86\u521a\u521a\u6240\u5199\u7684\u5934\u6587\u4ef6 \u201creactor.h\u201d\u3002<\/p>\n<h4>\u51c6\u5907\u5b8f\u5b9a\u4e49<\/h4>\n<p>\u8fd9\u4e2a\u4ee3\u7801\u53ef\u5efa\u7acb\u4e00\u767e\u591a\u4e07\u4e2a\u8fde\u63a5&#xff0c;\u4e0b\u4e00\u7bc7\u6587\u7ae0\u91cc\u6211\u5c06\u4ecb\u7ecd\u767e\u4e07\u8fde\u63a5\u7684\u65b9\u6cd5\u3002\u4e3a\u4e86\u91ca\u653e\u8fd9\u767e\u4e07\u8fde\u63a5\u7684\u4ee3\u7801\u6f5c\u529b&#xff0c;\u6211\u4eec\u8981\u5b9a\u4e49\u8fd9\u4e09\u4e2a\u5b8f\u3002<\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">CONNECTION_SIZE<\/span><span class=\"token expression\"><span class=\"token number\">1048576<\/span> <\/span><span class=\"token comment\">\/\/ 1024 * 1024&#xff0c;\u5373\u6211\u4eec\u8981\u6d4b\u8bd5 1 M \u7684\u8fde\u63a5\u6570<\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">MAX_PORTS<\/span><span class=\"token expression\"><span class=\"token number\">20<\/span><\/span><span class=\"token comment\">\/\/\u8be5\u670d\u52a1\u5668\u5360\u7528\u672c\u5730 20 \u4e2a\u7aef\u53e3&#xff0c;\u7528\u4ee5\u5efa\u7acb\u7f51\u7edc I\/O &#xff0c;\u66f4\u597d\u5730\u5b9e\u73b0\u767e\u4e07\u5e76\u53d1<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/\/\u8fd9\u662f\u4e00\u4e2a\u5b8f\u64cd\u4f5c&#xff0c;\u662f\u4e24\u4e2a\u65f6\u95f4\u6233\u7684\u76f8\u51cf&#xff0c;\u8868\u793a \u201c\u8ba1\u65f6\u201d<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name function\">TIME_SUB_MS<\/span><span class=\"token expression\"><span class=\"token punctuation\">(<\/span>tv1<span class=\"token punctuation\">,<\/span> tv2<span class=\"token punctuation\">)<\/span>  <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>tv1<span class=\"token punctuation\">.<\/span>tv_sec <span class=\"token operator\">&#8211;<\/span> tv2<span class=\"token punctuation\">.<\/span>tv_sec<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span> <span class=\"token number\">1000<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token punctuation\">(<\/span>tv1<span class=\"token punctuation\">.<\/span>tv_usec <span class=\"token operator\">&#8211;<\/span> tv2<span class=\"token punctuation\">.<\/span>tv_usec<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token number\">1000<\/span><span class=\"token punctuation\">)<\/span><\/span><\/span><\/p>\n<p>MAX_PORTS \u662f\u7528\u6765\u652f\u6301\u767e\u4e07\u8fde\u63a5\u7684&#xff0c;CONNECTION_SIZE \u662f\u6307\u5b9a\u6700\u5927\u7684\u8fde\u63a5\u6570\u3002TIME_SUB_MS(tv1, tv2) \u5b8f\u64cd\u4f5c\u662f\u7528\u6765\u6d4b\u8bd5\u670d\u52a1\u5668\u7684\u6027\u80fd&#xff0c;\u7528\u6765\u8ba1\u7b97\u8fd0\u884c\u7684\u65f6\u957f<\/p>\n<h4>\u58f0\u660e\u4e09\u5927\u6a21\u5757\u51fd\u6570\u548c\u57fa\u7840\u7684\u5185\u5b58\u53d8\u91cf\u957f\u5ea6<\/h4>\n<p><span class=\"token comment\">\/\/ \u58f0\u660e\u51fd\u6570&#xff0c;\u5148\u5199\u4e3b\u51fd\u6570\u7684\u4ee3\u7801&#xff0c;\u9002\u7528\u4e8e\u5e95\u5c42\u94fe\u63a5\u7684<\/span><br \/>\n<span class=\"token keyword\">int<\/span> <span class=\"token function\">accept_cb<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> fd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">int<\/span> <span class=\"token function\">recv_cb<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> fd <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">int<\/span> <span class=\"token function\">send_cb<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> fd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">BUFFER_LENGTH<\/span><span class=\"token expression\"><span class=\"token number\">1024<\/span><\/span><\/span><\/p>\n<p>\u65e0\u8bba\u662f\u7f51\u7edc\u8f93\u5165\u8fd8\u662f\u8f93\u51fa&#xff0c;\u6bcf\u6b21\u64cd\u4f5c\u7684\u5b57\u8282\u6570\u4e0a\u9650\u90fd\u662f BUFFER_LENGTH \u4e2a&#xff0c;\u6162\u6162\u7684\u9010\u6b65\u5730\u6709\u6761\u4e0d\u7d0a\u5730\u63a5\u6536\u53d1\u9001\u4fe1\u606f&#xff0c;\u800c\u975e\u4e00\u6b21\u8fc7\u628a\u6240\u6709\u5185\u5bb9\u90fd\u541e\u4e0b\u3002<\/p>\n<h4>\u5b9a\u4e49\u5168\u5c40\u53d8\u91cf<\/h4>\n<p>\u5f53\u6211\u4eec\u5b9a\u4e49\u4e86\u67d0\u4e2a\u5168\u5c40\u53d8\u91cf&#xff0c;\u6211\u4eec\u6240\u5b9a\u4e49\u6240\u6709\u51fd\u6570\u90fd\u53ef\u4ee5\u5728\u4e0d\u4f20\u5165\u8be5\u53d8\u91cf\u7684\u524d\u63d0\u4e0b\u5bf9\u5176\u8fdb\u884c\u6539\u53d8&#xff0c;\u65e0\u901a\u8fc7\u6548\u4eff\u4e00\u822c\u51fd\u6570\u7684\u4f20\u5165\u53c2\u6570\u524d\u5916\u52a0\u53d6\u5740\u7b26&#xff0c;\u4ee5\u6c42\u5728\u5185\u5b58\u5c42\u6b21\u6539\u53d8\u53d8\u91cf\u672c\u8eab\u3002<\/p>\n<p>\u5168\u5c40\u53d8\u91cf\u5e76\u4e0d\u5360\u7528\u7ebf\u7a0b\u6808\u7684\u5185\u5b58\u7a7a\u95f4&#xff0c;\u800c\u662f\u5b58\u50a8\u5728 \u201c\u9759\u6001\u6570\u636e\u533a\u201d \u4e4b\u4e2d\u3002<\/p>\n<p><span class=\"token keyword\">int<\/span> epfd <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><span class=\"token comment\">\/\/  epoll \u4e8b\u4ef6\u6587\u4ef6\u5957\u63a5\u5b57&#xff0c;\u5b83\u7533\u8bf7\u4e3a\u4e00\u4e2a\u5168\u5c40\u53d8\u91cf<\/span><br \/>\n<span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">timeval<\/span> begin<span class=\"token punctuation\">;<\/span><span class=\"token comment\">\/\/\u58f0\u660e\u4e00\u4e2a\u5168\u5c40\u65f6\u95f4\u6233\u53d8\u91cf<\/span><\/p>\n<p><span class=\"token comment\">\/\/\u672c EPOLL \u5b9e\u4f8b\u4e00\u6b21\u6700\u591a\u5efa\u7acb 1 M &#061; 1024*1024 \u4e2a\u7f51\u7edc I\/O \u4e8b\u4ef6&#xff08;\u767e\u4e07\u5e76\u53d1&#xff09;&#xff1b;\u8fd9\u53c8\u88ab\u79f0\u4e4b\u4e3a\u603b\u4f53\u4e8b\u4ef6\u96c6<\/span><br \/>\n<span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">conn<\/span> conn_list<span class=\"token punctuation\">[<\/span>CONNECTION_SIZE<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u8fd9\u662f\u4e00\u4e2a\u5168\u5c40\u53d8\u91cf<\/span><br \/>\n<span class=\"token comment\">\/\/\u5728\u51fd\u6570\u4e2d\u5bf9\u5168\u5c40\u53d8\u91cf\u8d4b\u503c\u540e&#xff0c;\u51fd\u6570\u6267\u884c\u5b8c\u6bd5\u540e\u5168\u5c40\u53d8\u91cf\u7684\u503c\u4f1a\u4fdd\u6301\u4fee\u6539\u540e\u7684\u503c\u3002\u5168\u5c40\u53d8\u91cf\u7684\u7279\u6027\u51b3\u5b9a\u4e86\u5b83\u7684\u503c\u5728\u7a0b\u5e8f\u8fd0\u884c\u671f\u95f4\u4f1a\u6301\u4e45\u5b58\u5728&#xff0c;\u4e0d\u4f1a\u56e0\u4e3a\u51fd\u6570\u6267\u884c\u7ed3\u675f\u800c\u91cd\u7f6e\u3002<\/span><\/p>\n<p>\u5982\u679c\u8bfb\u8005\u4e0d\u77e5\u9053\u9759\u6001\u6570\u636e\u533a\u7684\u5927\u5c0f\u662f\u591a\u5c11&#xff0c;\u53ef\u4ee5\u901a\u8fc7\u4ee5\u4e0b\u65b9\u6cd5\u67e5\u770b&#xff08;\u6211\u662f\u7528 Linux \u7cfb\u7edf\u7f16\u7a0b\u7684&#xff09;<\/p>\n<p>qiming&#064;qiming:~\/share\/CTASK\/TCP_test$ <span class=\"token builtin class-name\">ulimit<\/span> -a<br \/>\nreal-time non-blocking <span class=\"token function\">time<\/span>  <span class=\"token punctuation\">(<\/span>microseconds, -R<span class=\"token punctuation\">)<\/span> unlimited<br \/>\ncore <span class=\"token function\">file<\/span> size              <span class=\"token punctuation\">(<\/span>blocks, -c<span class=\"token punctuation\">)<\/span> <span class=\"token number\">0<\/span><br \/>\ndata seg size               <span class=\"token punctuation\">(<\/span>kbytes, -d<span class=\"token punctuation\">)<\/span> unlimited<br \/>\nscheduling priority                 <span class=\"token punctuation\">(<\/span>-e<span class=\"token punctuation\">)<\/span> <span class=\"token number\">0<\/span><br \/>\n<span class=\"token function\">file<\/span> size                   <span class=\"token punctuation\">(<\/span>blocks, -f<span class=\"token punctuation\">)<\/span> unlimited<br \/>\npending signals                     <span class=\"token punctuation\">(<\/span>-i<span class=\"token punctuation\">)<\/span> <span class=\"token number\">15051<\/span><br \/>\nmax locked memory           <span class=\"token punctuation\">(<\/span>kbytes, -l<span class=\"token punctuation\">)<\/span> <span class=\"token number\">496096<\/span><br \/>\nmax memory size             <span class=\"token punctuation\">(<\/span>kbytes, -m<span class=\"token punctuation\">)<\/span> unlimited<br \/>\n<span class=\"token function\">open<\/span> files                          <span class=\"token punctuation\">(<\/span>-n<span class=\"token punctuation\">)<\/span> <span class=\"token number\">1024<\/span><br \/>\npipe size                <span class=\"token punctuation\">(<\/span><span class=\"token number\">512<\/span> bytes, -p<span class=\"token punctuation\">)<\/span> <span class=\"token number\">8<\/span><br \/>\nPOSIX message queues         <span class=\"token punctuation\">(<\/span>bytes, -q<span class=\"token punctuation\">)<\/span> <span class=\"token number\">819200<\/span><br \/>\nreal-time priority                  <span class=\"token punctuation\">(<\/span>-r<span class=\"token punctuation\">)<\/span> <span class=\"token number\">0<\/span><br \/>\nstack size                  <span class=\"token punctuation\">(<\/span>kbytes, -s<span class=\"token punctuation\">)<\/span> <span class=\"token number\">8192<\/span><br \/>\ncpu <span class=\"token function\">time<\/span>                   <span class=\"token punctuation\">(<\/span>seconds, -t<span class=\"token punctuation\">)<\/span> unlimited<br \/>\nmax user processes                  <span class=\"token punctuation\">(<\/span>-u<span class=\"token punctuation\">)<\/span> <span class=\"token number\">15051<\/span><br \/>\nvirtual memory              <span class=\"token punctuation\">(<\/span>kbytes, -v<span class=\"token punctuation\">)<\/span> unlimited<br \/>\n<span class=\"token function\">file<\/span> locks                          <span class=\"token punctuation\">(<\/span>-x<span class=\"token punctuation\">)<\/span> unlimited<\/p>\n<p>\u6211\u4eec\u6ce8\u610f\u5230<\/p>\n<p>data seg size               <span class=\"token punctuation\">(<\/span>kbytes, -d<span class=\"token punctuation\">)<\/span> unlimited<\/p>\n<ul>\n<li>data seg size&#xff1a;\u8868\u793a\u7a0b\u5e8f\u6570\u636e\u6bb5\u7684\u6700\u5927\u5927\u5c0f&#xff0c;\u5355\u4f4d\u4e3a KB\u3002\u6570\u636e\u6bb5\u5305\u62ec\u5168\u5c40\u53d8\u91cf\u548c\u9759\u6001\u53d8\u91cf&#xff0c;\u8fd9\u4e9b\u53d8\u91cf\u5b58\u50a8\u5728\u5168\u5c40\u6570\u636e\u533a\u4e2d\u3002<\/li>\n<\/ul>\n<p>\u8fd9\u8bf4\u660e\u9759\u6001\u6570\u636e\u533a\u6ca1\u6709\u7279\u522b\u7684\u9650\u5236&#xff0c;\u4ec5\u7531\u64cd\u4f5c\u7cfb\u7edf\u7684\u5185\u5b58\u6240\u9650\u5236\u3002\u6545\u800c\u6211\u4eec\u4e0d\u5fc5\u62c5\u5fc3 conn_list \u8fd9\u4e2a\u4e00\u767e\u4e07\u591a\u5143\u7684\u8d85\u5927\u6570\u7ec4\u4f1a\u8d85\u89c4\u6a21\u5360\u7528\u7a7a\u95f4\u3002<\/p>\n<p>\u53e6\u5916&#xff0c;epfd \u5c06\u4f1a\u662f\u4e0b\u6587\u7684 \u201cEPOLL \u5b9e\u4f8b\u201d&#xff0c;begin \u662f\u5168\u5c40\u7684\u5f00\u7aef\u65f6\u95f4\u6233\u3002<\/p>\n<h4>\u5b9a\u4e49 EPOLL \u5b9e\u4f8b\u4e8b\u4ef6\u5904\u7406\u7684\u51fd\u6570\u4e0e\u91ca\u653e\u8d44\u6e90\u7684\u51fd\u6570<\/h4>\n<p>EPOLL \u5b9e\u4f8b\u4e8b\u4ef6\u5904\u7406\u7684\u51fd\u6570\u5982\u4e0b\u3002<\/p>\n<p><span class=\"token comment\">\/\/\u8be5\u51fd\u6570\u53ef\u4ee5\u5b9e\u73b0\u5bf9\u6587\u4ef6\u63cf\u8ff0\u7b26\u7684 EPOLL \u4e8b\u4ef6\u6ce8\u518c\u3001\u4fee\u6539\u6216\u5220\u9664&#xff0c;flag \u53c2\u6570\u662f\u7528\u6765\u533a\u5206\u60c5\u51b5\u7684<\/span><br \/>\n<span class=\"token keyword\">int<\/span> <span class=\"token function\">set_event<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> fd<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span> event<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span> flag<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/\/fd \u662f\u76ee\u6807\u6587\u4ef6\u63cf\u8ff0\u7b26\u6216\u5957\u63a5\u5b57&#xff1b;<\/span><br \/>\n<span class=\"token comment\">\/\/event \u662f\u4e8b\u4ef6\u7c7b\u578b&#xff0c;\u6bd4\u5982\u8bfb\u4e8b\u4ef6 EPOLLIN&#xff1b;<\/span><br \/>\n<span class=\"token comment\">\/\/flag \u662f\u7528\u6765\u533a\u5206\u662f\u6ce8\u518c\u8fd8\u662f\u4fee\u6539\u7684&#xff1b;1 \u8868\u793a\u662f\u6ce8\u518c&#xff1b;0 \u8868\u793a\u4fee\u6539&#xff1b;2 \u8868\u793a\u5220\u9664<\/span><\/p>\n<p><span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>flag <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>  <span class=\"token comment\">\/\/ add 1<\/span><\/p>\n<p><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">epoll_event<\/span> ev<span class=\"token punctuation\">;<\/span><br \/>\nev<span class=\"token punctuation\">.<\/span>events <span class=\"token operator\">&#061;<\/span> event<span class=\"token punctuation\">;<\/span><br \/>\nev<span class=\"token punctuation\">.<\/span>data<span class=\"token punctuation\">.<\/span>fd <span class=\"token operator\">&#061;<\/span> fd<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">epoll_ctl<\/span><span class=\"token punctuation\">(<\/span>epfd<span class=\"token punctuation\">,<\/span> EPOLL_CTL_ADD<span class=\"token punctuation\">,<\/span> fd<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>ev<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/\/ \u8001\u677f\u611f\u5174\u8da3\u7684\u4e8b\u4ef6\u662f&#xff0c;\u524d\u53f0\u5c0f\u59d0\u59d0\u7684\u5de5\u4f5c\u60c5\u51b5&#xff1b;EPOLL_CTL_ADD \u662f\u628a\u5957\u63a5\u5b57 sockfd \u548c\u4e8b\u4ef6 event \u6ce8\u518c\u5165 EPOLL \u4e4b\u4e2d<\/span><br \/>\n<span class=\"token comment\">\/\/ &#xff08;\u5373\u4e00\u4e2a\u5957\u63a5\u5b57 fd \u5bf9\u5e94\u4e00\u4e2a\u5c31\u7eea\u72b6\u6001\u8868 0\/1&#xff09;<\/span><br \/>\n<span class=\"token function\">perror<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;epoll_ctl failed&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token function\">close<\/span><span class=\"token punctuation\">(<\/span>fd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">return<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>flag <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token comment\">\/\/ delete 2<\/span><\/p>\n<p><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">epoll_event<\/span> ev<span class=\"token punctuation\">;<\/span><br \/>\nev<span class=\"token punctuation\">.<\/span>events <span class=\"token operator\">&#061;<\/span> event<span class=\"token punctuation\">;<\/span><br \/>\nev<span class=\"token punctuation\">.<\/span>data<span class=\"token punctuation\">.<\/span>fd <span class=\"token operator\">&#061;<\/span> fd<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">epoll_ctl<\/span><span class=\"token punctuation\">(<\/span>epfd<span class=\"token punctuation\">,<\/span> EPOLL_CTL_DEL<span class=\"token punctuation\">,<\/span> fd<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>ev<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/\/ \u8001\u677f\u611f\u5174\u8da3\u7684\u4e8b\u4ef6\u662f&#xff0c;\u524d\u53f0\u5c0f\u59d0\u59d0\u7684\u5de5\u4f5c\u60c5\u51b5&#xff1b;EPOLL_CTL_ADD \u662f\u628a\u5957\u63a5\u5b57 sockfd \u548c\u4e8b\u4ef6 event \u6ce8\u518c\u5165 EPOLL \u4e4b\u4e2d<\/span><br \/>\n<span class=\"token comment\">\/\/ &#xff08;\u5373\u4e00\u4e2a\u5957\u63a5\u5b57 fd \u5bf9\u5e94\u4e00\u4e2a\u5c31\u7eea\u72b6\u6001\u8868 0\/1&#xff09;<\/span><br \/>\n<span class=\"token function\">perror<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;epoll_ctl failed&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">return<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>flag <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>  <span class=\"token comment\">\/\/ modify 0<\/span><\/p>\n<p><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">epoll_event<\/span> ev<span class=\"token punctuation\">;<\/span><br \/>\nev<span class=\"token punctuation\">.<\/span>events <span class=\"token operator\">&#061;<\/span> event<span class=\"token punctuation\">;<\/span><br \/>\nev<span class=\"token punctuation\">.<\/span>data<span class=\"token punctuation\">.<\/span>fd <span class=\"token operator\">&#061;<\/span> fd<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token comment\">\/\/EPOLL_CTL_MOD&#xff1a;\u4fee\u6539\u5df2\u7ecf\u6ce8\u518c\u5230 epoll \u5b9e\u4f8b\u4e2d\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26 fd \u7684\u76d1\u89c6\u4e8b\u4ef6\u3002<\/span><br \/>\n<span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">epoll_ctl<\/span><span class=\"token punctuation\">(<\/span>epfd<span class=\"token punctuation\">,<\/span> EPOLL_CTL_MOD<span class=\"token punctuation\">,<\/span> fd<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>ev<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/\/ \u8001\u677f\u611f\u5174\u8da3\u7684\u4e8b\u4ef6\u662f&#xff0c;\u524d\u53f0\u5c0f\u59d0\u59d0\u7684\u5de5\u4f5c\u60c5\u51b5&#xff1b;EPOLL_CTL_ADD \u662f\u628a\u5957\u63a5\u5b57 sockfd \u548c\u4e8b\u4ef6 event \u6ce8\u518c\u5165 EPOLL \u4e4b\u4e2d<\/span><br \/>\n<span class=\"token comment\">\/\/ &#xff08;\u5373\u4e00\u4e2a\u5957\u63a5\u5b57 fd \u5bf9\u5e94\u4e00\u4e2a\u5c31\u7eea\u72b6\u6001\u8868 0\/1&#xff09;<\/span><br \/>\n<span class=\"token function\">perror<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;epoll_ctl failed&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token function\">close<\/span><span class=\"token punctuation\">(<\/span>fd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">return<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Param Error: flag &#061;0, 1, 2\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token punctuation\">}<\/span><\/p>\n<p>\u6211\u4eec\u6ce8\u610f\u5230&#xff0c;\u8be5\u51fd\u6570\u6709\u4e00\u4e2a int flag \u53c2\u6570&#xff0c;\u8fd9\u5176\u5b9e\u662f\u4e00\u4e2a\u72b6\u6001\u673a&#xff0c;\u7528\u6765\u6807\u660e\u9009\u62e9\u5904\u7406\u65b9\u5f0f\u3002\u7528\u6765\u533a\u5206\u662f\u6ce8\u518c\u8fd8\u662f\u4fee\u6539\u7684&#xff0c;\u6291\u6216\u5220\u9664&#xff1b;1 \u8868\u793a\u662f\u6ce8\u518c&#xff1b;0 \u8868\u793a\u4fee\u6539&#xff1b;2 \u8868\u793a\u5220\u9664\u3002<\/p>\n<p>\u91ca\u653e\u8d44\u6e90\u7684\u51fd\u6570\u5982\u4e0b\u3002<\/p>\n<p><span class=\"token comment\">\/\/\u53ea\u5728\u8fde\u63a5\u5173\u95ed\u65f6\u91ca\u653e\u8d44\u6e90&#xff1a;\u4e8b\u4ef6 event \u4ee3\u53f7 0 \u901a\u5e38\u8868\u793a\u6ca1\u6709\u4e8b\u4ef6\u53d1\u751f<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">close_connection<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> fd<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token function\">set_event<\/span><span class=\"token punctuation\">(<\/span>fd<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">close<\/span><span class=\"token punctuation\">(<\/span>fd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>conn_list<span class=\"token punctuation\">[<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>rbuffer<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">free<\/span><span class=\"token punctuation\">(<\/span>conn_list<span class=\"token punctuation\">[<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>rbuffer<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        conn_list<span class=\"token punctuation\">[<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>rbuffer <span class=\"token operator\">&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u9632\u6b62\u91cd\u590d\u91ca\u653e<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>conn_list<span class=\"token punctuation\">[<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>wbuffer<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">free<\/span><span class=\"token punctuation\">(<\/span>conn_list<span class=\"token punctuation\">[<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>wbuffer<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        conn_list<span class=\"token punctuation\">[<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>wbuffer <span class=\"token operator\">&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token function\">memset<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>conn_list<span class=\"token punctuation\">[<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">conn<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u7f13\u51b2\u533a\u751f\u547d\u5468\u671f\u5fc5\u987b\u4e0e\u8fde\u63a5\u751f\u547d\u5468\u671f\u4e00\u81f4&#xff0c;\u5728\u8fde\u63a5\u5173\u95ed\u524d\u4e0d\u8981\u91ca\u653e\u7f13\u51b2\u533a&#xff0c;\u5728\u8fde\u63a5\u5173\u95ed\u540e\u786e\u4fdd\u5b8c\u5168\u91ca\u653e\u3002<\/p>\n<h4>\u6ce8\u518c\u670d\u52a1\u5668\u76d1\u542c\u5957\u63a5\u5b57\u7684\u51fd\u6570<\/h4>\n<p>\u5360\u7528\u8bbe\u5907\u7684\u7aef\u53e3&#xff0c;\u8bbe\u7f6e\u76d1\u542c\u5957\u63a5\u5b57\u3002<\/p>\n<p><span class=\"token comment\">\/\/\u521b\u5efa\u76d1\u542c\u5957\u63a5\u5b57 sockfd&#xff0c;\u5e76\u4e14\u7ed1\u5b9a\u672c\u673a IP \u548c\u7aef\u53e3 port<\/span><br \/>\n<span class=\"token comment\">\/\/ (\u8fdc\u7a0bIP, \u8fdc\u7a0bPORT, \u672c\u5730IP, \u672c\u5730PORT, \u534f\u8bae) \u4e0e \u7f51\u7edc I\/O \u4e00\u5bf9\u4e00\u6210\u578b\u4e00\u4e2a sockfd <\/span><br \/>\n<span class=\"token keyword\">int<\/span> <span class=\"token function\">init_server<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">unsigned<\/span> <span class=\"token keyword\">short<\/span> port<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> sockfd <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">socket<\/span><span class=\"token punctuation\">(<\/span>AF_INET<span class=\"token punctuation\">,<\/span> SOCK_STREAM<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sockaddr_in<\/span> servaddr<span class=\"token punctuation\">;<\/span><br \/>\nservaddr<span class=\"token punctuation\">.<\/span>sin_family <span class=\"token operator\">&#061;<\/span> AF_INET<span class=\"token punctuation\">;<\/span><br \/>\nservaddr<span class=\"token punctuation\">.<\/span>sin_addr<span class=\"token punctuation\">.<\/span>s_addr <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">htonl<\/span><span class=\"token punctuation\">(<\/span>INADDR_ANY<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ 0.0.0.0<\/span><br \/>\nservaddr<span class=\"token punctuation\">.<\/span>sin_port <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">htons<\/span><span class=\"token punctuation\">(<\/span>port<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ 0-1023, <\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u8bbe\u7f6e\u7aef\u53e3\u590d\u7528<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u5f53\u670d\u52a1\u5668\u4e3b\u52a8\u5173\u95ed TCP \u8fde\u63a5\u65f6&#xff0c;\u4f1a\u8fdb\u5165 TIME_WAIT \u72b6\u6001&#xff08;\u901a\u5e38\u6301\u7eed 2MSL&#xff0c;\u7ea6 1-4 \u5206\u949f&#xff09;\u3002\u5728\u6b64\u671f\u95f4&#xff0c;\u64cd\u4f5c\u7cfb\u7edf\u4f1a\u4fdd\u7559\u8be5\u7aef\u53e3\u7ed1\u5b9a\u8bb0\u5f55&#xff0c;\u9632\u6b62\u5ef6\u8fdf\u5230\u8fbe\u7684\u6570\u636e\u5305\u5e72\u6270\u65b0\u8fde\u63a5\u3002<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u95ee\u9898&#xff1a;\u670d\u52a1\u5668\u5d29\u6e83\u6216\u91cd\u542f\u540e\u5c1d\u8bd5\u91cd\u65b0\u7ed1\u5b9a\u7aef\u53e3\u65f6&#xff0c;\u4f1a\u56e0 TIME_WAIT \u72b6\u6001\u5bfc\u81f4 bind() \u5931\u8d25&#xff08;\u9519\u8bef&#xff1a;Address already in use&#xff09; <\/span><br \/>\n    <span class=\"token comment\">\/\/ \u4ee5\u4e0b\u5904\u7406\u63aa\u65bd&#xff1a;\u80fd\u907f\u514d\u518d\u6b21\u542f\u7528\u670d\u52a1\u5668\u7a0b\u5e8f\u65f6&#xff0c;\u7cfb\u7edf\u7684\u5b95\u673a<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> reuse <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">setsockopt<\/span><span class=\"token punctuation\">(<\/span>sockfd<span class=\"token punctuation\">,<\/span> SOL_SOCKET<span class=\"token punctuation\">,<\/span> SO_REUSEADDR<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>reuse<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>reuse<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/  \u5982\u679c\u672a\u8bbe\u7f6e SO_REUSEADDR&#xff0c;\u5bfc\u81f4\u7aef\u53e3\u88ab\u5360\u7528\u540e\u65e0\u6cd5\u7acb\u5373\u91cd\u7528&#xff08;TIME_WAIT \u72b6\u6001&#xff09;<\/span><br \/>\n        <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;setsockopt failed: %s\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token function\">strerror<\/span><span class=\"token punctuation\">(<\/span>errno<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token comment\">\/\/ setsockopt \u662f\u4e00\u4e2a\u7528\u4e8e\u8bbe\u7f6e\u5957\u63a5\u5b57\u9009\u9879\u7684\u7cfb\u7edf\u8c03\u7528\u51fd\u6570\u3002<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u7b2c\u4e8c\u9879\u53c2\u6570 level&#xff1a;\u6307\u5b9a\u9009\u9879\u6240\u5728\u7684\u534f\u8bae\u7ea7\u522b\u3002\u5e38\u89c1\u7684\u503c\u5305\u62ec&#xff1a;SOL_SOCKET&#xff1a;\u8868\u793a\u5957\u63a5\u5b57\u7ea7\u522b\u7684\u9009\u9879\u3002IPPROTO_TCP&#xff1a;\u8868\u793a TCP \u534f\u8bae\u7ea7\u522b\u7684\u9009\u9879\u3002IPPROTO_IP&#xff1a;\u8868\u793a IP \u534f\u8bae\u7ea7\u522b\u7684\u9009\u9879\u3002IPPROTO_IPV6&#xff1a;\u8868\u793a IPv6 \u534f\u8bae\u7ea7\u522b\u7684\u9009\u9879\u3002<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u7b2c\u4e09\u9879\u53c2\u6570 optname&#xff1a;\u6307\u5b9a\u8981\u8bbe\u7f6e\u7684\u9009\u9879\u540d\u79f0\u3002\u4e0d\u540c\u7684\u534f\u8bae\u7ea7\u522b\u6709\u4e0d\u540c\u7684\u9009\u9879\u540d\u79f0\u3002\u4f8b\u5982&#xff1a;\u5728 SOL_SOCKET \u7ea7\u522b&#xff0c;\u5e38\u89c1\u7684\u9009\u9879\u5305\u62ec SO_REUSEADDR\u3001SO_KEEPALIVE\u3001SO_LINGER \u7b49\u3002\u5728 IPPROTO_TCP \u7ea7\u522b&#xff0c;\u5e38\u89c1\u7684\u9009\u9879\u5305\u62ec TCP_NODELAY \u7b49\u3002<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u7b2c\u56db\u9879\u53c2\u6570 optval&#xff1a;\u6307\u5411\u5305\u542b\u9009\u9879\u503c\u7684\u5185\u5b58\u533a\u57df\u3002\u9009\u9879\u503c\u7684\u7c7b\u578b\u548c\u5927\u5c0f\u53d6\u51b3\u4e8e optname<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u7b2c\u4e94\u9879\u53c2\u6570 optlen&#xff1a;\u6307\u5b9a optval \u7684\u957f\u5ea6&#xff08;\u4ee5\u5b57\u8282\u4e3a\u5355\u4f4d&#xff09;\u3002<\/span><\/p>\n<p><span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span> <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token function\">bind<\/span><span class=\"token punctuation\">(<\/span>sockfd<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sockaddr<\/span><span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token operator\">&amp;<\/span>servaddr<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sockaddr<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;bind failed: %s\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token function\">strerror<\/span><span class=\"token punctuation\">(<\/span>errno<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><span class=\"token comment\">\/\/strerror \u51fd\u6570\u5b9a\u4e49\u5728 &lt;string.h&gt; \u4e2d&#xff0c;\u800c errno \u662f &lt;errno.h&gt; \u7684\u5168\u5c40\u53d8\u91cf<\/span><br \/>\n<span class=\"token keyword\">return<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/\u4e00\u6b21\u76d1\u542c 10 \u4e2a\u6765\u8bbf IP:PORT<\/span><br \/>\n<span class=\"token comment\">\/\/printf(&#034;listen finshed: %d\\\\n&#034;, sockfd); \/\/ 3 <\/span><br \/>\n<span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">listen<\/span><span class=\"token punctuation\">(<\/span>sockfd<span class=\"token punctuation\">,<\/span> <span class=\"token number\">10<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u5c06\u5957\u63a5\u5b57\u8bbe\u7f6e\u4e3a\u88ab\u52a8\u6a21\u5f0f&#xff1a;\u5957\u63a5\u5b57\u4ece\u4e3b\u52a8\u8fde\u63a5\u6a21\u5f0f&#xff08;\u7528\u4e8e\u5ba2\u6237\u7aef&#xff09;\u8f6c\u6362\u4e3a\u88ab\u52a8\u76d1\u542c\u6a21\u5f0f&#xff08;\u7528\u4e8e\u670d\u52a1\u5668&#xff09;\u3002\u6211\u4eec\u53ef\u4ee5\u628a\u8fd9\u4e2a socket \u60f3\u8c61\u6210\u516c\u53f8\u7684\u524d\u53f0\u5c0f\u59d0\u3002<\/span><br \/>\n        <span class=\"token comment\">\/\/ 5&#xff1a;\u662f\u76d1\u542c\u961f\u5217\u7684\u6700\u5927\u957f\u5ea6&#xff0c;\u8868\u793a\u7cfb\u7edf\u53ef\u4ee5\u4e3a\u8be5\u5957\u63a5\u5b57\u6392\u961f\u7684\u6700\u5927\u672a\u5b8c\u6210\u8fde\u63a5\u6570\u3002\u5f53\u65b0\u7684\u8fde\u63a5\u8bf7\u6c42\u5230\u8fbe\u65f6&#xff0c;\u5982\u679c\u961f\u5217\u5df2\u6ee1&#xff0c;\u65b0\u7684\u8fde\u63a5\u8bf7\u6c42\u5c06\u88ab\u62d2\u7edd\u3002<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u8fd4\u56de\u503c&#xff1a;\u6210\u529f&#xff0c;\u8fd4\u56de 0\u3002\u5931\u8d25&#xff0c;\u8fd4\u56de -1&#xff0c;\u5e76\u8bbe\u7f6e errno \u4ee5\u6307\u793a\u9519\u8bef\u539f\u56e0\u3002<\/span><br \/>\n        <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;listen finshed: %d\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span> sockfd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">return<\/span> sockfd<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token punctuation\">}<\/span><\/p>\n<h3>accept_cb \u6a21\u5757<\/h3>\n<p>\u9996\u5148\u7ed9\u51fa\u7684\u662f&#xff0c;\u9488\u5bf9\u5df2\u7ecf\u5728 EPOLL \u5b9e\u4f8b\u4e2d\u6ce8\u518c\u7684\u5957\u63a5\u5b57&#xff0c;\u521d\u59cb\u5316\u5176\u5728\u5168\u5c40\u53d8\u91cf conn_list \u5bf9\u5e94\u4f4d\u7f6e\u4e0a\u7684\u5185\u5b58\u914d\u7f6e\u3002<\/p>\n<p><span class=\"token comment\">\/\/\u9488\u5bf9\u5df2\u7ecf\u6ce8\u518c\u7684 clientfd&#xff08;\u5f53\u7136\u4e5f\u6709\u53ef\u80fd\u6ce8\u518c\u4e0d\u6210\u529f&#xff0c;\u8981\u6ce8\u610f\u5904\u7406\u5931\u8d25&#xff09; \u5728\u4e8b\u4ef6\u603b\u96c6\u7684\u5bf9\u5e94 fd \u4e0a\u7684\u7efc\u5408\u60c5\u51b5\u8fdb\u884c\u521d\u59cb\u5316<\/span><br \/>\n<span class=\"token keyword\">int<\/span> <span class=\"token function\">event_register<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> fd<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span> event<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><\/p>\n<p><span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>fd <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">return<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><span class=\"token comment\">\/\/\u8fd9\u91cc\u662f\u7528\u6765\u5e94\u5bf9 accept \u51fd\u6570\u8c03\u7528\u5931\u8d25\u7684\u9519\u8bef<\/span><\/p>\n<p>conn_list<span class=\"token punctuation\">[<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>fd <span class=\"token operator\">&#061;<\/span> fd<span class=\"token punctuation\">;<\/span><br \/>\nconn_list<span class=\"token punctuation\">[<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>r_action<span class=\"token punctuation\">.<\/span>recv_callback <span class=\"token operator\">&#061;<\/span> recv_cb<span class=\"token punctuation\">;<\/span><br \/>\nconn_list<span class=\"token punctuation\">[<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>send_callback <span class=\"token operator\">&#061;<\/span> send_cb<span class=\"token punctuation\">;<\/span><\/p>\n<p>conn_list<span class=\"token punctuation\">[<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>rbuffer <span class=\"token operator\">&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">;<\/span><span class=\"token comment\">\/\/\u91cd\u7f6e\u8bfb\u7f13\u51b2\u533a<\/span><br \/>\nconn_list<span class=\"token punctuation\">[<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>rlength <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\nconn_list<span class=\"token punctuation\">[<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>rcap <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>conn_list<span class=\"token punctuation\">[<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>wbuffer <span class=\"token operator\">&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u786e\u4fdd\u521d\u59cb\u5316\u4e3aNULL<\/span><br \/>\n    conn_list<span class=\"token punctuation\">[<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>wcap <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    conn_list<span class=\"token punctuation\">[<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>wlength <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token function\">set_event<\/span><span class=\"token punctuation\">(<\/span>fd<span class=\"token punctuation\">,<\/span> event<span class=\"token punctuation\">,<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><span class=\"token comment\">\/\/  \u6807\u5fd7 1 \u8868\u793a\u5f53\u524d\u662f\u5bf9 fd \u7684\u4e8b\u4ef6\u6ce8\u518c\u800c\u975e\u4fee\u6539<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u7d27\u63a5\u7740&#xff0c;\u5f53\u670d\u52a1\u5668\u7684\u76d1\u542c\u5957\u63a5\u5b57\u76d1\u542c\u5230\u4e86\u6765\u8bbf IP \u65f6&#xff0c;\u5206\u914d\u51fa\u65b0\u7684\u5957\u63a5\u5b57\u4ee5\u5bf9\u63a5\u63a5\u4e0b\u6765\u5bf9\u8be5 IP \u7684 I\/O \u4efb\u52a1\u3002<\/p>\n<p><span class=\"token comment\">\/\/ listenfd(sockfd) &#8211;&gt; EPOLLIN &#8211;&gt; accept_cb\u6839\u636e\u60c5\u51b5\u4f7f\u7528\u56de\u8c03\u51fd\u6570\u2014\u2014\u2014\u2014\u76d1\u63a7\u5957\u63a5\u5b57 sockfd \u7684\u8bfb\u4e8b\u4ef6\u662f accept \u6ce8\u518c clientfd<\/span><br \/>\n<span class=\"token keyword\">int<\/span> <span class=\"token function\">accept_cb<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> fd<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><\/p>\n<p><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sockaddr_in<\/span>  clientaddr<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token class-name\">socklen_t<\/span> len <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>clientaddr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token comment\">\/\/\u8fd9\u4e24\u4e2a\u53d8\u91cf\u662f\u4e13\u95e8\u7528\u6765\u6ce8\u518c clientfd \u7684<\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> clientfd <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">accept<\/span><span class=\"token punctuation\">(<\/span>fd<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sockaddr<\/span><span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token operator\">&amp;<\/span>clientaddr<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>len<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token comment\">\/\/ accept \u4f1a\u56e0\u4e3a\u65e0\u8f93\u5165\u800c\u963b\u585e&#xff08;\u56e0\u4e3a sockfd \u662f\u9ed8\u8ba4\u7684\u963b\u585e\u6a21\u5f0f&#xff09;&#xff0c;\u672c\u8bbe\u8ba1\u5c31\u662f\u9632\u6b62\u5176\u963b\u585e&#xff08;\u5229\u7528\u6761\u4ef6\u5224\u65ad\u7ed5\u5f00\u963b\u585e&#xff09;<\/span><br \/>\n<span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>clientfd <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;accept errno: %d &#8211;&gt; %s\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span> errno<span class=\"token punctuation\">,<\/span> <span class=\"token function\">strerror<\/span><span class=\"token punctuation\">(<\/span>errno<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">return<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u52a8\u6001\u5206\u914d\u8bfb\u5165\u5185\u5b58\u7684\u7a7a\u95f4<\/span><br \/>\n    conn_list<span class=\"token punctuation\">[<\/span>clientfd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>rbuffer <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">malloc<\/span><span class=\"token punctuation\">(<\/span>BUFFER_LENGTH<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u5148\u884c\u5206\u914d1024\u5b57\u8282\u7684\u5185\u5b58&#xff0c;\u5b83\u662f\u8bfb\u53d6\u5185\u5bb9\u6700\u7ec8\u5f52\u5bbf<\/span><br \/>\n<span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>conn_list<span class=\"token punctuation\">[<\/span>clientfd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>rbuffer<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token function\">memset<\/span><span class=\"token punctuation\">(<\/span>conn_list<span class=\"token punctuation\">[<\/span>clientfd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>rbuffer<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> BUFFER_LENGTH<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u521d\u59cb\u5316\u4e3a0<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\nconn_list<span class=\"token punctuation\">[<\/span>clientfd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>rlength <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\nconn_list<span class=\"token punctuation\">[<\/span>clientfd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>rcap <span class=\"token operator\">&#061;<\/span> BUFFER_LENGTH<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/  \u8bb0\u5f55\u5bb9\u91cf<\/span><\/p>\n<p>    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>conn_list<span class=\"token punctuation\">[<\/span>clientfd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>rbuffer <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">perror<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Malloc ReadBuffer Error&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/  \u4f7f\u7528 &#096;EPOLLET&#096; \u5fc5\u987b\u914d\u5408\u975e\u963b\u585e\u5957\u63a5\u5b57&#xff0c;\u5426\u5219\u53ef\u80fd\u963b\u585e\u7ebf\u7a0b<\/span><br \/>\n<span class=\"token keyword\">int<\/span> flags <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">fcntl<\/span><span class=\"token punctuation\">(<\/span>clientfd<span class=\"token punctuation\">,<\/span> F_GETFL<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>        <span class=\"token comment\">\/\/ F_GETFL \u662f\u83b7\u53d6\u6807\u5fd7\u7684\u547d\u4ee4<\/span><br \/>\n<span class=\"token function\">fcntl<\/span><span class=\"token punctuation\">(<\/span>clientfd<span class=\"token punctuation\">,<\/span> F_SETFL<span class=\"token punctuation\">,<\/span> flags <span class=\"token operator\">|<\/span> O_NONBLOCK<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>   <span class=\"token comment\">\/\/ \u8981\u6ce8\u610f \u201c|\u201d \u662f\u6309\u4f4d\u6216\u64cd\u4f5c&#xff0c;\u80fd\u8fdb\u884c\u63a9\u7801\u53e0\u52a0&#xff1b;F_SETFL \u662f\u8bbe\u7f6e\u6587\u4ef6\u72b6\u6001\u6807\u5fd7&#xff0c;\u5728\u539f\u6765\u7684\u57fa\u7840\u4e0a\u589e\u52a0\u975e\u963b\u585e\u529f\u80fd<\/span><br \/>\n<span class=\"token comment\">\/\/  \u51fd\u6570 fcntl() \u4f5c\u7528&#xff1a;\u8bfb\u53d6 clientfd \u5f53\u524d\u7684\u6240\u6709\u6587\u4ef6\u72b6\u6001\u6807\u5fd7<\/span><br \/>\n<span class=\"token comment\">\/\/  \u8fd4\u56de\u503c&#xff1a;\u5305\u542b\u4f4d\u63a9\u7801\u7684\u6574\u6570&#xff0c;\u8868\u793a\u5f53\u524d\u6240\u6709\u8bbe\u7f6e\u7684\u6807\u5fd7<\/span><br \/>\n<span class=\"token comment\">\/\/          O_RDONLY&#xff1a;\u53ea\u8bfb\u6a21\u5f0f (0)&#xff1b;O_WRONLY&#xff1a;\u53ea\u5199\u6a21\u5f0f (1)&#xff1b;O_RDWR&#xff1a;\u8bfb\u5199\u6a21\u5f0f (2)&#xff1b;<\/span><br \/>\n<span class=\"token comment\">\/\/          O_NONBLOCK&#xff1a;\u975e\u963b\u585e\u6a21\u5f0f (04000)&#xff1b;O_APPEND&#xff1a;\u8ffd\u52a0\u6a21\u5f0f (02000)<\/span><\/p>\n<p><span class=\"token function\">event_register<\/span><span class=\"token punctuation\">(<\/span>clientfd<span class=\"token punctuation\">,<\/span> EPOLLIN <span class=\"token operator\">|<\/span> EPOLLET<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ | EPOLLET \u662f clientfd \u4f7f\u7528\u8fb9\u6cbf\u89e6\u53d1\u6a21\u5f0f<\/span><\/p>\n<p><span class=\"token comment\">\/\/\u8fd9\u662f\u7528\u4e8e\u8bf4\u660e\u60c5\u51b5\u7684<\/span><br \/>\n<span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>clientfd <span class=\"token operator\">%<\/span> <span class=\"token number\">1000<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token comment\">\/\/\u4e3a\u4e86\u4f7f\u5f97\u6253\u5370\u4e0d\u8fc7\u5206\u5bc6\u96c6&#xff0c;\u6bcf\u4e00\u5343\u4e2a I\/O \u5c31\u6253\u5370\u4e00\u6b21<\/span><\/p>\n<p><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">timeval<\/span> current<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token function\">gettimeofday<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>current<span class=\"token punctuation\">,<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><span class=\"token comment\">\/\/\u83b7\u53d6\u5f53\u524d\u65f6\u95f4\u6233&#xff0c;\u5b9a\u4e49\u5728 &lt;sys\/time.h&gt; \u5934\u6587\u4ef6\u4e2d<\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> time_used <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">TIME_SUB_MS<\/span><span class=\"token punctuation\">(<\/span>current<span class=\"token punctuation\">,<\/span> begin<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><span class=\"token comment\">\/\/\u83b7\u53d6\u65f6\u95f4\u5dee<\/span><br \/>\n<span class=\"token function\">memcpy<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>begin<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>current<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">timeval<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;accept finshed: %d, time_used: %d\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span> clientfd<span class=\"token punctuation\">,<\/span> time_used<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h3>read_cb \u6a21\u5757<\/h3>\n<p>\u8fd9\u4e2a\u51fd\u6570\u662f\u6709\u76f8\u5f53\u591a\u7ec6\u8282\u7684\u3002\u9996\u5148&#xff0c;\u6211\u4eec\u7528\u4e8e\u8ba1\u6570\u7684\u53d8\u91cf count \u6240\u7528\u7684\u6570\u5b57\u7c7b\u578b\u662f ssize_t \u7c7b\u578b\u7684&#xff08;\u5728\u5934\u6587\u4ef6 &lt;sys\/types.h&gt; \u4e2d\u5b9a\u4e49\u7684&#xff09;&#xff0c;\u662f\u4e00\u4e2assize_t \u662f\u4e00\u4e2a\u6709\u7b26\u53f7\u7684\u6574\u6570\u7c7b\u578b&#xff0c;\u5728 64 \u4f4d\u64cd\u4f5c\u7cfb\u7edf\u4e2d&#xff0c;\u8303\u56f4\u662f [-2<sup>63<\/sup>,2<sup>63<\/sup>-1]&#xff0c;\u662f\u4e00\u4e2a\u76f8\u5f53\u5927\u7684\u6570\u3002\u8fd9\u8bf4\u660e\u8fd9\u4e2a\u670d\u52a1\u5668\u662f\u6709\u88ab\u7528\u6237\u4e0a\u4f20\u89c6\u9891\u8fd9\u79cd\u5927\u578b\u6570\u636e\u7684\u80fd\u529b\u7684\u3002<\/p>\n<p><span class=\"token comment\">\/\/\u6839\u636e\u60c5\u51b5\u4f7f\u7528\u56de\u8c03\u51fd\u6570\u2014\u2014\u2014\u2014\u666e\u901a\u5957\u63a5\u5b57 clientfd \u7684\u8bfb\u4e8b\u4ef6\u662f recv_cb  \u8bfb\u53d6\u5185\u5b58<\/span><br \/>\n<span class=\"token comment\">\/\/\u5728\u8fb9\u6cbf\u6a21\u5f0f\u4e0b&#xff0c;\u8be5\u51fd\u6570\u8981\u5faa\u73af\u6267\u884c<\/span><br \/>\n<span class=\"token keyword\">int<\/span> <span class=\"token function\">recv_cb<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> fd<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><\/p>\n<p><span class=\"token class-name\">ssize_t<\/span> count<span class=\"token operator\">&#061;<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">char<\/span> buffer<span class=\"token punctuation\">[<\/span>BUFFER_LENGTH<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token comment\">\/\/struct conn* c &#061; &amp;conn_list[fd];  \/\/ \u4f7f\u7528\u5c40\u90e8\u53d8\u91cf\u7b80\u5316\u4ee3\u7801<\/span><\/p>\n<p><span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>conn_list<span class=\"token punctuation\">[<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>rbuffer <span class=\"token operator\">!&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token comment\">\/\/\u8fde\u63a5\u590d\u7528&#xff0c;\u4e8c\u6b21\u6536\u4fe1\u606f\u7684\u65f6\u5019<\/span><br \/>\n<span class=\"token function\">free<\/span><span class=\"token punctuation\">(<\/span>conn_list<span class=\"token punctuation\">[<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>rbuffer<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\nconn_list<span class=\"token punctuation\">[<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>rbuffer <span class=\"token operator\">&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u9632\u6b62\u91cd\u590d\u91ca\u653e<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\nconn_list<span class=\"token punctuation\">[<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>rlength <span class=\"token operator\">&#061;<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\nconn_list<span class=\"token punctuation\">[<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>rcap <span class=\"token operator\">&#061;<\/span> BUFFER_LENGTH<span class=\"token punctuation\">;<\/span> <\/p>\n<p><span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><\/p>\n<p>count <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">recv<\/span><span class=\"token punctuation\">(<\/span>fd<span class=\"token punctuation\">,<\/span> buffer<span class=\"token punctuation\">,<\/span> BUFFER_LENGTH<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><span class=\"token comment\">\/\/\u8bfb\u53d6\u56fa\u5b9a\u957f\u5ea6\u7684\u5185\u5bb9&#xff0c;0 \u4ee3\u8868\u4ee5\u963b\u585e\u6a21\u5f0f\u8bfb\u53d6\u6570\u636e<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u56e0\u4e3a clientfd \u4e0d\u662f\u963b\u585e\u6a21\u5f0f&#xff0c; recv \u4e0d\u4f1a\u56e0\u65e0\u8f93\u5165\u800c\u963b\u65ad&#xff0c;\u800c\u662f\u4f1a\u7acb\u5373\u8fd4\u56de -1<\/span><br \/>\n<span class=\"token comment\">\/\/ \u51fd\u6570 recv&#xff1a; \u8bfb\u53d6\u56fa\u5b9a\u5b57\u8282\u7684\u5185\u5bb9\u3002<\/span><br \/>\n<span class=\"token comment\">\/\/ \u8fd4\u56de\u503c &gt; 0&#xff1a;\u8868\u793a\u6210\u529f\u63a5\u6536\u4e86\u6570\u636e&#xff0c;\u8fd4\u56de\u503c\u8868\u793a\u5b9e\u9645\u63a5\u6536\u5230\u7684\u5b57\u8282\u6570\u3002<\/span><br \/>\n<span class=\"token comment\">\/\/ \u8fd4\u56de\u503c &#061;&#061; 0&#xff1a;\u8868\u793a\u5bf9\u7aef\u5df2\u7ecf\u5173\u95ed\u4e86\u8fde\u63a5&#xff08;TCP\u8fde\u63a5\u7684\u6b63\u5e38\u5173\u95ed&#xff09;\u3002\u8fd9\u662fTCP\u534f\u8bae\u7684\u5bf9\u7aef\u5173\u95ed\u8fde\u63a5\u7684\u6807\u5fd7\u3002<\/span><br \/>\n<span class=\"token comment\">\/\/ \u8fd4\u56de\u503c &#061;&#061; -1&#xff1a;\u8868\u793a\u65e0\u4fe1\u606f\u53ef\u8bfb\u3002\u5e76\u8bbe\u7f6e\u9519\u8bef\u7801\u4e3a EAGAIN \u6216 EWOULDBLOCK\u3002\u8fd9\u8868\u793a\u5f53\u524d\u6ca1\u6709\u6570\u636e\u53ef\u8bfb&#xff0c;\u4f46\u8fde\u63a5\u4ecd\u7136\u6709\u6548\u3002<\/span><br \/>\n<span class=\"token comment\">\/\/ \u5f53\u8c03\u7528 recv \u65f6&#xff0c;\u4f1a\u89e6\u53d1\u7528\u6237\u6001\u5230\u5185\u6838\u6001\u7684\u5207\u6362&#xff0c;\u5185\u6838\u8d1f\u8d23\u4ece\u5957\u63a5\u5b57\u63a5\u6536\u7f13\u51b2\u533a\u590d\u5236\u6570\u636e\u5230\u7528\u6237\u63d0\u4f9b\u7684\u7f13\u51b2\u533a&#xff0c;\u5185\u6838\u4f1a\u66f4\u65b0\u63a5\u6536\u7f13\u51b2\u533a\u7684\u72b6\u6001&#xff08;\u5982\u79fb\u9664\u5df2\u8bfb\u53d6\u6570\u636e&#xff09;<\/span><br \/>\n<span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>count <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token comment\">\/\/ disconnect<\/span><\/p>\n<p><span class=\"token function\">close_connection<\/span><span class=\"token punctuation\">(<\/span>fd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u8fde\u63a5\u65ad\u5f00\u5fc5\u987b\u8981\u6e05\u7406\u5957\u63a5\u5b57\u8d44\u6e90&#xff0c;\u524d\u9762\u5df2\u7ecf\u6e05\u7406\u8fc7\u4e00\u6b21\u4e86&#xff0c;\u907f\u514d\u5728\u6b21\u91ca\u653e<\/span><\/p>\n<p><span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;client disconnect: %d\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span> fd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token comment\">\/\/\u5f53\u5ba2\u6237\u7aef\u4e3b\u52a8\u53d1\u6765\u65ad\u5f00\u8fde\u63a5\u7684\u8bf7\u6c42\u65f6&#xff0c;<\/span><\/p>\n<p><span class=\"token keyword\">return<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>count <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>errno <span class=\"token operator\">&#061;&#061;<\/span> EAGAIN <span class=\"token operator\">||<\/span> errno <span class=\"token operator\">&#061;&#061;<\/span> EWOULDBLOCK<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token comment\">\/\/ \u65e0\u6570\u636e\u53ef\u8bfb&#xff0c;\u9000\u51fa\u5faa\u73af<\/span><\/p>\n<p>                <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n            <span class=\"token keyword\">else<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;recv error: %s\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token function\">strerror<\/span><span class=\"token punctuation\">(<\/span>errno<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token function\">close_connection<\/span><span class=\"token punctuation\">(<\/span>fd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">return<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u4f7f\u7528\u7ed3\u6784\u4f53\u4e2d\u7684\u957f\u5ea6\u548c\u5bb9\u91cf\u5b57\u6bb5<\/span><br \/>\n            <span class=\"token class-name\">ssize_t<\/span> new_length <span class=\"token operator\">&#061;<\/span> conn_list<span class=\"token punctuation\">[<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>rlength <span class=\"token operator\">&#043;<\/span> count<span class=\"token punctuation\">;<\/span><\/p>\n<p>            <span class=\"token comment\">\/\/ \u786e\u4fdd\u7f13\u51b2\u533a\u5b58\u5728&#xff0c;\u8fd9\u662f\u4e0b\u6587\u80fd\u6210\u529f\u4f7f\u7528 memcpy \u7684\u539f\u56e0<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>conn_list<span class=\"token punctuation\">[<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>rbuffer<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                conn_list<span class=\"token punctuation\">[<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>rbuffer <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">malloc<\/span><span class=\"token punctuation\">(<\/span>BUFFER_LENGTH<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>conn_list<span class=\"token punctuation\">[<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>rbuffer<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                    <span class=\"token function\">perror<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;malloc failed&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token function\">close_connection<\/span><span class=\"token punctuation\">(<\/span>fd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token keyword\">return<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">3<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><br \/>\n                conn_list<span class=\"token punctuation\">[<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>rcap <span class=\"token operator\">&#061;<\/span> BUFFER_LENGTH<span class=\"token punctuation\">;<\/span><br \/>\n                conn_list<span class=\"token punctuation\">[<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>rlength <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><\/p>\n<p>            <span class=\"token comment\">\/\/ \u52a8\u6001\u6269\u5bb9<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>new_length <span class=\"token operator\">&gt;<\/span> conn_list<span class=\"token punctuation\">[<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>rcap<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token class-name\">ssize_t<\/span> new_cap <span class=\"token operator\">&#061;<\/span> conn_list<span class=\"token punctuation\">[<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>rcap <span class=\"token operator\">*<\/span> <span class=\"token number\">2<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">char<\/span> <span class=\"token operator\">*<\/span>new_buf <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">realloc<\/span><span class=\"token punctuation\">(<\/span>conn_list<span class=\"token punctuation\">[<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>rbuffer<span class=\"token punctuation\">,<\/span> new_cap<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>new_buf<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                    <span class=\"token function\">perror<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;realloc failed&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token function\">close_connection<\/span><span class=\"token punctuation\">(<\/span>fd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token keyword\">return<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">3<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><br \/>\n                conn_list<span class=\"token punctuation\">[<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>rbuffer <span class=\"token operator\">&#061;<\/span> new_buf<span class=\"token punctuation\">;<\/span><br \/>\n                conn_list<span class=\"token punctuation\">[<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>rcap <span class=\"token operator\">&#061;<\/span> new_cap<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><\/p>\n<p>            <span class=\"token comment\">\/\/ \u590d\u5236\u6570\u636e<\/span><br \/>\n            <span class=\"token function\">memcpy<\/span><span class=\"token punctuation\">(<\/span>conn_list<span class=\"token punctuation\">[<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>rbuffer <span class=\"token operator\">&#043;<\/span> conn_list<span class=\"token punctuation\">[<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>rlength<span class=\"token punctuation\">,<\/span> buffer<span class=\"token punctuation\">,<\/span> count<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><span class=\"token comment\">\/\/\u6211\u5728\u8fd9\u4e2a\u5730\u65b9\u591a\u6b21\u51fa\u9519&#xff0c;memcpy \u7528\u7684\u4e0d\u597d&#xff0c;\u6211\u5728\u6b64\u5904\u7206\u6808\u4e86,<\/span><\/p>\n<p>            conn_list<span class=\"token punctuation\">[<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>rlength <span class=\"token operator\">&#061;<\/span> new_length<span class=\"token punctuation\">;<\/span><\/p>\n<p>            <span class=\"token comment\">\/\/ \u5b89\u5168\u6253\u5370&#xff08;\u6307\u5b9a\u957f\u5ea6&#xff09;<\/span><br \/>\n            <span class=\"token comment\">\/\/ printf(&#034;[%zd]RECV: %.*s\\\\n&#034;, count, (int)count, buffer);\/\/\u8fd9\u662f\u7279\u6b8a\u7684\u5360\u4f4d\u7b26\u7528\u6cd5<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token function\">memset<\/span><span class=\"token punctuation\">(<\/span>buffer<span class=\"token punctuation\">,<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span>BUFFER_LENGTH<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u91cd\u7f6e\u8bfb\u53d6\u7684\u7f13\u51b2\u533a&#xff0c;\u4ed6\u662f\u56fa\u5b9a\u957f\u5ea6\u7684&#xff0c;\u7528\u4e8e\u63a5\u6536 fd \u91cc\u9762\u7684\u5b57\u8282&#xff0c;\u6bcf\u6b21\u53ea\u8bfb\u53d6\u4e00\u70b9\u70b9<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u8fd9\u4e2a\u51fd\u6570\u5148\u662f\u5bf9\u521d\u59cb\u5316 conn_list \u7684\u8bfb\u7f13\u51b2\u533a\u548c\u8bfb\u7f13\u51b2\u533a\u7684\u957f\u5ea6\u548c\u5bb9\u91cf\u8fdb\u884c\u521d\u59cb\u5316&#xff0c;\u800c\u540e\u91c7\u7528\u8fb9\u6cbf\u8bfb\u53d6\u7684\u65b9\u6cd5&#xff0c;\u65e0\u9650\u5faa\u5316\u5730\u8bfb\u53d6&#xff0c;\u76f4\u81f3\u8bfb\u5b8c\u3002\u8fb9\u6cbf\u89e6\u53d1\u6a21\u5f0f\u4e0b&#xff0c;\u4e8b\u4ef6\u53ea\u5728\u72b6\u6001\u53d1\u751f\u53d8\u5316\u65f6\u901a\u77e5\u4e00\u6b21&#xff0c;\u4e0d\u4f1a\u56e0\u4e3a\u7f13\u51b2\u533a\u4e2d\u6301\u7eed\u6709\u6570\u636e\u800c\u53cd\u590d\u89e6\u53d1\u3002\u8fd9\u5927\u5927\u51cf\u5c11\u4e86epoll_wait\u7684\u8c03\u7528\u6b21\u6570&#xff0c;\u964d\u4f4e\u4e86\u5185\u6838\u4e0e\u7528\u6237\u6001\u4e4b\u95f4\u7684\u4e0a\u4e0b\u6587\u5207\u6362\u5f00\u9500&#xff0c;\u4ece\u800c\u663e\u8457\u63d0\u9ad8\u4e86\u6027\u80fd\u3002\u8fb9\u6cbf\u89e6\u53d1\u6a21\u5f0f\u901a\u5e38\u4e0e\u975e\u963b\u585eI\/O\u642d\u914d\u4f7f\u7528\u3002\u5728\u975e\u963b\u585e\u6a21\u5f0f\u4e0b&#xff0c;\u7a0b\u5e8f\u4f1a\u5c3d\u53ef\u80fd\u591a\u5730\u8bfb\u53d6\u6216\u5199\u5165\u6570\u636e&#xff0c;\u76f4\u5230\u9047\u5230EAGAIN\u6216EWOULDBLOCK\u9519\u8bef\u4e3a\u6b62\u3002\u8fd9\u79cd\u6a21\u5f0f\u4e0b&#xff0c;\u8fb9\u6cbf\u89e6\u53d1\u80fd\u591f\u66f4\u597d\u5730\u53d1\u6325\u5176\u4f18\u52bf\u3002<\/p>\n<ul>\n<li>\u5f53\u7528\u6237\u8fdc\u7a0b\u65ad\u5f00\u8fde\u63a5\u65f6&#xff0c;\u4f1a\u81ea\u52a8\u7ed9\u670d\u52a1\u5668\u53d1\u9001\u4fe1\u606f&#xff0c;\u89e6\u53d1 EPOLL \u7684\u8bfb\u4e8b\u4ef6 event&#xff0c;\u5e76\u4e14\u4f7f\u7528 recv \u51fd\u6570\u540e&#xff0c;\u8fd4\u56de\u503c\u662f 0 \u3002<\/li>\n<li>\u5f53\u6587\u4ef6\u8bfb\u53d6\u5b8c\u6bd5\u540e&#xff0c;\u7531\u4e8e clientfd \u88ab\u8bbe\u7f6e\u6210\u975e\u963b\u585e\u6a21\u5f0f&#xff0c;recv \u4e0d\u4f1a\u56e0\u65e0\u8f93\u5165\u800c\u963b\u65ad&#xff0c;\u800c\u662f\u4f1a\u7acb\u5373\u8fd4\u56de -1&#xff0c;\u5bf9\u5e94\u7684\u9519\u8bef\u662f EAGAIN \u548c EWOULDBLOCK \u3002\u4f46\u8fd9\u662f\u6b63\u5e38\u73b0\u8c61\u3002\u6362\u53e5\u8bdd\u8bf4&#xff0c;\u5728\u963b\u585e\u6a21\u5f0f\u4e0b&#xff0c;\u662f\u4e0d\u5b58\u5728\u8fd9\u4e2a\u9519\u8bef\u7684\u3002<\/li>\n<li>\u6211\u4eec\u5728\u8bfb\u53d6 I\/O \u6587\u4ef6\u5185\u5bb9\u65f6&#xff0c;\u662f\u4f7f\u7528\u4e86\u52a8\u6001\u5185\u5b58\u6269\u5145\u7684\u65b9\u6cd5&#xff0c;\u8fd9\u4f7f\u5f97\u6211\u4eec\u7684\u670d\u52a1\u5668\u53ef\u4ee5\u63a5\u53d7\u8d85\u5927\u578b\u7684\u6570\u636e\u3002<\/li>\n<\/ul>\n<h3>send_cb \u6a21\u5757<\/h3>\n<p>\u5728\u5904\u7406\u7f51\u7edc\u8f93\u51fa&#xff08;\u5373 EPOLLOUT \u4e8b\u4ef6&#xff09;\u65f6&#xff0c;\u5957\u63a5\u5b57 clientfd \u7684\u6a21\u5f0f\u88ab\u51fd\u6570set_event \u8c03\u6574\u4e3a\u963b\u585e\u6a21\u5f0f&#xff0c;\u53ef\u4fdd\u8bc1\u53d1\u9001\u5230\u5185\u6838\u7f13\u51b2\u533a&#xff08;\u5373\u5957\u63a5\u5b57\u5bf9\u5e94\u7684 I\/O \u6587\u4ef6\u4e0a&#xff09;&#xff0c;\u4f46\u4e0d\u4fdd\u8bc1\u5b8c\u6574\u4f20\u8f93\u5230\u5bf9\u7aef&#xff08;\u53d7\u7f51\u7edc\u72b6\u51b5\u5f71\u54cd&#xff09;&#xff0c;\u56e0\u800c\u8fd8\u9700\u8981\u5faa\u73af\u53d1\u9001\u3002\u6211\u4eec\u8fd8\u9700\u8bbe\u7f6e\u8d85\u65f6\u5904\u7406&#xff0c;\u4fdd\u8bc1\u53ef\u4ee5\u5168\u90e8\u53d1\u9001\u3002<\/p>\n<p><span class=\"token comment\">\/\/\u6302\u8d77\u7b49\u5f85&#xff0c;\u5199\u4e8b\u4ef6\u5c31\u7eea&#xff0c;\u5904\u7406 send \u51fd\u6570\u7684 Bug<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">wait_for_socket_writable<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> sockfd<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u9700\u63d0\u524d\u521b\u5efaepoll\u5b9e\u4f8b\u5e76\u6ce8\u518c\u4e8b\u4ef6<\/span><br \/>\n<span class=\"token keyword\">int<\/span> epoll_fd_1 <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">epoll_create1<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">epoll_event<\/span> ev<span class=\"token punctuation\">;<\/span><br \/>\nev<span class=\"token punctuation\">.<\/span>events <span class=\"token operator\">&#061;<\/span> EPOLLOUT<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u76d1\u542c\u53ef\u5199<\/span><br \/>\nev<span class=\"token punctuation\">.<\/span>data<span class=\"token punctuation\">.<\/span>fd <span class=\"token operator\">&#061;<\/span> sockfd<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token function\">epoll_ctl<\/span><span class=\"token punctuation\">(<\/span>epoll_fd_1<span class=\"token punctuation\">,<\/span> EPOLL_CTL_ADD<span class=\"token punctuation\">,<\/span> sockfd<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>ev<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u7b49\u5f85\u4e8b\u4ef6\u89e6\u53d1&#xff0c;\u65e0\u9650\u963b\u585e<\/span><br \/>\n<span class=\"token function\">epoll_wait<\/span><span class=\"token punctuation\">(<\/span>epoll_fd_1<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>ev<span class=\"token punctuation\">,<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token function\">close<\/span><span class=\"token punctuation\">(<\/span>epoll_fd_1<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u6dfb\u52a0\u5173\u95ed<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/\u786e\u4fdd\u6570\u636e\u5168\u90e8\u53d1\u9001<\/span><br \/>\n<span class=\"token comment\">\/\/\u5373\u4f7f\u4f7f\u7528\u963b\u585e sockfd \u4e5f\u5fc5\u987b\u5faa\u73af\u53d1\u9001&#xff01;\u56e0\u4e3a\u963b\u585e\u6a21\u5f0f\u53ea\u4fdd\u8bc1\u53d1\u9001\u5230\u5185\u6838\u7f13\u51b2\u533a&#xff0c;\u4e0d\u4fdd\u8bc1\u5b8c\u6574\u4f20\u8f93\u5230\u5bf9\u7aef&#xff08;\u53d7\u7f51\u7edc\u72b6\u51b5\u5f71\u54cd&#xff09;\u3002<\/span><br \/>\n<span class=\"token class-name\">ssize_t<\/span> <span class=\"token function\">send_all<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> sockfd<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token operator\">*<\/span>buf<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">size_t<\/span> len<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span> flags<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token class-name\">ssize_t<\/span> total_sent <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span>      <span class=\"token comment\">\/\/ \u5df2\u53d1\u9001\u5b57\u8282\u6570<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">char<\/span> <span class=\"token operator\">*<\/span>ptr <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> <span class=\"token keyword\">char<\/span> <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span>buf<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u79fb\u52a8\u6307\u9488\u6307\u5411\u672a\u53d1\u9001\u6570\u636e<\/span><\/p>\n<p><span class=\"token comment\">\/\/\u5373\u4f7f\u4f7f\u7528\u963b\u585e sockfd \u4e5f\u5fc5\u987b\u5faa\u73af\u53d1\u9001&#xff01;\u56e0\u4e3a\u963b\u585e\u6a21\u5f0f\u53ea\u4fdd\u8bc1\u53d1\u9001\u5230\u5185\u6838\u7f13\u51b2\u533a&#xff0c;\u4e0d\u4fdd\u8bc1\u5b8c\u6574\u4f20\u8f93\u5230\u5bf9\u7aef&#xff08;\u53d7\u7f51\u7edc\u72b6\u51b5\u5f71\u54cd&#xff09;\u3002<\/span><br \/>\n    <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span>total_sent <span class=\"token operator\">&lt;<\/span> len<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u5c1d\u8bd5\u53d1\u9001\u5269\u4f59\u6570\u636e<\/span><br \/>\n        <span class=\"token class-name\">ssize_t<\/span> n <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">send<\/span><span class=\"token punctuation\">(<\/span>sockfd<span class=\"token punctuation\">,<\/span> ptr<span class=\"token punctuation\">,<\/span> len <span class=\"token operator\">&#8211;<\/span> total_sent<span class=\"token punctuation\">,<\/span> flags<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>n <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u9519\u8bef\u5904\u7406&#xff08;\u91cd\u70b9&#xff01;&#xff09;<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>errno <span class=\"token operator\">&#061;&#061;<\/span> EINTR<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">continue<\/span><span class=\"token punctuation\">;<\/span>   <span class=\"token comment\">\/\/ \u4fe1\u53f7\u4e2d\u65ad&#xff1a;\u91cd\u8bd5<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>errno <span class=\"token operator\">&#061;&#061;<\/span> EAGAIN <span class=\"token operator\">||<\/span> errno <span class=\"token operator\">&#061;&#061;<\/span> EWOULDBLOCK<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token comment\">\/\/ \u963b\u585e\u6a21\u5f0f&#xff1a;\u7b49\u5f85\u53ef\u5199&#xff08;\u9700\u914d\u5408 select\/poll\/epoll&#xff09;<\/span><br \/>\n                <span class=\"token function\">wait_for_socket_writable<\/span><span class=\"token punctuation\">(<\/span>sockfd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">continue<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u5176\u4ed6\u9519\u8bef&#xff08;\u5982\u8fde\u63a5\u65ad\u5f00&#xff09;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token keyword\">else<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>n <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><\/p>\n<p><span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;client disconnect: %d\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span> sockfd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token function\">close_connection<\/span><span class=\"token punctuation\">(<\/span>sockfd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> total_sent<span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u8fde\u63a5\u5173\u95ed&#xff08;\u90e8\u5206\u53d1\u9001&#xff09;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u66f4\u65b0\u72b6\u6001<\/span><br \/>\n        total_sent <span class=\"token operator\">&#043;&#061;<\/span> n<span class=\"token punctuation\">;<\/span><br \/>\n        ptr <span class=\"token operator\">&#043;&#061;<\/span> n<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u79fb\u52a8\u6307\u9488\u5230\u672a\u53d1\u9001\u6570\u636e\u4f4d\u7f6e<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> total_sent<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u8fd4\u56de\u5b9e\u9645\u53d1\u9001\u7684\u5b57\u8282\u6570&#xff08;\u5e94\u7b49\u4e8e len&#xff09;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u7efc\u5408\u4ee5\u4e0a\u4e24\u4e2a\u51fd\u6570&#xff0c;\u6211\u4eec\u8fd8\u6307\u793a\u4e86\u4e1a\u52a1\u5904\u7406\u4f4d\u7f6e\u3002<\/p>\n<p><span class=\"token comment\">\/\/\u6839\u636e\u60c5\u51b5\u4f7f\u7528\u56de\u8c03\u51fd\u6570\u2014\u2014\u2014\u2014\u666e\u901a\u5957\u63a5\u5b57 clientfd \u7684\u8f93\u51fa\u4e8b\u4ef6\u662f send_cb  \u53d1\u9001\u5185\u5bb9<\/span><br \/>\n<span class=\"token comment\">\/\/\u5728\u8fb9\u6cbf\u6a21\u5f0f\u4e0b&#xff0c;\u8be5\u51fd\u6570\u8981\u5faa\u73af\u6267\u884c<\/span><br \/>\n<span class=\"token keyword\">int<\/span> <span class=\"token function\">send_cb<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> fd<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><\/p>\n<p><span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>conn_list<span class=\"token punctuation\">[<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>wbuffer <span class=\"token operator\">!&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token comment\">\/\/\u8fde\u63a5\u590d\u7528&#xff0c;\u4e8c\u6b21\u53d1\u9001\u4fe1\u606f\u7684\u65f6\u5019,\u5199\u7f13\u51b2\u533a\u7684\u521d\u59cb\u5316<\/span><br \/>\n<span class=\"token function\">free<\/span><span class=\"token punctuation\">(<\/span>conn_list<span class=\"token punctuation\">[<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>wbuffer<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\nconn_list<span class=\"token punctuation\">[<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>wbuffer <span class=\"token operator\">&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u9632\u6b62\u91cd\u590d\u91ca\u653e<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\nconn_list<span class=\"token punctuation\">[<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>wlength <span class=\"token operator\">&#061;<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\u54cd\u5e94\u64cd\u4f5c\u7684\u4e1a\u52a1\u7aef&#xff08;\u5f00\u59cb&#xff09; \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<\/span><\/p>\n<p><span class=\"token comment\">\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\u54cd\u5e94\u64cd\u4f5c\u7684\u4e1a\u52a1\u7aef&#xff08;\u7ed3\u675f&#xff09; \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<\/span><\/p>\n<p><span class=\"token class-name\">ssize_t<\/span> count <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>conn_list<span class=\"token punctuation\">[<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>wlength <span class=\"token operator\">!&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\ncount <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">send_all<\/span><span class=\"token punctuation\">(<\/span>fd<span class=\"token punctuation\">,<\/span> conn_list<span class=\"token punctuation\">[<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>wbuffer<span class=\"token punctuation\">,<\/span> conn_list<span class=\"token punctuation\">[<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>wlength<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;SEND: %zd\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span> count<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">return<\/span> count<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h3>\u670d\u52a1\u5668\u4ee3\u7801<\/h3>\n<p>\u7ed3\u5408\u524d\u9762\u7684\u6d41\u7a0b\u56fe&#xff0c;\u6211\u4eec\u53ef\u4ee5\u7ed9\u51fa\u8fd9\u4e2a\u670d\u52a1\u5668\u7684\u4ee3\u7801<\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><\/p>\n<p><span class=\"token keyword\">unsigned<\/span> <span class=\"token keyword\">short<\/span> port <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">2000<\/span><span class=\"token punctuation\">;<\/span><span class=\"token comment\">\/\/ \u7aef\u53e3 port<\/span><\/p>\n<p>epfd <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">epoll_create<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><span class=\"token comment\">\/\/epfd \u5df2\u7ecf\u88ab\u58f0\u660e\u4e3a\u4e00\u4e2a\u5168\u5c40\u53d8\u91cf<\/span><br \/>\n<span class=\"token keyword\">int<\/span> listen_fds<span class=\"token punctuation\">[<\/span>MAX_PORTS<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u5b58\u50a8\u6240\u6709\u76d1\u542csocket<\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span>i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> MAX_PORTS<span class=\"token punctuation\">;<\/span> i<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">int<\/span> sockfd <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">init_server<\/span><span class=\"token punctuation\">(<\/span>port <span class=\"token operator\">&#043;<\/span> i<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\nlisten_fds<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> sockfd<span class=\"token punctuation\">;<\/span><br \/>\nconn_list<span class=\"token punctuation\">[<\/span>sockfd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>fd <span class=\"token operator\">&#061;<\/span> sockfd<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/  \u4f7f\u7528fd\u4f5c\u4e3a\u7d22\u5f15<\/span><br \/>\nconn_list<span class=\"token punctuation\">[<\/span>sockfd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>r_action<span class=\"token punctuation\">.<\/span>accept_callback <span class=\"token operator\">&#061;<\/span> accept_cb<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token function\">set_event<\/span><span class=\"token punctuation\">(<\/span>sockfd<span class=\"token punctuation\">,<\/span> EPOLLIN<span class=\"token punctuation\">,<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token function\">gettimeofday<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>begin<span class=\"token punctuation\">,<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><span class=\"token comment\">\/\/\u83b7\u53d6\u6700\u521d\u7684\u65f6\u95f4\u6233&#xff0c;begin \u662f\u5168\u5c40\u53d8\u91cf<\/span><\/p>\n<p><span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token comment\">\/\/ mainloop\u670d\u52a1\u5668\u7684\u6839\u672c<\/span><\/p>\n<p><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">epoll_event<\/span> events<span class=\"token punctuation\">[<\/span><span class=\"token number\">1024<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">int<\/span> nready <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">epoll_wait<\/span><span class=\"token punctuation\">(<\/span>epfd<span class=\"token punctuation\">,<\/span> events<span class=\"token punctuation\">,<\/span> <span class=\"token number\">1024<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">5<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><span class=\"token comment\">\/\/5 \u6307\u4ee3\u7b49\u5f85 5 \u6beb\u79d2&#xff0c;\u5982\u679c I\/O \u54cd\u5e94\u6ee1\u5458\u7684\u8bdd&#xff0c;\u7acb\u5373\u8fd4\u56de<\/span><br \/>\n<span class=\"token comment\">\/\/\u8be5\u901a\u77e5\u51fd\u6570\u662f\u9700\u8981\u8c03\u7528\u7cfb\u7edf\u5185\u6838\u7684&#xff0c;\u662f\u9700\u8981\u82b1\u8d39\u6210\u672c\u7684&#xff0c;\u5982\u679c\u53ea\u662f\u901a\u77e5\u67d0\u4e9b\u5185\u5bb9\u6ca1\u6709\u8bfb\u5b8c\u800c\u8c03\u7528&#xff0c;\u662f\u6781\u5176\u5f97\u4e0d\u507f\u5931\u7684&#xff0c;\u8fd9\u662f\u6211\u4eec\u9700\u8981\u7528\u5230\u8fb9\u6cbf\u89e6\u53d1\u7684\u539f\u56e0&#xff0c;\u53ea\u662f\u7f16\u7a0b\u96be\u5ea6\u66f4\u5927\u4e86<\/span><br \/>\n<span class=\"token comment\">\/\/\u6211\u4eec\u8981\u91cd\u89c6\u64cd\u4f5c\u7cfb\u7edf\u5185\u6838\u7684\u8c03\u52a8&#xff0c;\u7cfb\u7edf I\/O \u5e76\u4e0d\u5168\u4f53\u73b0\u5728\u4ee3\u7801\u4e4b\u4e0a&#xff0c;\u800c\u4ee3\u7801\u8981\u8003\u8651\u64cd\u4f5c\u7cfb\u7edf\u5185\u6838\u53ef\u80fd\u51fa\u73b0\u7684\u60c5\u51b5&#xff1b;\u7f16\u5199\u4ee3\u7801\u8981\u770b\u5230\u4ee3\u7801\u4e4b\u5916\u7684\u4e1c\u897f<\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span>i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span>i <span class=\"token operator\">&lt;<\/span> nready<span class=\"token punctuation\">;<\/span>i <span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> connfd <span class=\"token operator\">&#061;<\/span> events<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>data<span class=\"token punctuation\">.<\/span>fd<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">int<\/span> is_listener <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><span class=\"token comment\">\/\/\u72b6\u6001\u673a-\u91cd\u7f6e<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u5f53\u8fde\u63a5\u5f02\u5e38\u65ad\u5f00\u65f6\u672a\u6e05\u7406\u8d44\u6e90&#xff0c;\u6dfb\u52a0\u9519\u8bef\u5904\u7406&#xff1a;<\/span><br \/>\n<span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>events<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>events <span class=\"token operator\">&amp;<\/span> EPOLLERR <span class=\"token operator\">||<\/span> events<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>events <span class=\"token operator\">&amp;<\/span> EPOLLHUP<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token comment\">\/\/ \u8981\u6ce8\u610f \u201c|\u201d \u662f\u6309\u4f4d\u6216\u64cd\u4f5c&#xff0c;\u80fd\u8fdb\u884c\u63a9\u7801\u53e0\u52a0&#xff1b;\u201c&amp;\u201d \u662f\u6309\u4f4d\u4e0e\u64cd\u4f5c<\/span><br \/>\n<span class=\"token comment\">\/\/  EPOLLHUP \u8868\u793a\u5bf9\u5e94\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u88ab\u6302\u65ad\u3002EPOLLERR \u8868\u793a\u5bf9\u5e94\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u53d1\u751f\u9519\u8bef\u3002<\/span><\/p>\n<p><span class=\"token function\">close_connection<\/span><span class=\"token punctuation\">(<\/span>connfd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">continue<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u68c0\u67e5\u662f\u5426\u4e3a\u76d1\u542c\u5957\u63a5\u5b57<\/span><br \/>\n<span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> j <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> j <span class=\"token operator\">&lt;<\/span> MAX_PORTS<span class=\"token punctuation\">;<\/span> j<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>connfd <span class=\"token operator\">&#061;&#061;<\/span> listen_fds<span class=\"token punctuation\">[<\/span>j<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\nconn_list<span class=\"token punctuation\">[<\/span>connfd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>r_action<span class=\"token punctuation\">.<\/span><span class=\"token function\">accept_callback<\/span><span class=\"token punctuation\">(<\/span>connfd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\nis_listener <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>is_listener<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">continue<\/span><span class=\"token punctuation\">;<\/span><span class=\"token comment\">\/\/\u72b6\u6001\u673a-\u8fdb\u5165\u4e0b\u4e00\u4e2a\u73af\u8282<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u5904\u7406\u8bfb\u4e8b\u4ef6<\/span><br \/>\n<span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>events<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>events <span class=\"token operator\">&amp;<\/span> EPOLLIN<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/\/ \u8fd9\u662f\u76d1\u63a7\u5230\u4e86\u9664 sockfd \u4ee5\u5916\u7684\u5957\u63a5\u5b57<\/span><br \/>\n<span class=\"token comment\">\/\/ ET \u8fb9\u6cbf\u6a21\u5f0f\u9700\u5faa\u73af\u8bfb\u53d6&#xff0c;\u539f\u56e0\u662f\u8981\u4fdd\u8bc1\u7f51\u7edc I\/O \u6240\u6709\u5185\u5bb9\u90fd\u88ab\u8bfb\u53d6&#xff01;<\/span><br \/>\n<span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>conn_list<span class=\"token punctuation\">[<\/span>connfd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">recv_callback<\/span><span class=\"token punctuation\">(<\/span>connfd<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&gt;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token comment\">\/\/ \u8fd4\u56de0\u8868\u793a\u6210\u529f<\/span><br \/>\n<span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;[%ld] RECV: %s\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span>conn_list<span class=\"token punctuation\">[<\/span>connfd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>rlength<span class=\"token punctuation\">,<\/span> conn_list<span class=\"token punctuation\">[<\/span>connfd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>rbuffer<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/\/\u8fde\u63a5\u5728 recv \u51fd\u6570\u5904\u65e9\u5df2\u91ca\u653e<\/span><br \/>\n<span class=\"token keyword\">continue<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u8df3\u8fc7\u540e\u7eed\u5904\u7406<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token comment\">\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\u8bfb\u64cd\u4f5c\u7684\u4e1a\u52a1\u7aef(start)     \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<\/span><br \/>\n<span class=\"token comment\">\/\/\u81f3\u6b64&#xff0c;\u5ba2\u6237\u7aef\u7684\u8bf7\u6c42\u62a5\u6587\u5168\u90e8\u5199\u5b8c\u4e86&#xff0c;\u5199\u5165\u4e86 rbuffer \u4e4b\u4e2d\u3002\u6211\u4eec\u8981\u5229\u7528\u8fd9\u4e2a\u5185\u5b58\u53bb\u6267\u884c\u4e1a\u52a1\u64cd\u4f5c<\/span><br \/>\n<span class=\"token comment\">\/\/\u5b9e\u73b0 HTTP \u8bf7\u6c42&#xff0c;\u5728\u4ee3\u7801\u91cc\u9762&#xff0c;\u8be5\u51fd\u6570\u53ea\u662f\u5f62\u5f0f\u4e0a\u5b58\u5728&#xff0c;\u5e76\u4e0d\u662f\u91cd\u70b9<\/span><br \/>\n<span class=\"token comment\">\/\/http_request(&amp;conn_list[fd]);<\/span><\/p>\n<p><span class=\"token comment\">\/\/WebSocket \u534f\u8bae\u7684\u8bf7\u6c42<\/span><br \/>\n<span class=\"token comment\">\/\/ ws_request(&amp;conn_list[fd]);<\/span><br \/>\n<span class=\"token comment\">\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\u8bfb\u64cd\u4f5c\u7684\u4e1a\u52a1\u7aef(start)     \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<\/span><\/p>\n<p><span class=\"token function\">set_event<\/span><span class=\"token punctuation\">(<\/span>connfd<span class=\"token punctuation\">,<\/span> EPOLLOUT<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>events<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>events <span class=\"token operator\">&amp;<\/span> EPOLLOUT<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><\/p>\n<p><span class=\"token comment\">\/\/\u8fd9\u91cc\u5fc5\u987b\u6ce8\u610f EPOLLOUT \u4e0d\u662f\u8fb9\u6cbf\u4e8b\u4ef6\u89e6\u53d1\u6a21\u5f0f&#xff0c;\u6211\u4eec\u901a\u5e38\u53ea\u628a\u54cd\u5e94\u62a5\u6587\u7684 header \u5199\u5165 wbuffer \u4e2d&#xff0c;\u957f\u5ea6\u662f\u56fa\u5b9a\u7684&#xff0c;\u56e0\u6b64\u6c34\u5e73\u51fa\u53d1\u5373\u53ef\u3002<\/span><br \/>\n<span class=\"token comment\">\/\/\u81f3\u4e8e\u90a3\u5927\u6bb5\u5927\u6bb5\u7684\u6587\u4ef6\u8d44\u6e90\u4f20\u8f93&#xff0c;\u5219\u662f\u901a\u8fc7\u6587\u4ef6\u63cf\u8ff0\u7b26\u4e4b\u95f4\u64cd\u4f5c\u5b8c\u6210&#xff0c;\u8df3\u8fc7\u7f13\u51b2\u533a\u8bfb\u5199<\/span><\/p>\n<p><span class=\"token comment\">\/\/ send \u4f1a\u56e0\u65e0\u8f93\u8f93\u51fa\u800c\u963b\u65ad<\/span><br \/>\n<span class=\"token comment\">\/\/ \u51fd\u6570 send&#xff1a; \u53d1\u9001\u56fa\u5b9a\u5b57\u8282\u7684\u5185\u5bb9\u3002<\/span><br \/>\n<span class=\"token comment\">\/\/ \u8fd4\u56de\u503c &gt; 0&#xff1a;\u8868\u793a\u6210\u529f\u53d1\u9001\u4e86\u6570\u636e&#xff0c;\u8fd4\u56de\u503c\u8868\u793a\u5b9e\u9645\u53d1\u9001\u7684\u5b57\u8282\u6570\u3002<\/span><br \/>\n<span class=\"token comment\">\/\/ \u8fd4\u56de\u503c &#061;&#061; -1&#xff1a;\u8868\u793a\u53d1\u9001\u64cd\u4f5c\u5931\u8d25\u3002\u9519\u8bef\u539f\u56e0\u53ef\u4ee5\u901a\u8fc7 errno \u83b7\u53d6<\/span><\/p>\n<p>conn_list<span class=\"token punctuation\">[<\/span>connfd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">send_callback<\/span><span class=\"token punctuation\">(<\/span>connfd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/\u5982\u679c\u662f\u4e3a\u4e86\u6d4b\u8bd5\u767e\u4e07\u5e76\u53d1&#xff0c;\u5219\u7528\u8fd9\u4e2a&#xff0c;\u4e0d\u8981\u628a fd \u5173\u95ed<\/span><br \/>\n<span class=\"token function\">set_event<\/span><span class=\"token punctuation\">(<\/span>connfd<span class=\"token punctuation\">,<\/span> EPOLLIN <span class=\"token operator\">|<\/span> EPOLLET<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><span class=\"token comment\">\/\/ \u8fd9\u6b21\u8f93\u51fa\u53d1\u9001\u4e8b\u4ef6\u7ed3\u675f\u4e86&#xff1b;\u6539\u4e3a \u201c\u8fb9\u6cbf\u8bfb\u5199\u6a21\u5f0f\u201d&#xff0c;\u6267\u884c epoll_ctl \u51fd\u6570&#xff0c;\u7cfb\u7edf\u5185\u6838\u4f1a\u76f4\u63a5\u628a fd \u52a0\u8f7d\u5230 epoll \u7684\u5c31\u7eea\u96c6\u4e4b\u4e2d<\/span><\/p>\n<p><span class=\"token punctuation\">}<\/span><span class=\"token keyword\">else<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Unknown event on clientfd: %d, errno:%d\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span> connfd<span class=\"token punctuation\">,<\/span> errno<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token function\">close_connection<\/span><span class=\"token punctuation\">(<\/span>connfd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token punctuation\">}<\/span><\/p>\n<p>\u6211\u4eec\u6ce8\u610f\u5230&#xff0c;\u5bf9\u4e8e\u6a21\u5757\u51fd\u6570 accept_cb \u7684\u4f7f\u7528&#xff0c;\u6211\u4eec\u501f\u52a9\u4e86 \u201c\u72b6\u6001\u673a\u201d \u7684\u601d\u8def&#xff0c;\u5373\u4ee3\u7801\u4e2d\u7684 is_listener&#xff0c;\u8ba9\u60c5\u51b5\u5f97\u4ee5\u5206\u7c7b\u3002<\/p>\n<h2>\u4ee3\u7801\u8fd0\u884c\u6548\u679c<\/h2>\n<p>\u4ee3\u7801\u7f16\u8bd1<\/p>\n<p>qiming&#064;qiming:~\/share\/CTASK\/TCP_test$ gcc -o reactor reactor.c<\/p>\n<p>\u7a0b\u5e8f\u6267\u884c&#xff0c;\u4e00\u5f00\u59cb\u6ca1\u94fe\u63a5\u7684\u65f6\u5019&#xff0c;\u7a0b\u5e8f\u5e76\u6ca1\u6709\u6302\u8d77&#xff0c;\u800c\u662f\u4f5c\u65e0\u610f\u4e49\u7684 while \u6b7b\u5faa\u73af&#xff0c;\u539f\u56e0\u662f\u4ee3\u7801\u4e2d\u7684 epoll_wait(epfd, events, 1024, 5) \u5e76\u975e\u963b\u585e\u8fd0\u884c&#xff0c;\u800c\u662f\u7b49\u5f85 5 \u6beb\u79d2\u540e\u8fd0\u884c\u4e0b\u4e00\u884c\u4ee3\u7801\u3002<\/p>\n<p>qiming&#064;qiming:~\/share\/CTASK\/TCP_test$ .\/reactor<\/p>\n<p>NetAssist \u8fdc\u7a0b\u8fde\u63a5 <img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/07\/20250729182102-6889110e86f10.png\" alt=\"\u5728\u8fd9\u91cc\u63d2\u5165\u56fe\u7247\u63cf\u8ff0\" \/> \u53d1\u9001\u4fe1\u606f&#xff08;\u6211\u4eec\u5e76\u6ca1\u53d1\u9001\u4ec0\u4e48\u4e1c\u897f&#xff0c;\u53ea\u662f\u8c61\u5f81\u6027\u7684\u8bbe\u7f6e&#xff0c;\u8bfb\u8005\u53ef\u81ea\u884c\u8bbe\u7f6e&#xff0c;\u8f93\u51fa&#xff09;<\/p>\n<p>qiming&#064;qiming:~\/share\/CTASK\/TCP_test$ .\/reactor<br \/>\n<span class=\"token punctuation\">[<\/span><span class=\"token number\">13244<\/span><span class=\"token punctuation\">]<\/span> RECV: The drawings convey the significance of self-discipline and hard-work. The youngster on the left concentrates on her assignments and shows no intention of putting them off. In contrast, the <span class=\"token function\">man<\/span> on the right exhibits a desire <span class=\"token keyword\">for<\/span> delaying his task and holds that he doesn<span class=\"token string\">&#039;t go cracking until the deadline.<br \/>\nAs the thought-provoking pictures intend to mirror, the idle boy as mentioned above is not likely to finish his assignments in the end, any more than a man can attain great achievement if he is accustomed to putting tasks off. For one thing, the habits shape the turns of our attitudes and behaviors of how to deal with our plans and tasks. In the course of pursuing our goals, we may face a great deal of temp-<br \/>\ntations and adversities, and a good habit of self-discipline can direct us to make right decisions and refrain from indulging us with entertainment. For another, if we fail to be self-disciplined, we will be deprived of the opportunities for forging the brilliant traits, like mental maturity, fortitude, creativity and so on, which will render us considerable autonomy and lead us to be successful.<br \/>\nPersonally, we can&#039;<\/span>t underscore the significance of the good habits too much. It is advisable that we should concentrate on our daily tasks through strict <span class=\"token function\">time<\/span> management and enjoy the course of striving.<br \/>\nThe drawings convey the significance of self-discipline and hard-work. The youngster on the left concentrates on her assignments and shows no intention of putting them off. In contrast, the <span class=\"token function\">man<\/span> on the right exhibits a desire <span class=\"token keyword\">for<\/span> delaying his task and holds that he doesn<span class=\"token string\">&#039;t go cracking until the deadline.<br \/>\nAs the thought-provoking pictures intend to mirror, the idle boy as mentioned above is not likely to finish his assignments in the end, any more than a man can attain great achievement if he is accustomed to putting tasks off. For one thing, the habits shape the turns of our attitudes and behaviors of how to deal with our plans and tasks. In the course of pursuing our goals, we may face a great deal of temp-<br \/>\ntations and adversities, and a good habit of self-discipline can direct us to make right decisions and refrain from indulging us with entertainment. For another, if we fail to be self-disciplined, we will be deprived of the opportunities for forging the brilliant traits, like mental maturity, fortitude, creativity and so on, which will render us considerable autonomy and lead us to be successful.<br \/>\nPersonally, we can&#039;<\/span>t underscore the significance of the good habits too much. It is advisable that we should concentrate on our daily tasks through strict <span class=\"token function\">time<\/span> management and enjoy the course of striving.The drawings convey the significance of self-discipline and hard-work. The youngster on the left concentrates on her assignments and shows n<\/p>\n<p>\u6211\u53d1\u9001\u4e86\u82e5\u5e72\u6bb5\u8003\u7814\u82f1\u8bed\u4e00\u7684\u5927\u4f5c\u6587&#xff08;\u540c\u4e00\u7bc7\u6587\u7ae0\u591a\u6b21\u590d\u5236\u7c98\u8d34&#xff09;&#xff0c;\u6a21\u62df\u5ba2\u6237\u7aef\u53d1\u9001\u7684\u5185\u5bb9\u975e\u5e38\u591a&#xff0c;\u591a\u5230\u8d85\u8fc7\u4e86\u4e00\u5f00\u59cb\u8bbe\u7f6e\u7684\u8bfb\u7f13\u51b2\u533a\u5bb9\u91cf BUFFER_LENGTH&#xff0c;\u5373 1 KB \u7684\u5185\u5bb9\u3002\u6211\u4eec\u6ce8\u610f\u5230<\/p>\n<p><span class=\"token punctuation\">[<\/span><span class=\"token number\">13244<\/span><span class=\"token punctuation\">]<\/span> RECV: The drawings <span class=\"token punctuation\">..<\/span>. \u7565<\/p>\n<p>\u5171\u53d1\u9001\u4e86 1 \u4e07\u591a\u4e2a\u5b57\u8282\u7684\u5185\u5bb9&#xff0c;\u8bf4\u660e\u6211\u4eec\u7684\u52a8\u6001\u5185\u5b58\u6269\u5145\u7684\u4ee3\u7801\u662f\u6709\u6548\u7684\u3002<\/p>\n<p>\u800c\u4e14\u63a5\u53d7\u5b8c\u4fe1\u606f\u540e&#xff0c;\u8fd8\u53ef\u4ee5\u53d1\u9001\u4fe1\u606f&#xff0c;\u8bf4\u660e\u4e8b\u4ef6\u8f6c\u5316\u7684\u8bbe\u8ba1\u4e5f\u662f\u6709\u6548\u7684&#xff08;\u5728\u8f93\u51fa\u7684\u6700\u672b\u7aef&#xff0c;\u6211\u4eec\u53ef\u5728\u547d\u4ee4\u884c\u5904\u6ce8\u610f\u5230&#xff09;\u3002<\/p>\n<p>SEND: <span class=\"token number\">0<\/span><\/p>\n<p>\u8fd9\u6837\u4e00\u6765&#xff0c;\u6211\u4eec\u8fd9\u4e2a\u670d\u52a1\u5668\u662f\u53ef\u4ee5\u5b8c\u6210\u4e00\u4e2a\u51c6\u7f51\u7edc I\/O \u4e8b\u52a1\u7684\u3002\u5b8c\u6574\u7684\u7f51\u7edc I\/O \u4e8b\u52a1\u662f<\/p>\n<p>  #mermaid-svg-5Ngt0Zazci2ucopY {font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-5Ngt0Zazci2ucopY .error-icon{fill:#552222;}#mermaid-svg-5Ngt0Zazci2ucopY .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-5Ngt0Zazci2ucopY .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-5Ngt0Zazci2ucopY .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-5Ngt0Zazci2ucopY .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-5Ngt0Zazci2ucopY .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-5Ngt0Zazci2ucopY .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-5Ngt0Zazci2ucopY .marker{fill:#333333;stroke:#333333;}#mermaid-svg-5Ngt0Zazci2ucopY .marker.cross{stroke:#333333;}#mermaid-svg-5Ngt0Zazci2ucopY svg{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-5Ngt0Zazci2ucopY .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-5Ngt0Zazci2ucopY text.actor&gt;tspan{fill:black;stroke:none;}#mermaid-svg-5Ngt0Zazci2ucopY .actor-line{stroke:grey;}#mermaid-svg-5Ngt0Zazci2ucopY .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-5Ngt0Zazci2ucopY .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-5Ngt0Zazci2ucopY #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-5Ngt0Zazci2ucopY .sequenceNumber{fill:white;}#mermaid-svg-5Ngt0Zazci2ucopY #sequencenumber{fill:#333;}#mermaid-svg-5Ngt0Zazci2ucopY #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-5Ngt0Zazci2ucopY .messageText{fill:#333;stroke:#333;}#mermaid-svg-5Ngt0Zazci2ucopY .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-5Ngt0Zazci2ucopY .labelText,#mermaid-svg-5Ngt0Zazci2ucopY .labelText&gt;tspan{fill:black;stroke:none;}#mermaid-svg-5Ngt0Zazci2ucopY .loopText,#mermaid-svg-5Ngt0Zazci2ucopY .loopText&gt;tspan{fill:black;stroke:none;}#mermaid-svg-5Ngt0Zazci2ucopY .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-5Ngt0Zazci2ucopY .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-5Ngt0Zazci2ucopY .noteText,#mermaid-svg-5Ngt0Zazci2ucopY .noteText&gt;tspan{fill:black;stroke:none;}#mermaid-svg-5Ngt0Zazci2ucopY .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-5Ngt0Zazci2ucopY .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-5Ngt0Zazci2ucopY .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-5Ngt0Zazci2ucopY .actorPopupMenu{position:absolute;}#mermaid-svg-5Ngt0Zazci2ucopY .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 \/ 0.4));}#mermaid-svg-5Ngt0Zazci2ucopY .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-5Ngt0Zazci2ucopY .actor-man circle,#mermaid-svg-5Ngt0Zazci2ucopY line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-5Ngt0Zazci2ucopY :root{&#8211;mermaid-font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;}<\/p>\n<p>      \u5ba2\u6237\u7aef<\/p>\n<p>      \u670d\u52a1\u5668<\/p>\n<p>   \u7b2c\u4e00\u6b65&#xff0c;\u7f51\u7edc\u8bf7\u6c42<\/p>\n<p>   \u7b2c\u4e8c\u6b65&#xff0c;\u7f51\u7edc\u54cd\u5e94<\/p>\n<p>     \u7b2c\u4e09\u6b65&#xff0c;\u5ba2\u6237\u7aef\u5904\u7406\u54cd\u5e94<\/p>\n<p>     \u5ba2\u6237\u7aef<\/p>\n<p>     \u670d\u52a1\u5668<\/p>\n<h2>\u603b\u7ed3<\/h2>\n<p>\u672c\u7bc7\u6587\u7ae0&#xff0c;\u5bf9\u4e0a\u4e00\u7bc7 \u6587\u7ae0 \u7684 EPOLL \u670d\u52a1\u5668\u4f5c\u51fa\u6a21\u5757\u5316\u7684\u5347\u7ea7&#xff0c;\u8ba9\u4ee3\u7801\u66f4\u6709\u7ec4\u7ec7\u5ea6\u7684\u540c\u65f6&#xff0c;\u8fd8\u6709\u4ee5\u4e0b\u7684\u7279\u6027<\/p>\n<li>\u5b9a\u4e49\u4e86 conn \u7c7b\u578b&#xff0c;\u5b83\u80fd\u8bb0\u5f55\u5bf9\u5e94\u7f51\u7edc I\/O \u6587\u4ef6\u7684\u8f93\u5165\u8f93\u51fa\u5185\u5bb9&#xff0c;\u800c\u4e14\u8fd8\u8bb0\u5f55\u4e86\u5bf9\u5e94\u5957\u63a5\u5b57\u7684\u8f93\u5165\u548c\u8f93\u51fa\u884c\u4e3a\u3002\u7c7b\u4f3c\u4e8e \u201c\u591a\u6001\u201d \u7684\u6982\u5ff5&#xff0c;\u540c\u7c7b\u578b\u7684\u4e24\u4e2a\u53d8\u91cf\u5185\u540c\u4e00\u6210\u5458\u540d\u5b57\u6709\u4e0d\u540c\u542b\u4e49\u3002\u8ba9\u547d\u540d\u53d8\u5f97\u7b80\u5355\u4e86\u8bb8\u591a\u3002<\/li>\n<li>\u5bf9\u4efb\u4f55\u5957\u63a5\u5b57&#xff08;\u65e0\u8bba\u662f\u5426\u4e3a\u76d1\u542c\u5957\u63a5\u5b57&#xff09;\u8bbe\u7f6e\u4e86\u6839\u636e\u4e8b\u4ef6\u4fe1\u53f7\u800c\u89e6\u53d1\u7684\u7f51\u7edc I\/O \u884c\u4e3a\u3002\u8fd9\u5c31\u662f \u201cReactor\u201d \u8fd9\u4e2a\u540d\u5b57\u7684\u7531\u6765\u3002<\/li>\n<li>\u5bf9\u4e8e recv_cb \u51fd\u6570\u8bbe\u8ba1\u4e86\u53ef\u52a8\u6001\u6269\u5145\u8bfb\u7f13\u51b2\u533a\u7684\u529f\u80fd&#xff0c;\u80fd\u591f\u63a5\u6536\u8d85\u5927\u578b\u6570\u636e\u3002<\/li>\n<li>\u51fd\u6570 set_event \u80fd\u591f\u6709\u6548\u7684\u8fdb\u884c\u4e8b\u4ef6\u8f6c\u5316&#xff0c;\u4f7f\u4e4b\u540c\u4e00\u4e2a\u5957\u63a5\u5b57\u7684\u4e8b\u4ef6\u80fd\u591f\u5728 EPOLLIN | EPOLLET \u548c EPOLLOUT \u4e4b\u95f4\u6765\u56de\u8f6c\u6362&#xff0c;\u521a\u597d\u9002\u5e94\u4e86\u7f51\u7edc I\/O \u7684\u4e8b\u52a1\u6a21\u5f0f\u3002<\/li>\n<p>\u5728\u4e0b\u4e00\u7bc7\u6587\u7ae0\u91cc&#xff0c;\u6211\u4eec\u9488\u5bf9\u8fd9\u4e2a\u4e8b\u4ef6\u9a71\u52a8 reactor \u5f0f\u7684\u670d\u52a1\u5668&#xff08;\u8fd8\u662f\u8fd9\u4efd\u4ee3\u7801&#xff09;\u6d4b\u8bd5\u5176\u767e\u4e07\u5e76\u53d1\u7684\u80fd\u529b\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u6587\u7ae0\u6d4f\u89c8\u9605\u8bfb912\u6b21\uff0c\u70b9\u8d5e23\u6b21\uff0c\u6536\u85cf25\u6b21\u3002\u672c\u6587\u4ecb\u7ecd\u4e86\u4e00\u79cd\u57fa\u4e8e\u4e8b\u4ef6\u9a71\u52a8\u7684reactor\u670d\u52a1\u5668\u67b6\u6784\u8bbe\u8ba1\uff0c\u901a\u8fc7\u6a21\u5757\u5316\u65b9\u5f0f\u5b9e\u73b0\u7f51\u7edcI\/O\u9ad8\u5e76\u53d1\u5904\u7406\u3002\u6587\u7ae0\u9996\u5148\u63a8\u8350\u4e86\u96f6\u58f0\u6559\u80b2\u7684Linux\u7b49\u6280\u672f\u5b66\u4e60\u8d44\u6e90\uff0c\u7136\u540e\u8be6\u7ec6\u9610\u8ff0\u4e86\u5982\u4f55\u5c06EPOLL\u670d\u52a1\u5668\u4ee3\u7801\u62c6\u5206\u4e3a\u4e09\u4e2a\u6838\u5fc3\u6a21\u5757\uff1aaccept_cb\uff08\u5904\u7406\u65b0\u8fde\u63a5\uff09\u3001read_cb\uff08\u5904\u7406\u8bfb\u4e8b\u4ef6\uff09\u548csend_cb\uff08\u5904\u7406\u5199\u4e8b\u4ef6\uff09\u3002\u901a\u8fc7\u6d41\u7a0b\u56fe\u5c55\u793a\u4e86\u6574\u4f53\u8fd0\u884c\u673a\u5236\uff0c\u5e76\u63d0\u4f9b\u4e86C\u8bed\u8a00\u5b9e\u73b0\u7684\u5173\u952e\u4ee3\u7801\u7247\u6bb5\uff0c\u5305\u62ecreactor.h\u5934\u6587\u4ef6\u5b9a\u4e49\u548c\u4e3b\u8981\u51c6\u5907\u5de5\u4f5c\u3002\u8be5\u8bbe\u8ba1\u652f\u6301\u4e1a\u52a1\u6269\u5c55\uff0c\u53ef\u964d\u4f4e\u5f00\u53d1\u96be\u5ea6\uff0c\u540c\u65f6\u4e3a\u540e\u7eed\u5b9e\u73b0\u767e\u4e07\u7ea7\u5e76\u53d1\u8fde\u63a5\u5960\u5b9a\u4e86\u57fa\u7840\u3002_c\u8bed\u8a00epoll\u670d\u52a1\u5668<\/p>\n","protected":false},"author":2,"featured_media":46089,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[43,78,44],"topic":[],"class_list":["post-46090","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-server","tag-43","tag-78","tag-44"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u3010\u7f51\u7edc\u7f16\u7a0b\u3011\u4e8b\u4ef6\u9a71\u52a8 reactor \u5f0f\u7684\u670d\u52a1\u5668\uff08EPOLL\u673a\u5236\uff09 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.wsisp.com\/helps\/46090.html\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u3010\u7f51\u7edc\u7f16\u7a0b\u3011\u4e8b\u4ef6\u9a71\u52a8 reactor \u5f0f\u7684\u670d\u52a1\u5668\uff08EPOLL\u673a\u5236\uff09 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"og:description\" content=\"\u6587\u7ae0\u6d4f\u89c8\u9605\u8bfb912\u6b21\uff0c\u70b9\u8d5e23\u6b21\uff0c\u6536\u85cf25\u6b21\u3002\u672c\u6587\u4ecb\u7ecd\u4e86\u4e00\u79cd\u57fa\u4e8e\u4e8b\u4ef6\u9a71\u52a8\u7684reactor\u670d\u52a1\u5668\u67b6\u6784\u8bbe\u8ba1\uff0c\u901a\u8fc7\u6a21\u5757\u5316\u65b9\u5f0f\u5b9e\u73b0\u7f51\u7edcI\/O\u9ad8\u5e76\u53d1\u5904\u7406\u3002\u6587\u7ae0\u9996\u5148\u63a8\u8350\u4e86\u96f6\u58f0\u6559\u80b2\u7684Linux\u7b49\u6280\u672f\u5b66\u4e60\u8d44\u6e90\uff0c\u7136\u540e\u8be6\u7ec6\u9610\u8ff0\u4e86\u5982\u4f55\u5c06EPOLL\u670d\u52a1\u5668\u4ee3\u7801\u62c6\u5206\u4e3a\u4e09\u4e2a\u6838\u5fc3\u6a21\u5757\uff1aaccept_cb\uff08\u5904\u7406\u65b0\u8fde\u63a5\uff09\u3001read_cb\uff08\u5904\u7406\u8bfb\u4e8b\u4ef6\uff09\u548csend_cb\uff08\u5904\u7406\u5199\u4e8b\u4ef6\uff09\u3002\u901a\u8fc7\u6d41\u7a0b\u56fe\u5c55\u793a\u4e86\u6574\u4f53\u8fd0\u884c\u673a\u5236\uff0c\u5e76\u63d0\u4f9b\u4e86C\u8bed\u8a00\u5b9e\u73b0\u7684\u5173\u952e\u4ee3\u7801\u7247\u6bb5\uff0c\u5305\u62ecreactor.h\u5934\u6587\u4ef6\u5b9a\u4e49\u548c\u4e3b\u8981\u51c6\u5907\u5de5\u4f5c\u3002\u8be5\u8bbe\u8ba1\u652f\u6301\u4e1a\u52a1\u6269\u5c55\uff0c\u53ef\u964d\u4f4e\u5f00\u53d1\u96be\u5ea6\uff0c\u540c\u65f6\u4e3a\u540e\u7eed\u5b9e\u73b0\u767e\u4e07\u7ea7\u5e76\u53d1\u8fde\u63a5\u5960\u5b9a\u4e86\u57fa\u7840\u3002_c\u8bed\u8a00epoll\u670d\u52a1\u5668\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.wsisp.com\/helps\/46090.html\" \/>\n<meta property=\"og:site_name\" content=\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"article:published_time\" content=\"2025-07-29T18:21:03+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/07\/20250729182102-6889110e86f10.png\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"18 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/46090.html\",\"url\":\"https:\/\/www.wsisp.com\/helps\/46090.html\",\"name\":\"\u3010\u7f51\u7edc\u7f16\u7a0b\u3011\u4e8b\u4ef6\u9a71\u52a8 reactor \u5f0f\u7684\u670d\u52a1\u5668\uff08EPOLL\u673a\u5236\uff09 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"isPartOf\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\"},\"datePublished\":\"2025-07-29T18:21:03+00:00\",\"dateModified\":\"2025-07-29T18:21:03+00:00\",\"author\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/46090.html#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.wsisp.com\/helps\/46090.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/46090.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.wsisp.com\/helps\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u3010\u7f51\u7edc\u7f16\u7a0b\u3011\u4e8b\u4ef6\u9a71\u52a8 reactor \u5f0f\u7684\u670d\u52a1\u5668\uff08EPOLL\u673a\u5236\uff09\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\",\"url\":\"https:\/\/www.wsisp.com\/helps\/\",\"name\":\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"description\":\"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"contentUrl\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"caption\":\"admin\"},\"sameAs\":[\"http:\/\/wp.wsisp.com\"],\"url\":\"https:\/\/www.wsisp.com\/helps\/author\/admin\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\u3010\u7f51\u7edc\u7f16\u7a0b\u3011\u4e8b\u4ef6\u9a71\u52a8 reactor \u5f0f\u7684\u670d\u52a1\u5668\uff08EPOLL\u673a\u5236\uff09 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.wsisp.com\/helps\/46090.html","og_locale":"zh_CN","og_type":"article","og_title":"\u3010\u7f51\u7edc\u7f16\u7a0b\u3011\u4e8b\u4ef6\u9a71\u52a8 reactor \u5f0f\u7684\u670d\u52a1\u5668\uff08EPOLL\u673a\u5236\uff09 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","og_description":"\u6587\u7ae0\u6d4f\u89c8\u9605\u8bfb912\u6b21\uff0c\u70b9\u8d5e23\u6b21\uff0c\u6536\u85cf25\u6b21\u3002\u672c\u6587\u4ecb\u7ecd\u4e86\u4e00\u79cd\u57fa\u4e8e\u4e8b\u4ef6\u9a71\u52a8\u7684reactor\u670d\u52a1\u5668\u67b6\u6784\u8bbe\u8ba1\uff0c\u901a\u8fc7\u6a21\u5757\u5316\u65b9\u5f0f\u5b9e\u73b0\u7f51\u7edcI\/O\u9ad8\u5e76\u53d1\u5904\u7406\u3002\u6587\u7ae0\u9996\u5148\u63a8\u8350\u4e86\u96f6\u58f0\u6559\u80b2\u7684Linux\u7b49\u6280\u672f\u5b66\u4e60\u8d44\u6e90\uff0c\u7136\u540e\u8be6\u7ec6\u9610\u8ff0\u4e86\u5982\u4f55\u5c06EPOLL\u670d\u52a1\u5668\u4ee3\u7801\u62c6\u5206\u4e3a\u4e09\u4e2a\u6838\u5fc3\u6a21\u5757\uff1aaccept_cb\uff08\u5904\u7406\u65b0\u8fde\u63a5\uff09\u3001read_cb\uff08\u5904\u7406\u8bfb\u4e8b\u4ef6\uff09\u548csend_cb\uff08\u5904\u7406\u5199\u4e8b\u4ef6\uff09\u3002\u901a\u8fc7\u6d41\u7a0b\u56fe\u5c55\u793a\u4e86\u6574\u4f53\u8fd0\u884c\u673a\u5236\uff0c\u5e76\u63d0\u4f9b\u4e86C\u8bed\u8a00\u5b9e\u73b0\u7684\u5173\u952e\u4ee3\u7801\u7247\u6bb5\uff0c\u5305\u62ecreactor.h\u5934\u6587\u4ef6\u5b9a\u4e49\u548c\u4e3b\u8981\u51c6\u5907\u5de5\u4f5c\u3002\u8be5\u8bbe\u8ba1\u652f\u6301\u4e1a\u52a1\u6269\u5c55\uff0c\u53ef\u964d\u4f4e\u5f00\u53d1\u96be\u5ea6\uff0c\u540c\u65f6\u4e3a\u540e\u7eed\u5b9e\u73b0\u767e\u4e07\u7ea7\u5e76\u53d1\u8fde\u63a5\u5960\u5b9a\u4e86\u57fa\u7840\u3002_c\u8bed\u8a00epoll\u670d\u52a1\u5668","og_url":"https:\/\/www.wsisp.com\/helps\/46090.html","og_site_name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","article_published_time":"2025-07-29T18:21:03+00:00","og_image":[{"url":"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/07\/20250729182102-6889110e86f10.png"}],"author":"admin","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"admin","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"18 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.wsisp.com\/helps\/46090.html","url":"https:\/\/www.wsisp.com\/helps\/46090.html","name":"\u3010\u7f51\u7edc\u7f16\u7a0b\u3011\u4e8b\u4ef6\u9a71\u52a8 reactor \u5f0f\u7684\u670d\u52a1\u5668\uff08EPOLL\u673a\u5236\uff09 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","isPartOf":{"@id":"https:\/\/www.wsisp.com\/helps\/#website"},"datePublished":"2025-07-29T18:21:03+00:00","dateModified":"2025-07-29T18:21:03+00:00","author":{"@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41"},"breadcrumb":{"@id":"https:\/\/www.wsisp.com\/helps\/46090.html#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.wsisp.com\/helps\/46090.html"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.wsisp.com\/helps\/46090.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.wsisp.com\/helps"},{"@type":"ListItem","position":2,"name":"\u3010\u7f51\u7edc\u7f16\u7a0b\u3011\u4e8b\u4ef6\u9a71\u52a8 reactor \u5f0f\u7684\u670d\u52a1\u5668\uff08EPOLL\u673a\u5236\uff09"}]},{"@type":"WebSite","@id":"https:\/\/www.wsisp.com\/helps\/#website","url":"https:\/\/www.wsisp.com\/helps\/","name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","description":"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41","name":"admin","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/","url":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","contentUrl":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","caption":"admin"},"sameAs":["http:\/\/wp.wsisp.com"],"url":"https:\/\/www.wsisp.com\/helps\/author\/admin"}]}},"_links":{"self":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/46090","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/comments?post=46090"}],"version-history":[{"count":0,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/46090\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media\/46089"}],"wp:attachment":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media?parent=46090"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/categories?post=46090"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/tags?post=46090"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/topic?post=46090"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}