{"id":85444,"date":"2026-07-27T15:17:10","date_gmt":"2026-07-27T07:17:10","guid":{"rendered":"https:\/\/www.wsisp.com\/helps\/85444.html"},"modified":"2026-07-27T15:17:10","modified_gmt":"2026-07-27T07:17:10","slug":"%e3%80%90linux%e7%bd%91%e7%bb%9c%e7%b3%bb%e5%88%97%e3%80%91%e6%b7%b1%e5%85%a5%e7%90%86%e8%a7%a3-i-o-%e5%a4%9a%e8%b7%af%e5%a4%8d%e7%94%a8%ef%bc%9a%e4%bb%8e-select-%e7%97%9b%e7%82%b9%e5%88%b0-poll","status":"publish","type":"post","link":"https:\/\/www.wsisp.com\/helps\/85444.html","title":{"rendered":"\u3010Linux\u7f51\u7edc\u7cfb\u5217\u3011\u6df1\u5165\u7406\u89e3 I\/O \u591a\u8def\u590d\u7528\uff1a\u4ece select \u75db\u70b9\u5230 poll \u9ad8\u5e76\u53d1\u670d\u52a1\u5668\u843d\u5730\uff0c\u57fa\u4e8e Poll\u3001\u667a\u80fd\u6307\u9488\u4e0e\u975e\u963b\u585e I\/O\u4e0e\u7ebf\u7a0b\u6c60\u624b\u5199\u4e00\u4e2a\u9ad8\u6027\u80fd HTTP \u670d\u52a1\u5668\uff01\uff08\u9644\u6e90\u7801\uff09"},"content":{"rendered":"<p>&#x1f525; \u672c\u6587\u4e13\u680f&#xff1a;Linux\u7f51\u7edc &#x1f338;\u4f5c\u8005\u4e3b\u9875&#xff1a;\u52aa\u529b\u52aa\u529b\u518d\u52aa\u529bwz<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/07\/20260727071702-6a6705ee7be4c.gif\" alt=\"\u5728\u8fd9\u91cc\u63d2\u5165\u56fe\u7247\u63cf\u8ff0\" \/> <img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/07\/20260727071702-6a6705eea28c9.jpg\" alt=\"\u5728\u8fd9\u91cc\u63d2\u5165\u56fe\u7247\u63cf\u8ff0\" \/><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/07\/20260727071703-6a6705ef09605.gif\" alt=\"\u5728\u8fd9\u91cc\u63d2\u5165\u56fe\u7247\u63cf\u8ff0\" \/><\/p>\n<p>&#x1f4aa; \u4eca\u65e5\u535a\u5ba2\u52b1\u5fd7\u8bed\u5f55&#xff1a;\u9057\u61be\u662f\u8fc7\u53bb\u7684\u7070\u5c18&#xff0c;\u800c\u5e0c\u671b\u662f\u672a\u6765\u7684\u5149&#xff1b;\u522b\u56e0\u4e3a\u5fd9\u7740\u64e6\u7070&#xff0c;\u800c\u9519\u8fc7\u4e86\u63a8\u5f00\u7a97\u6237\u7684\u673a\u4f1a\u3002<\/p>\n<h3>\u2605\u2605\u2605 \u672c\u6587\u524d\u7f6e\u77e5\u8bc6&#xff1a;<\/h3>\n<h3>HTTP <\/h3>\n<hr \/>\n<h2>\u5f15\u5165<\/h2>\n<p>\u90a3\u4e48\u6b64\u524d\u6211\u4eec\u5df2\u7ecf\u5b8c\u6210\u4e86\u7f51\u7edc\u539f\u7406\u76f8\u5173\u5185\u5bb9\u7684\u5b66\u4e60&#xff0c;\u5176\u4e2d\u5305\u62ec\u4f7f\u7528\u7f51\u7edc\u7f16\u7a0b&#xff08;\u5373\u901a\u8fc7 TCP \u548c UDP \u7c7b\u578b\u7684\u5957\u63a5\u5b57&#xff09;\u8fdb\u884c\u901a\u4fe1&#xff0c;\u5e76\u4e14\u8ba4\u8bc6\u4e86 TCP\/IP \u6a21\u578b \u4e2d\u6bcf\u4e00\u5c42\u534f\u8bae\u6808\u7684\u57fa\u672c\u5185\u5bb9\u3002\u6211\u4eec\u77e5\u9053&#xff0c;\u4e00\u53f0\u4e3b\u673a\u80fd\u591f\u4e0e\u53e6\u4e00\u53f0\u4e3b\u673a\u8fdb\u884c\u901a\u4fe1&#xff0c;\u5373\u5728\u7f51\u7edc\u4e2d\u5b8c\u6210\u6570\u636e\u7684\u4f20\u8f93\u3002\u4f46\u9700\u8981\u660e\u786e\u7684\u662f&#xff0c;\u7f51\u7edc\u901a\u4fe1\u6a21\u578b\u5e76\u4e0d\u662f\u4e3b\u673a\u4e0e\u4e3b\u673a\u4e4b\u95f4\u76f4\u63a5\u901a\u4fe1&#xff0c;\u800c\u662f\u4f4d\u4e8e\u4e0d\u540c\u4e3b\u673a\u4e0a\u7684\u8fdb\u7a0b\u4e4b\u95f4\u8fdb\u884c\u901a\u4fe1\u3002<\/p>\n<p>\u5f53\u4f4d\u4e8e\u4e0d\u540c\u4e3b\u673a\u4e0a\u7684\u8fdb\u7a0b\u9700\u8981\u63a5\u6536\u5bf9\u65b9\u901a\u8fc7\u7f51\u7edc\u53d1\u9001\u8fc7\u6765\u7684\u6570\u636e\u62a5\u65f6&#xff0c;\u5176\u524d\u63d0\u662f\u53cc\u65b9\u90fd\u5fc5\u987b\u521b\u5efa \u5957\u63a5\u5b57&#xff08;socket&#xff09;\u3002\u5957\u63a5\u5b57\u53ef\u4ee5\u88ab\u770b\u4f5c\u4e00\u4e2a\u901a\u4fe1\u7684\u5bb9\u5668&#xff1a;\u7f51\u7edc\u4e2d\u63a5\u6536\u5230\u7684\u6570\u636e\u4f1a\u88ab\u5185\u6838\u653e\u5165\u5957\u63a5\u5b57\u7684\u63a5\u6536\u7f13\u51b2\u533a&#xff0c;\u968f\u540e\u8fdb\u7a0b\u901a\u8fc7\u7cfb\u7edf\u8c03\u7528\u4ece\u5957\u63a5\u5b57\u7684\u63a5\u6536\u7f13\u51b2\u533a\u4e2d\u8bfb\u53d6\u5e94\u7528\u5c42\u6570\u636e&#xff0c;\u5e76\u5bf9\u5176\u8fdb\u884c\u540e\u7eed\u89e3\u6790\u3002\u56e0\u6b64&#xff0c;\u4ece\u5e94\u7528\u7a0b\u5e8f\u7684\u89d2\u5ea6\u6765\u770b&#xff0c;\u901a\u4fe1\u7684\u8d77\u70b9\u5b9e\u9645\u4e0a\u5c31\u662f\u521b\u5efa\u5957\u63a5\u5b57\u5e76\u901a\u8fc7\u5957\u63a5\u5b57\u8fdb\u884c\u6570\u636e\u6536\u53d1\u3002<\/p>\n<p>\u5728\u5b9e\u9645\u7684\u7f51\u7edc\u5e94\u7528\u4e2d&#xff0c;\u8fdb\u7a0b\u4e4b\u95f4\u7684\u901a\u4fe1\u51e0\u4e4e\u90fd\u91c7\u7528 \u5ba2\u6237\u7aef\u2013\u670d\u52a1\u7aef&#xff08;Client\u2013Server&#xff09;\u6a21\u578b\u3002\u4e5f\u5c31\u662f\u8bf4&#xff0c;\u4e00\u4e2a\u8fdb\u7a0b\u626e\u6f14\u5ba2\u6237\u7aef\u7684\u89d2\u8272&#xff0c;\u53e6\u4e00\u4e2a\u8fdb\u7a0b\u626e\u6f14\u670d\u52a1\u7aef\u7684\u89d2\u8272\u3002\u5ba2\u6237\u7aef\u4e3b\u52a8\u5411\u670d\u52a1\u7aef\u53d1\u9001\u8bf7\u6c42\u62a5\u6587&#xff1b;\u670d\u52a1\u7aef\u6210\u529f\u63a5\u6536\u5230\u8bf7\u6c42\u62a5\u6587\u4e4b\u540e&#xff0c;\u5bf9\u8bf7\u6c42\u8fdb\u884c\u89e3\u6790\u5e76\u751f\u6210\u54cd\u5e94\u62a5\u6587&#xff0c;\u968f\u540e\u518d\u5c06\u54cd\u5e94\u53d1\u9001\u56de\u5ba2\u6237\u7aef\u3002<\/p>\n<p>\u5bf9\u4e8e\u670d\u52a1\u7aef\u6765\u8bf4&#xff0c;\u5176\u901a\u4fe1\u6a21\u5f0f\u901a\u5e38\u4e0d\u53ef\u80fd\u662f\u7b80\u5355\u7684\u70b9\u5bf9\u70b9\u901a\u4fe1\u3002\u6240\u8c13\u70b9\u5bf9\u70b9\u901a\u4fe1&#xff0c;\u662f\u6307\u4e00\u4e2a\u670d\u52a1\u7aef\u53ea\u4e0e\u4e00\u4e2a\u5ba2\u6237\u7aef\u8fdb\u884c\u901a\u4fe1&#xff0c;\u800c\u5728\u771f\u5b9e\u573a\u666f\u4e2d&#xff0c;\u670d\u52a1\u7aef\u901a\u5e38\u9700\u8981\u540c\u65f6\u4e3a\u591a\u4e2a\u5ba2\u6237\u7aef\u63d0\u4f9b\u670d\u52a1\u3002\u56e0\u6b64&#xff0c;\u670d\u52a1\u7aef\u4e0e\u5ba2\u6237\u7aef\u4e4b\u95f4\u901a\u5e38\u5448\u73b0\u51fa\u4e00\u5bf9\u591a\u7684\u5173\u7cfb\u3002\u8fd9\u610f\u5473\u7740\u670d\u52a1\u7aef\u5728\u4efb\u610f\u65f6\u523b\u90fd\u53ef\u80fd\u63a5\u6536\u5230\u6765\u81ea\u4e0d\u540c\u5ba2\u6237\u7aef\u53d1\u9001\u7684\u5927\u91cf\u8bf7\u6c42\u62a5\u6587\u3002\u4e3a\u4e86\u80fd\u591f\u6b63\u786e\u5904\u7406\u8fd9\u4e9b\u8bf7\u6c42&#xff0c;\u670d\u52a1\u7aef\u5fc5\u987b\u5177\u5907\u5728\u540c\u4e00\u65f6\u95f4\u5e76\u53d1\u5904\u7406\u591a\u4e2a\u8bf7\u6c42\u7684\u80fd\u529b&#xff0c;\u5373\u5728\u63a5\u6536\u5230\u8bf7\u6c42\u540e\u5b8c\u6210\u8bf7\u6c42\u89e3\u6790\u3001\u4e1a\u52a1\u5904\u7406\u4ee5\u53ca\u54cd\u5e94\u6784\u5efa&#xff0c;\u5e76\u6700\u7ec8\u5c06\u54cd\u5e94\u53d1\u9001\u56de\u5bf9\u5e94\u7684\u5ba2\u6237\u7aef\u3002\u56e0\u6b64&#xff0c;\u4ece\u7cfb\u7edf\u8bbe\u8ba1\u7684\u89d2\u5ea6\u6765\u770b&#xff0c;\u670d\u52a1\u7aef\u5929\u7136\u9700\u8981\u5177\u5907\u8f83\u9ad8\u7684\u5e76\u53d1\u5904\u7406\u80fd\u529b\u3002<\/p>\n<p>\u867d\u7136\u670d\u52a1\u7aef\u662f\u4e0e\u4f4d\u4e8e\u4e0d\u540c\u4e3b\u673a\u4e0a\u7684\u5ba2\u6237\u7aef\u8fdb\u884c\u901a\u4fe1&#xff0c;\u4f46\u4ece\u670d\u52a1\u7aef\u81ea\u8eab\u7684\u89c6\u89d2\u6765\u770b&#xff0c;\u5176\u5904\u7406\u8bf7\u6c42\u7684\u8fc7\u7a0b\u672c\u8d28\u4e0a\u4ecd\u7136\u662f\u4e00\u4e2a I\/O \u8fc7\u7a0b&#xff1a; \u670d\u52a1\u7aef\u8fdb\u7a0b\u901a\u8fc7\u7cfb\u7edf\u8c03\u7528\u4ece\u5957\u63a5\u5b57\u7684\u63a5\u6536\u7f13\u51b2\u533a\u8bfb\u53d6\u5e94\u7528\u5c42\u6570\u636e&#xff0c;\u5bf9\u6570\u636e\u8fdb\u884c\u5904\u7406&#xff0c;\u7136\u540e\u518d\u901a\u8fc7\u7cfb\u7edf\u8c03\u7528\u5c06\u751f\u6210\u7684\u54cd\u5e94\u62a5\u6587\u5199\u5165\u5230\u5957\u63a5\u5b57\u7684\u53d1\u9001\u7f13\u51b2\u533a\u3002<\/p>\n<p>\u6362\u8a00\u4e4b&#xff0c;\u670d\u52a1\u7aef\u8fdb\u7a0b\u8c03\u7528\u7cfb\u7edf\u8c03\u7528\u63a5\u53e3\u4ece\u5957\u63a5\u5b57\u63a5\u6536\u7f13\u51b2\u533a\u8bfb\u53d6\u5e94\u7528\u5c42\u6570\u636e&#xff0c;\u4ee5\u53ca\u8c03\u7528\u7cfb\u7edf\u8c03\u7528\u5c06\u5e94\u7528\u5c42\u6570\u636e\u5199\u5165\u53d1\u9001\u7f13\u51b2\u533a&#xff0c;\u8fd9\u4e24\u4e2a\u8fc7\u7a0b\u672c\u8d28\u4e0a\u90fd\u5c5e\u4e8e I\/O \u64cd\u4f5c\u3002<\/p>\n<p>\u5f53\u7136&#xff0c;\u4ece\u5b8f\u89c2\u89d2\u5ea6\u6765\u770b&#xff0c;\u670d\u52a1\u7aef\u786e\u5b9e\u662f\u5728\u4e0e\u8fdc\u7aef\u5ba2\u6237\u7aef\u8fdb\u884c\u7f51\u7edc\u901a\u4fe1\u3002\u4f8b\u5982&#xff0c;\u5ba2\u6237\u7aef\u53d1\u9001\u7684 IP \u6570\u636e\u5305\u4f1a\u7ecf\u8fc7\u7f51\u7edc\u4e2d\u7684\u8def\u7531\u5668\u8282\u70b9\u9010\u8df3\u8f6c\u53d1&#xff0c;\u6700\u7ec8\u5230\u8fbe\u76ee\u6807\u4e3b\u673a\u3002\u968f\u540e&#xff0c;\u76ee\u6807\u4e3b\u673a\u7684\u7f51\u5361\u4f1a\u5c06\u63a5\u6536\u5230\u7684\u7269\u7406\u4fe1\u53f7\u8f6c\u6362\u4e3a\u6570\u5b57\u4fe1\u53f7&#xff08;\u5373\u4e8c\u8fdb\u5236\u6570\u636e\u6d41&#xff09;&#xff0c;\u5e76\u5c06\u5176\u5b58\u50a8\u5728\u7f51\u5361\u7f13\u51b2\u533a\u4e2d\u3002\u63a5\u4e0b\u6765\u7f51\u5361\u4f1a\u5bf9\u6570\u636e\u5e27\u8fdb\u884c\u57fa\u672c\u6821\u9a8c&#xff08;\u4f8b\u5982\u5e27\u5934\u4e0e\u5e27\u5c3e\u7684\u6821\u9a8c&#xff09;\u3002\u82e5\u6821\u9a8c\u901a\u8fc7&#xff0c;\u7f51\u5361\u901a\u8fc7 DMA \u5c06\u6570\u636e\u4ece\u7f51\u5361\u7f13\u51b2\u533a\u62f7\u8d1d\u5230\u4e3b\u673a\u5185\u5b58\u4e2d&#xff0c;\u7136\u540e\u89e6\u53d1 \u786c\u4ef6\u4e2d\u65ad\u3002CPU \u5728\u63a5\u6536\u5230\u4e2d\u65ad\u540e\u4f1a\u5207\u6362\u5230\u5185\u6838\u6001&#xff0c;\u5bf9\u6570\u636e\u5e27\u8fdb\u884c\u5904\u7406&#xff1a;\u9996\u5148\u7531\u6570\u636e\u94fe\u8def\u5c42\u63a5\u6536\u5e76\u89e3\u6790\u5e27\u7ed3\u6784&#xff0c;\u7136\u540e\u9010\u5c42\u5411\u4e0a\u4ea4\u4ed8\u5230\u7f51\u7edc\u5c42\u534f\u8bae\u6808&#xff0c;\u518d\u4ea4\u4ed8\u5230\u4f20\u8f93\u5c42\u534f\u8bae\u6808&#xff0c;\u6700\u7ec8\u7531\u5185\u6838\u5c06\u6570\u636e\u653e\u5165\u5bf9\u5e94\u5957\u63a5\u5b57\u7684\u63a5\u6536\u7f13\u51b2\u533a&#xff0c;\u4ece\u800c\u88ab\u5e94\u7528\u5c42\u8fdb\u7a0b\u8bfb\u53d6\u3002<\/p>\n<p>\u7136\u800c&#xff0c;\u4ece\u670d\u52a1\u7aef\u8fdb\u7a0b\u7684\u89c6\u89d2\u6765\u770b&#xff0c;\u5b83\u5e76\u4e0d\u4f1a\u5173\u5fc3\u5e95\u5c42\u7f51\u7edc\u4e2d\u6240\u7ecf\u5386\u7684\u8fd9\u4e9b\u590d\u6742\u8fc7\u7a0b\u3002\u4f8b\u5982&#xff0c;\u5f53\u670d\u52a1\u7aef\u63a5\u6536\u5230\u4e00\u4e2a HTTP \u8bf7\u6c42\u65f6&#xff0c;\u8fdb\u7a0b\u5e76\u4e0d\u4f1a\u611f\u77e5\u6570\u636e\u5728\u7f51\u7edc\u4e2d\u7684\u8f6c\u53d1\u8def\u5f84&#xff0c;\u4e5f\u4e0d\u4f1a\u611f\u77e5\u5185\u6838\u534f\u8bae\u6808\u5bf9\u6570\u636e\u5e27\u7684\u9010\u5c42\u5904\u7406\u4ee5\u53ca\u5411\u4e0a\u4ea4\u4ed8\u7684\u5177\u4f53\u7ec6\u8282\u3002<\/p>\n<p>\u56e0\u6b64&#xff0c;\u4ece\u670d\u52a1\u7aef\u8fdb\u7a0b\u7684\u89d2\u5ea6\u6765\u770b&#xff0c;\u5176\u6838\u5fc3\u53ea\u6d89\u53ca\u4e24\u7c7b\u5de5\u4f5c&#xff1a;<\/p>\n<li>I\/O \u64cd\u4f5c \u2014\u2014 \u4ece\u5957\u63a5\u5b57\u8bfb\u53d6\u8bf7\u6c42\u6570\u636e&#xff0c;\u5e76\u5c06\u54cd\u5e94\u6570\u636e\u5199\u56de\u5957\u63a5\u5b57\u3002<\/li>\n<li>\u4e1a\u52a1\u903b\u8f91\u5904\u7406 \u2014\u2014 \u5bf9\u8bf7\u6c42\u6570\u636e\u8fdb\u884c\u89e3\u6790&#xff0c;\u5e76\u751f\u6210\u5bf9\u5e94\u7684\u54cd\u5e94\u7ed3\u679c\u3002<\/li>\n<p>\u4e5f\u6b63\u56e0\u4e3a\u5982\u6b64&#xff0c;\u5f53\u6211\u4eec\u5e0c\u671b\u63d0\u5347\u670d\u52a1\u7aef\u7684\u6574\u4f53\u6548\u7387\u6216\u7a81\u7834\u6027\u80fd\u74f6\u9888\u65f6&#xff0c;\u5173\u952e\u70b9\u5f80\u5f80\u5728\u4e8e\u63d0\u9ad8 I\/O \u5904\u7406\u7684\u6548\u7387\u3002\u5728\u9ad8\u5e76\u53d1\u670d\u52a1\u5668\u7a0b\u5e8f\u4e2d&#xff0c;I\/O \u5904\u7406\u80fd\u529b\u901a\u5e38\u51b3\u5b9a\u4e86\u7cfb\u7edf\u6027\u80fd\u7684\u4e0a\u9650\u3002\u56e0\u6b64&#xff0c;\u8981\u60f3\u7406\u89e3\u5982\u4f55\u63d0\u5347\u670d\u52a1\u7aef\u6027\u80fd&#xff0c;\u9996\u5148\u5c31\u5fc5\u987b\u7406\u89e3 I\/O \u6a21\u578b&#xff08;I\/O Model&#xff09; \u7684\u5de5\u4f5c\u673a\u5236\u3002<\/p>\n<h2>I\/O\u6a21\u578b<\/h2>\n<p>\u90a3\u4e48\u5728\u8ba4\u8bc6\u5177\u4f53\u7684 IO \u6a21\u578b\u4e4b\u524d&#xff0c;\u6839\u636e\u4e0a\u6587\u6211\u4eec\u5df2\u7ecf\u77e5\u9053&#xff0c;\u5bf9\u4e8e\u670d\u52a1\u7aef\u800c\u8a00&#xff0c;\u5176\u6240\u6267\u884c\u7684\u5de5\u4f5c\u5927\u81f4\u53ef\u4ee5\u5206\u4e3a\u4e24\u4e2a\u90e8\u5206&#xff1a;IO \u64cd\u4f5c\u4ee5\u53ca\u4e1a\u52a1\u903b\u8f91\u5904\u7406\u3002\u800c\u5bf9\u4e8e IO \u64cd\u4f5c\u6765\u8bf4&#xff0c;\u53c8\u53ef\u4ee5\u8fdb\u4e00\u6b65\u5212\u5206\u4e3a\u4e24\u4e2a\u9636\u6bb5&#xff0c;\u5206\u522b\u4e3a\u7b49\u5f85\u9636\u6bb5\u4ee5\u53ca\u62f7\u8d1d\u9636\u6bb5\u3002<\/p>\n<p>\u4ece\u62bd\u8c61\u89d2\u5ea6\u6765\u770b&#xff0c;IO \u64cd\u4f5c\u672c\u8d28\u4e0a\u6d89\u53ca\u4e24\u4e2a\u65b9\u5411\u7684\u6570\u636e\u6d41\u52a8&#xff0c;\u5206\u522b\u5bf9\u5e94 I&#xff08;Input&#xff09; \u548c O&#xff08;Output&#xff09;&#xff1a;<\/p>\n<ul>\n<li>\u6570\u636e\u4ece\u5e94\u7528\u5c42\u6d41\u5411\u5185\u6838<\/li>\n<li>\u6570\u636e\u4ece\u5185\u6838\u6d41\u5411\u5e94\u7528\u5c42<\/li>\n<\/ul>\n<hr \/>\n<p>\u90a3\u4e48\u9996\u5148\u6211\u4eec\u6765\u770b\u6570\u636e\u4ece\u5e94\u7528\u5c42\u6d41\u5411\u5185\u6838\u7684\u60c5\u51b5\u3002<\/p>\n<p>\u8fd9\u4e00\u8fc7\u7a0b\u901a\u5e38\u5bf9\u5e94\u5199\u64cd\u4f5c&#xff0c;\u4f8b\u5982\u8c03\u7528 write \u63a5\u53e3\u6216\u8005 send \u63a5\u53e3\u3002\u8be5\u64cd\u4f5c\u9996\u5148\u4f1a\u7ecf\u5386\u7b49\u5f85\u9636\u6bb5\u3002\u4f8b\u5982&#xff0c;\u5f53\u5185\u6838\u7f13\u51b2\u533a\u5df2\u7ecf\u6ee1\u65f6&#xff0c;\u6b64\u65f6\u5199\u64cd\u4f5c\u5c31\u4f1a\u8fdb\u5165\u963b\u585e\u72b6\u6001&#xff0c;\u76f4\u5230\u7f13\u51b2\u533a\u4e2d\u6709\u53ef\u7528\u7a7a\u95f4\u4e3a\u6b62&#xff0c;\u800c\u8fd9\u91cc\u9700\u8981\u6ce8\u610f\u7684\u662f&#xff0c;\u5bf9\u4e8e\u5199\u64cd\u4f5c\u7684\u7b49\u5f85\u9636\u6bb5&#xff0c;\u6211\u4eec\u901a\u5e38\u4f1a\u7b80\u5355\u5730\u8ba4\u4e3a&#xff1a;\u5f53\u53d1\u9001\u7f13\u51b2\u533a\u5df2\u6ee1\u65f6&#xff0c;\u8fdb\u7a0b\u5c31\u4f1a\u9677\u5165\u963b\u585e\u7b49\u5f85\u3002\u4f46\u5982\u679c\u8fdb\u4e00\u6b65\u7ec6\u5316\u5176\u5185\u90e8\u673a\u5236&#xff0c;\u53ef\u4ee5\u53d1\u73b0\u5b9e\u9645\u60c5\u51b5\u8981\u66f4\u52a0\u590d\u6742\u3002<\/p>\n<p>\u5982\u679c\u901a\u4fe1\u53cc\u65b9\u662f\u901a\u8fc7 TCP \u8fde\u63a5\u8fdb\u884c\u6570\u636e\u4f20\u8f93&#xff0c;\u90a3\u4e48\u5f53\u8fdb\u7a0b\u8c03\u7528 send \u6216 write \u63a5\u53e3\u65f6&#xff0c;\u9996\u5148\u4f1a\u5c06\u6570\u636e\u4ece\u7528\u6237\u6001\u7f13\u51b2\u533a\u62f7\u8d1d\u5230\u5185\u6838\u6001\u7684\u5957\u63a5\u5b57\u53d1\u9001\u7f13\u51b2\u533a\u3002\u7136\u800c&#xff0c;\u8fd9\u5e76\u4e0d\u610f\u5473\u7740\u8fd9\u4e9b\u6570\u636e\u4f1a\u7acb\u523b\u4ece\u5f53\u524d\u4e3b\u673a\u53d1\u9001\u5230\u7f51\u7edc\u4e2d\u3002<\/p>\n<p>\u8fd9\u662f\u56e0\u4e3a TCP \u534f\u8bae\u672c\u8eab\u5177\u6709\u4e00\u5957\u53d1\u9001\u63a7\u5236\u7b56\u7565&#xff0c;\u4f8b\u5982 \u6ed1\u52a8\u7a97\u53e3\u673a\u5236\u4ee5\u53ca Nagle \u7b97\u6cd5\u7b49\u3002\u8fd9\u4e9b\u673a\u5236\u4f1a\u5f71\u54cd\u6570\u636e\u4f55\u65f6\u771f\u6b63\u88ab\u5c01\u88c5\u4e3a TCP \u62a5\u6587\u6bb5\u5e76\u53d1\u9001\u5230\u7f51\u7edc\u4e2d\u3002\u4f8b\u5982&#xff0c;\u5f53\u5bf9\u7aef\u7684\u63a5\u6536\u7a97\u53e3\u8f83\u5c0f&#xff0c;\u6216\u8005 TCP \u4ecd\u5728\u7b49\u5f85\u5408\u9002\u7684\u53d1\u9001\u65f6\u673a\u65f6&#xff0c;\u6570\u636e\u53ef\u80fd\u4f1a\u6682\u65f6\u505c\u7559\u5728\u53d1\u9001\u7f13\u51b2\u533a\u4e2d&#xff0c;\u800c\u4e0d\u4f1a\u7acb\u5373\u53d1\u51fa\u3002<\/p>\n<p>\u56e0\u6b64&#xff0c;\u4ece\u66f4\u5177\u4f53\u7684\u89d2\u5ea6\u6765\u770b&#xff0c;\u5199\u64cd\u4f5c\u8fdb\u5165\u7b49\u5f85\u9636\u6bb5\u7684\u672c\u8d28\u539f\u56e0\u662f&#xff1a;\u5957\u63a5\u5b57\u53d1\u9001\u7f13\u51b2\u533a\u5df2\u6ee1&#xff0c;\u800c\u5185\u6838\u6682\u65f6\u65e0\u6cd5\u7ee7\u7eed\u5411\u7f51\u7edc\u53d1\u9001\u6570\u636e\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b&#xff0c;\u8fdb\u7a0b\u9700\u8981\u7b49\u5f85\u5185\u6838\u5728\u540e\u7eed\u53d1\u9001\u8fc7\u7a0b\u4e2d\u817e\u51fa\u7f13\u51b2\u533a\u7a7a\u95f4&#xff08;\u4f8b\u5982\u6570\u636e\u88ab\u6210\u529f\u53d1\u9001\u5e76\u5f97\u5230\u786e\u8ba4&#xff0c;\u4ece\u800c\u91ca\u653e\u7f13\u51b2\u533a&#xff09;&#xff0c;\u5f53\u53d1\u9001\u7f13\u51b2\u533a\u91cd\u65b0\u5177\u5907\u53ef\u7528\u7a7a\u95f4\u540e&#xff0c;\u5199\u64cd\u4f5c\u624d\u80fd\u7ee7\u7eed\u8fdb\u884c\u3002<\/p>\n<p>\u6362\u8a00\u4e4b&#xff0c;\u8fd9\u91cc\u7684\u7b49\u5f85\u9636\u6bb5\u672c\u8d28\u4e0a\u662f\u7b49\u5f85\u53d1\u9001\u6761\u4ef6\u6ee1\u8db3&#xff0c;\u4ece\u800c\u91ca\u653e\u53d1\u9001\u7f13\u51b2\u533a\u7a7a\u95f4&#xff0c;\u800c\u4e0d\u662f\u7b80\u5355\u610f\u4e49\u4e0a\u7684\u201c\u7b49\u5f85\u6570\u636e\u53d1\u9001\u5b8c\u6210\u201d\u3002&#xff1b;\u800c\u5982\u679c\u5185\u6838\u7f13\u51b2\u533a\u5e76\u672a\u6ee1&#xff0c;\u5219\u5199\u64cd\u4f5c\u4e0d\u4f1a\u8fdb\u5165\u963b\u585e\u72b6\u6001\u3002<\/p>\n<p>\u5f53\u7b49\u5f85\u9636\u6bb5\u7ed3\u675f\u4e4b\u540e&#xff0c;\u63a5\u4e0b\u6765\u4fbf\u8fdb\u5165\u62f7\u8d1d\u9636\u6bb5\u3002\u6240\u8c13\u62f7\u8d1d\u9636\u6bb5&#xff0c;\u5c31\u662f\u5c06\u6570\u636e\u4ece\u7528\u6237\u6001\u7f13\u51b2\u533a\u590d\u5236\u5230\u5185\u6838\u7f13\u51b2\u533a\u4e2d&#xff0c;\u4f8b\u5982 TCP\/UDP \u5957\u63a5\u5b57\u7684\u53d1\u9001\u7f13\u51b2\u533a&#xff0c;\u6216\u8005\u6587\u4ef6\u5bf9\u5e94\u7684\u5185\u6838\u7f13\u51b2\u533a\u3002<\/p>\n<hr \/>\n<p>\u800c\u53e6\u4e00\u4e2a\u6570\u636e\u6d41\u52a8\u65b9\u5411&#xff0c;\u5373\u4ece\u5185\u6838\u5230\u5e94\u7528\u5c42&#xff0c;\u5bf9\u5e94\u7684\u662f\u8bfb\u64cd\u4f5c\u3002<\/p>\n<p>\u8be5\u8fc7\u7a0b\u540c\u6837\u4f1a\u9996\u5148\u7ecf\u5386\u7b49\u5f85\u9636\u6bb5\u3002\u5728\u8fd9\u4e2a\u9636\u6bb5\u4e2d&#xff0c;\u7cfb\u7edf\u9700\u8981\u7b49\u5f85\u5916\u90e8 IO \u8bbe\u5907&#xff08;\u4f8b\u5982\u78c1\u76d8\u6216\u7f51\u5361&#xff09;\u5c06\u6570\u636e\u4f20\u8f93\u5230\u5185\u5b58&#xff0c;\u5e76\u5199\u5165\u5230\u5bf9\u5e94\u7684\u5185\u6838\u7f13\u51b2\u533a\u4e2d\u3002\u4ee5\u7f51\u7edc\u901a\u4fe1\u4e3a\u4f8b&#xff0c;\u8fd9\u5b9e\u9645\u4e0a\u662f\u7b49\u5f85\u63a5\u6536\u7f13\u51b2\u533a\u4e2d\u51fa\u73b0\u53ef\u8bfb\u53d6\u7684\u6570\u636e\u3002<\/p>\n<p>\u5f53\u7b49\u5f85\u9636\u6bb5\u7ed3\u675f\u4e4b\u540e&#xff0c;\u63a5\u4e0b\u6765\u8fdb\u5165\u62f7\u8d1d\u9636\u6bb5&#xff0c;\u5373\u5c06\u6570\u636e\u4ece\u5185\u6838\u7f13\u51b2\u533a\u590d\u5236\u5230\u7528\u6237\u7f13\u51b2\u533a&#xff0c;\u4ece\u800c\u5b8c\u6210\u4e00\u6b21\u8bfb\u64cd\u4f5c\u3002<\/p>\n<hr \/>\n<p>\u56e0\u6b64&#xff0c;\u65e0\u8bba\u662f\u4ece\u5e94\u7528\u5c42\u6d41\u5411\u5185\u6838\u7684\u5199\u64cd\u4f5c&#xff0c;\u8fd8\u662f\u4ece\u5185\u6838\u6d41\u5411\u5e94\u7528\u5c42\u7684\u8bfb\u64cd\u4f5c&#xff0c;\u6574\u4e2a IO \u8fc7\u7a0b\u901a\u5e38\u90fd\u5305\u542b\u4e24\u4e2a\u9636\u6bb5&#xff1a;<\/p>\n<ul>\n<li>\u7b49\u5f85\u9636\u6bb5 &#xff08;Waiting Phase&#xff09;<\/li>\n<li>\u62f7\u8d1d\u9636\u6bb5 &#xff08;Copy Phase&#xff09;<\/li>\n<\/ul>\n<p>\u5176\u4e2d&#xff0c;\u5bf9\u4e8e\u7b49\u5f85\u9636\u6bb5\u6765\u8bf4&#xff0c;\u5f53\u76f8\u5173\u6761\u4ef6\u5c1a\u672a\u5c31\u7eea\u65f6&#xff08;\u4f8b\u5982\u63a5\u6536\u7f13\u51b2\u533a\u4e3a\u7a7a\u6216\u53d1\u9001\u7f13\u51b2\u533a\u5df2\u6ee1&#xff09;&#xff0c;\u8fdb\u7a0b\u5f80\u5f80\u4f1a\u8fdb\u5165\u963b\u585e\u72b6\u6001\u3002\u6b64\u65f6\u8fdb\u7a0b\u4f1a\u91ca\u653e CPU&#xff0c;\u88ab\u79fb\u51fa\u5c31\u7eea\u961f\u5217&#xff0c;\u5e76\u88ab\u653e\u5165\u7b49\u5f85\u961f\u5217\u4e2d\u3002\u5728\u8fd9\u79cd\u72b6\u6001\u4e0b&#xff0c;\u8fdb\u7a0b\u65e0\u6cd5\u7ee7\u7eed\u63a8\u8fdb\u5f53\u524d\u4efb\u52a1\u7684\u6267\u884c&#xff0c;\u4e5f\u65e0\u6cd5\u5904\u7406\u5176\u4ed6\u4e1a\u52a1\u903b\u8f91\u3002<\/p>\n<p>\u6839\u636e\u4e0a\u6587\u7684\u8ba8\u8bba&#xff0c;\u5bf9\u4e8e\u4e00\u4e2a\u8fdb\u7a0b\u800c\u8a00&#xff0c;\u5176\u6027\u80fd\u74f6\u9888\u5f80\u5f80\u5728\u4e8e IO \u64cd\u4f5c\u7684\u6548\u7387\u3002\u800c\u63d0\u9ad8 IO \u64cd\u4f5c\u6548\u7387\u7684\u5173\u952e\u4e4b\u4e00&#xff0c;\u5c31\u662f\u51cf\u5c11\u7b49\u5f85\u9636\u6bb5\u5728\u6574\u4e2a IO \u6d41\u7a0b\u4e2d\u7684\u5360\u6bd4\u3002\u6362\u8a00\u4e4b&#xff0c;\u9700\u8981\u5c3d\u53ef\u80fd\u7f29\u77ed\u7b49\u5f85\u65f6\u95f4&#xff0c;\u56e0\u4e3a\u5728\u7b49\u5f85\u9636\u6bb5\u4e2d&#xff0c;\u8fdb\u7a0b\u5904\u4e8e\u963b\u585e\u72b6\u6001&#xff0c;\u65e0\u6cd5\u6267\u884c\u4efb\u4f55\u6709\u6548\u5de5\u4f5c\u3002<\/p>\n<hr \/>\n<h3>\u5355\u7ebf\u7a0b\u963b\u585e\u5f0fIO<\/h3>\n<p>\u57fa\u4e8e\u4e0a\u8ff0\u80cc\u666f&#xff0c;\u9996\u5148\u53ef\u4ee5\u5f15\u5165\u7b2c\u4e00\u79cd IO \u6a21\u578b&#xff0c;\u5373\u5355\u7ebf\u7a0b\u963b\u585e\u5f0f IO \u6a21\u578b\u3002<\/p>\n<p>\u5728\u8fd9\u79cd\u6a21\u578b\u4e0b&#xff0c;\u7cfb\u7edf\u4e2d\u53ea\u6709\u4e00\u4e2a\u4e3b\u7ebf\u7a0b&#xff0c;\u800c\u4e3b\u7ebf\u7a0b\u65e2\u8d1f\u8d23 IO \u64cd\u4f5c&#xff0c;\u4e5f\u8d1f\u8d23 \u4e1a\u52a1\u903b\u8f91\u5904\u7406\u3002\u8fd9\u610f\u5473\u7740 IO \u64cd\u4f5c\u4e0e\u4e1a\u52a1\u903b\u8f91\u5904\u7406\u4e4b\u95f4\u662f\u4e32\u884c\u6267\u884c\u7684\u3002<\/p>\n<p>\u4e00\u65e6\u67d0\u4e2a IO \u64cd\u4f5c\u56e0\u4e3a\u6761\u4ef6\u672a\u5c31\u7eea\u800c\u53d1\u751f\u963b\u585e&#xff0c;\u90a3\u4e48\u6574\u4e2a\u8fdb\u7a0b\u90fd\u4f1a\u88ab\u6302\u8d77&#xff0c;\u4ece\u800c\u5bfc\u81f4\u540e\u7eed\u4e1a\u52a1\u903b\u8f91\u65e0\u6cd5\u7ee7\u7eed\u6267\u884c\u3002\u56e0\u6b64&#xff0c;\u5728\u8fd9\u79cd\u6a21\u578b\u4e0b&#xff0c;\u7cfb\u7edf\u7684\u6574\u4f53\u5904\u7406\u6548\u7387\u901a\u5e38\u662f\u8f83\u4f4e\u7684\u3002<\/p>\n<h3>\u5355\u7ebf\u7a0b\/\u591a\u7ebf\u7a0b\u975e\u963b\u585e\u5f0fIO<\/h3>\n<p>\u7531\u6b64\u4fbf\u81ea\u7136\u5f15\u51fa\u4e86\u7b2c\u4e8c\u79cd IO \u6a21\u578b&#xff0c;\u5373\u5355\u7ebf\u7a0b\u975e\u963b\u585e IO \u6a21\u578b\u3002<\/p>\n<p>\u5728\u8be5\u6a21\u578b\u4e2d&#xff0c;\u76f8\u6bd4\u4e8e\u7b2c\u4e00\u79cd\u6a21\u578b&#xff0c;\u5176\u4e3b\u8981\u53d8\u5316\u5728\u4e8e\u91c7\u7528\u4e86\u975e\u963b\u585e IO\u3002\u5f53\u8fdb\u7a0b\u53d1\u73b0 IO \u6761\u4ef6\u5c1a\u672a\u5c31\u7eea\u65f6&#xff08;\u4f8b\u5982\u63a5\u6536\u7f13\u51b2\u533a\u4e3a\u7a7a\u6216\u53d1\u9001\u7f13\u51b2\u533a\u5df2\u6ee1&#xff09;&#xff0c;\u7cfb\u7edf\u8c03\u7528\u4e0d\u4f1a\u4f7f\u8fdb\u7a0b\u8fdb\u5165\u963b\u585e\u72b6\u6001&#xff0c;\u800c\u662f\u7acb\u5373\u8fd4\u56de\u3002\u968f\u540e\u8fdb\u7a0b\u53ef\u4ee5\u7ee7\u7eed\u6267\u884c\u540e\u7eed\u7684\u4e1a\u52a1\u903b\u8f91\u3002<\/p>\n<p>\u5f53\u4e1a\u52a1\u903b\u8f91\u6267\u884c\u5b8c\u6bd5\u4e4b\u540e&#xff0c;\u7a0b\u5e8f\u4f1a\u518d\u6b21\u56de\u5230\u5f00\u5934&#xff0c;\u91cd\u65b0\u68c0\u67e5 IO \u6761\u4ef6\u662f\u5426\u5df2\u7ecf\u5c31\u7eea\u3002\u5982\u679c\u4ecd\u7136\u672a\u5c31\u7eea&#xff0c;\u5219\u91cd\u590d\u8fd9\u4e00\u8fc7\u7a0b&#xff0c;\u4e5f\u5c31\u662f\u901a\u8fc7**\u4e3b\u52a8\u8f6e\u8be2&#xff08;Polling&#xff09;**\u7684\u65b9\u5f0f\u4e0d\u65ad\u68c0\u67e5\u6761\u4ef6\u72b6\u6001\u3002<\/p>\n<hr \/>\n<p>\u76f8\u6bd4\u4e8e\u7b2c\u4e00\u79cd\u6a21\u578b&#xff0c;\u8be5\u6a21\u578b\u7684\u4f18\u70b9\u5728\u4e8e&#xff1a;\u8fdb\u7a0b\u4e0d\u4f1a\u88ab\u52a8\u5730\u9677\u5165\u963b\u585e\u7b49\u5f85&#xff0c;\u800c\u662f\u53ef\u4ee5\u7ee7\u7eed\u6267\u884c\u5176\u4ed6\u903b\u8f91\u3002<\/p>\n<p>\u4e0d\u8fc7\u9700\u8981\u6ce8\u610f\u7684\u662f&#xff0c;\u7b49\u5f85\u672c\u8eab\u5728\u5185\u6838\u5c42\u9762\u4f9d\u7136\u662f\u5b58\u5728\u7684\u3002\u4f8b\u5982\u5728\u7f51\u7edc\u901a\u4fe1\u573a\u666f\u4e2d&#xff0c;\u5185\u6838\u4ecd\u7136\u9700\u8981\u7b49\u5f85\u8fdc\u7aef\u4e3b\u673a\u53d1\u9001 IP \u6570\u636e\u5305&#xff0c;\u8be5\u6570\u636e\u5305\u5728\u7f51\u7edc\u4e2d\u7ecf\u8fc7\u591a\u4e2a\u8def\u7531\u5668\u9010\u8df3\u8f6c\u53d1\u540e\u5230\u8fbe\u76ee\u6807\u4e3b\u673a\u3002\u968f\u540e\u7f51\u5361\u5c06\u63a5\u6536\u5230\u7684\u7269\u7406\u4fe1\u53f7\u8f6c\u6362\u4e3a\u6570\u5b57\u4fe1\u53f7&#xff0c;\u5e76\u5b8c\u6210\u5e27\u5934\u4e0e\u5e27\u5c3e\u6821\u9a8c&#xff1b;\u6821\u9a8c\u901a\u8fc7\u540e\u63d0\u53d6\u4e94\u5143\u7ec4\u4fe1\u606f&#xff0c;\u901a\u8fc7\u54c8\u5e0c\u8ba1\u7b97\u67e5\u627e\u5bf9\u5e94\u7684\u961f\u5217&#xff0c;\u5e76\u5c06\u6570\u636e\u653e\u5165\u76f8\u5e94\u7684\u73af\u5f62\u7f13\u51b2\u533a\u3002\u968f\u540e\u89e6\u53d1\u786c\u4ef6\u4e2d\u65ad&#xff0c;\u4f7f CPU \u5207\u6362\u5230\u5185\u6838\u6001&#xff0c;\u5e76\u7ecf\u8fc7\u6570\u636e\u94fe\u8def\u5c42\u3001\u7f51\u7edc\u5c42\u4ee5\u53ca\u4f20\u8f93\u5c42\u7b49\u534f\u8bae\u6808\u7684\u5904\u7406&#xff0c;\u6700\u7ec8\u624d\u53ef\u80fd\u88ab\u5e94\u7528\u7a0b\u5e8f\u8bfb\u53d6\u3002<\/p>\n<p>\u56e0\u6b64&#xff0c;\u7b49\u5f85\u8fc7\u7a0b\u5e76\u6ca1\u6709\u6d88\u5931&#xff0c;\u53ea\u662f\u5e94\u7528\u8fdb\u7a0b\u4e0d\u518d\u4e0e\u5185\u6838\u4e00\u8d77\u88ab\u52a8\u7b49\u5f85\u6761\u4ef6\u5c31\u7eea\u3002\u5f53\u8fdb\u7a0b\u53d1\u73b0\u6761\u4ef6\u5c1a\u672a\u5c31\u7eea\u65f6&#xff0c;\u5b83\u4e0d\u4f1a\u539f\u5730\u963b\u585e&#xff0c;\u800c\u662f\u7ee7\u7eed\u6267\u884c\u540e\u7eed\u903b\u8f91\u3002<\/p>\n<hr \/>\n<p>\u90a3\u4e48&#xff0c;\u8fd9\u662f\u5426\u610f\u5473\u7740\u8be5\u6a21\u578b\u6ca1\u6709\u7f3a\u70b9\u5462&#xff1f;\u7b54\u6848\u663e\u7136\u662f\u5426\u5b9a\u7684\u3002\u8be5\u6a21\u578b\u540c\u6837\u5b58\u5728\u660e\u663e\u7684\u95ee\u9898\u3002<\/p>\n<p>\u9996\u5148&#xff0c;\u5728\u8be5\u6a21\u578b\u4e0b&#xff0c;\u8fdb\u7a0b\u9700\u8981\u4e3b\u52a8\u8f6e\u8be2&#xff0c;\u5373\u4e0d\u65ad\u91cd\u590d\u8c03\u7528\u7cfb\u7edf\u8c03\u7528\u6765\u68c0\u67e5 IO \u72b6\u6001\u3002\u867d\u7136\u8fdb\u7a0b\u4e0d\u4f1a\u88ab\u79fb\u51fa\u5c31\u7eea\u961f\u5217\u5e76\u653e\u5165\u7b49\u5f85\u961f\u5217&#xff0c;\u4f46\u9700\u8981\u6ce8\u610f\u7684\u662f&#xff0c;\u6bcf\u4e00\u6b21\u7cfb\u7edf\u8c03\u7528\u90fd\u4f1a\u6d89\u53ca\u7528\u6237\u6001\u4e0e\u5185\u6838\u6001\u4e4b\u95f4\u7684\u6a21\u5f0f\u5207\u6362\u3002<\/p>\n<p>\u5177\u4f53\u6765\u8bf4&#xff0c;\u5f53\u7a0b\u5e8f\u4ece\u7528\u6237\u6001\u8fdb\u5165\u5185\u6838\u6001\u65f6&#xff0c;\u7cfb\u7edf\u9996\u5148\u9700\u8981\u4fdd\u5b58\u5f53\u524d\u8fdb\u7a0b\u7684\u4e0a\u4e0b\u6587&#xff0c;\u4f8b\u5982\u5404\u4e2a\u5bc4\u5b58\u5668\u7684\u503c&#xff08;\u5305\u62ec\u6808\u6307\u9488\u3001\u7a0b\u5e8f\u8ba1\u6570\u5668\u7b49&#xff09;&#xff0c;\u5e76\u5c06\u5176\u538b\u5165\u8be5\u8fdb\u7a0b\u5bf9\u5e94\u7684\u5185\u6838\u6808\u4e2d&#xff1b;\u968f\u540e CPU \u624d\u4f1a\u5207\u6362\u5230\u5185\u6838\u6001\u6267\u884c\u5185\u6838\u4ee3\u7801\u3002\u800c\u5f53\u7cfb\u7edf\u8c03\u7528\u7ed3\u675f\u8fd4\u56de\u7528\u6237\u6001\u65f6&#xff0c;\u8fd8\u9700\u8981\u4ece\u5185\u6838\u6808\u4e2d\u6062\u590d\u4e4b\u524d\u4fdd\u5b58\u7684\u5bc4\u5b58\u5668\u72b6\u6001&#xff0c;\u4ece\u800c\u6062\u590d\u8fdb\u7a0b\u4e0a\u4e0b\u6587\u3002<\/p>\n<p>\u56e0\u6b64&#xff0c;\u4e3b\u52a8\u8f6e\u8be2\u4f1a\u5bfc\u81f4\u9891\u7e41\u7684\u6a21\u5f0f\u5207\u6362\u5f00\u9500\u3002<\/p>\n<p>\u6b64\u5916&#xff0c;\u5728\u670d\u52a1\u7aef\u573a\u666f\u4e0b&#xff0c;\u4e00\u4e2a\u670d\u52a1\u5668\u5f80\u5f80\u9700\u8981\u540c\u65f6\u4e0e\u5927\u91cf\u5ba2\u6237\u7aef\u8fdb\u884c\u901a\u4fe1\u3002\u5728\u5355\u7ebf\u7a0b\u975e\u963b\u585e\u6a21\u578b\u4e0b&#xff0c;\u9700\u8981\u7531\u4e00\u4e2a\u7ebf\u7a0b\u4ee5\u975e\u963b\u585e\u65b9\u5f0f\u8f6e\u8be2 \u591a\u4e2a\u6587\u4ef6\u63cf\u8ff0\u7b26&#xff08;fd&#xff09;&#xff0c;\u4e0d\u65ad\u68c0\u67e5\u5b83\u4eec\u7684\u72b6\u6001\u662f\u5426\u5c31\u7eea\u3002<\/p>\n<p>\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b&#xff1a;<\/p>\n<ul>\n<li>\u7528\u6237\u6001\u4e0e\u5185\u6838\u6001\u4e4b\u95f4\u7684\u5207\u6362\u4f1a\u66f4\u52a0\u9891\u7e41<\/li>\n<li>\u8fdb\u7a0b\u8fd8\u9700\u8981\u82b1\u8d39\u5927\u91cf\u65f6\u95f4\u8fdb\u884c\u8f6e\u8be2\u64cd\u4f5c<\/li>\n<\/ul>\n<p>\u6362\u8a00\u4e4b&#xff0c;\u9700\u8981\u4e0d\u65ad\u904d\u5386\u6240\u6709 fd \u6765\u68c0\u67e5\u5176\u72b6\u6001\u662f\u5426\u5c31\u7eea&#xff0c;\u800c\u8fd9\u79cd\u904d\u5386\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u901a\u5e38\u4e3a O(N)\u3002\u5e76\u4e14\u5728\u8fd9\u79cd O(N) \u7684\u904d\u5386\u8fc7\u7a0b\u4e2d&#xff0c;\u7edd\u5927\u591a\u6570\u68c0\u67e5\u5b9e\u9645\u4e0a\u90fd\u662f\u65e0\u6548\u7684&#xff0c;\u56e0\u4e3a\u5728\u5927\u591a\u6570\u65f6\u95f4\u91cc&#xff0c;\u53ea\u6709\u6781\u5c11\u6570 fd \u5904\u4e8e\u5c31\u7eea\u72b6\u6001&#xff0c;\u56e0\u6b64\u5728\u904d\u5386\u8fc7\u7a0b\u4e2d&#xff0c;\u5927\u90e8\u5206\u68c0\u67e5\u90fd\u662f\u65e0\u6548\u7684\u3002\u8fd9\u79cd\u4ee5 O(N) \u590d\u6742\u5ea6\u8fdb\u884c\u7684\u8f6e\u8be2\u4f1a\u5bfc\u81f4 CPU \u5927\u91cf\u65f6\u95f4\u6d88\u8017\u5728\u65e0\u610f\u4e49\u7684\u72b6\u6001\u68c0\u6d4b\u4e0a&#xff0c;\u4ece\u800c\u9020\u6210 CPU \u7a7a\u8f6c&#xff0c;\u964d\u4f4e\u7cfb\u7edf\u6574\u4f53\u7684\u5904\u7406\u6548\u7387\u3002<\/p>\n<hr \/>\n<p>\u90a3\u4e48\u6709\u7684\u8bfb\u8005\u8bfb\u5230\u8fd9\u91cc&#xff0c;\u53ef\u80fd\u4f1a\u60f3\u5230&#xff1a;\u6b64\u524d\u8ba8\u8bba\u7684\u5927\u591a\u662f\u5355\u7ebf\u7a0b\u6a21\u578b\u3002\u5728\u8fd9\u79cd\u6a21\u578b\u4e0b&#xff0c;\u4e00\u4e2a\u7ebf\u7a0b\u4e32\u884c\u5730\u5b8c\u6210 I\/O \u64cd\u4f5c\u4ee5\u53ca\u4e1a\u52a1\u903b\u8f91\u5904\u7406\u3002\u800c\u5728\u670d\u52a1\u7aef\u573a\u666f\u4e2d&#xff0c;\u8fd9\u79cd\u5355\u7ebf\u7a0b\u6a21\u578b\u7684\u7f3a\u70b9\u4f1a\u88ab\u8fdb\u4e00\u6b65\u653e\u5927&#xff0c;\u56e0\u4e3a\u670d\u52a1\u7aef\u901a\u5e38\u662f \u4e00\u5bf9\u591a \u7684\u901a\u4fe1\u6a21\u5f0f\u3002\u4e5f\u5c31\u662f\u8bf4&#xff0c;\u4e00\u4e2a\u670d\u52a1\u7aef\u9700\u8981\u540c\u65f6\u4e0e\u591a\u4e2a\u5ba2\u6237\u7aef\u8fdb\u884c\u901a\u4fe1\u3002<\/p>\n<p>\u8fd9\u610f\u5473\u7740\u4e00\u4e2a\u7ebf\u7a0b\u9700\u8981\u4e0d\u65ad\u68c0\u67e5 \u591a\u4e2a\u6587\u4ef6\u63cf\u8ff0\u7b26\u7684\u8bfb\u6761\u4ef6\u662f\u5426\u5c31\u7eea\u3002\u867d\u7136\u901a\u8fc7\u4e3b\u52a8\u8f6e\u8be2\u7684\u65b9\u5f0f\u53ef\u4ee5\u907f\u514d\u8fdb\u7a0b\u9677\u5165\u88ab\u52a8\u7684\u963b\u585e\u7b49\u5f85&#xff0c;\u4f46\u4e3b\u52a8\u8f6e\u8be2\u672c\u8eab\u4e5f\u662f\u6709\u4ee3\u4ef7\u7684\u3002\u7279\u522b\u662f\u5728\u8fde\u63a5\u6570\u8f83\u591a\u7684\u60c5\u51b5\u4e0b&#xff0c;\u4f1a\u5e26\u6765 \u5927\u91cf\u7cfb\u7edf\u8c03\u7528\u4ea7\u751f\u7684\u6a21\u5f0f\u5207\u6362\u5f00\u9500&#xff0c;\u4ee5\u53ca\u8f6e\u8be2\u904d\u5386\u6587\u4ef6\u63cf\u8ff0\u7b26\u96c6\u5408\u7684\u5f00\u9500\u3002<\/p>\n<p>\u56e0\u6b64\u8bfb\u8005\u53ef\u80fd\u4f1a\u60f3\u5230\u53e6\u4e00\u79cd\u65b9\u6848&#xff1a;\u591a\u7ebf\u7a0b &#043; \u975e\u963b\u585e\u8c03\u7528\u3002\u5728\u8fd9\u79cd\u6a21\u578b\u4e0b&#xff0c;\u4e3b\u7ebf\u7a0b\u4e0d\u518d\u76f4\u63a5\u5904\u7406 I\/O \u64cd\u4f5c&#xff0c;\u800c\u662f\u4f5c\u4e3a I\/O \u64cd\u4f5c\u7684\u53d1\u8d77\u8005\u548c\u8c03\u5ea6\u8005&#xff1b;\u4e3b\u7ebf\u7a0b\u521b\u5efa\u51fa\u591a\u4e2a\u5de5\u4f5c\u7ebf\u7a0b&#xff0c;\u7531\u8fd9\u4e9b\u5de5\u4f5c\u7ebf\u7a0b\u8d1f\u8d23\u6267\u884c\u5177\u4f53\u7684 I\/O \u64cd\u4f5c\u4ee5\u53ca\u4e1a\u52a1\u903b\u8f91\u5904\u7406\u3002<\/p>\n<p>\u5047\u8bbe\u5f53\u524d\u6709 1000 \u4e2a\u8fde\u63a5&#xff0c;\u90a3\u4e48\u4e3b\u7ebf\u7a0b\u53ef\u4ee5\u521b\u5efa 1000 \u4e2a\u7ebf\u7a0b&#xff0c;\u6bcf\u4e2a\u7ebf\u7a0b\u5206\u522b\u8d1f\u8d23\u4e00\u4e2a\u8fde\u63a5&#xff0c;1000\u4e2a\u7ebf\u7a0b\u5e76\u53d1\u68c0\u67e5\u5bf9\u5e94\u6587\u4ef6\u63cf\u8ff0\u7b26\u7684\u8bfb\u6761\u4ef6\u662f\u5426\u5c31\u7eea&#xff0c;\u5e76\u5728\u5c31\u7eea\u540e\u6267\u884c\u76f8\u5e94\u7684\u4e1a\u52a1\u903b\u8f91\u3002<\/p>\n<p>\u5728\u8fd9\u79cd \u591a\u7ebf\u7a0b\u975e\u963b\u585e\u8c03\u7528\u6a21\u578b \u4e0b&#xff0c;\u76f8\u6bd4\u4e8e \u5355\u7ebf\u7a0b\u975e\u963b\u585e\u8f6e\u8be2\u6a21\u578b&#xff0c;\u5176\u4f18\u70b9\u5728\u4e8e\u51cf\u5c11\u4e86\u8f6e\u8be2\u904d\u5386\u7684\u4ee3\u4ef7\u3002\u56e0\u4e3a\u6bcf\u4e2a\u7ebf\u7a0b\u53ea\u9700\u8981\u5173\u6ce8 \u4e00\u4e2a\u6587\u4ef6\u63cf\u8ff0\u7b26 \u662f\u5426\u5c31\u7eea&#xff0c;\u800c\u4e0d\u9700\u8981\u904d\u5386\u6574\u4e2a\u6587\u4ef6\u63cf\u8ff0\u7b26\u96c6\u5408\u3002<\/p>\n<p>\u4f46\u662f\u8fd9\u79cd\u65b9\u6848\u7684\u7f3a\u9677\u540c\u6837\u975e\u5e38\u660e\u663e\u3002<\/p>\n<p>\u9996\u5148\u9700\u8981\u660e\u786e\u7684\u662f&#xff1a;\u7ebf\u7a0b\u7684\u521b\u5efa\u4e0e\u9500\u6bc1\u672c\u8eab\u662f\u6709\u6210\u672c\u7684\u3002\u5728 Linux \u7cfb\u7edf\u4e2d\u521b\u5efa\u7ebf\u7a0b\u901a\u5e38\u901a\u8fc7 pthread_create \u63a5\u53e3\u5b8c\u6210&#xff0c;\u800c pthread_create \u5728\u5e95\u5c42\u4f1a\u8c03\u7528 clone \u7cfb\u7edf\u8c03\u7528\u6765\u521b\u5efa\u7ebf\u7a0b\u3002<\/p>\n<p>\u4ece\u672c\u8d28\u4e0a\u6765\u8bf4&#xff0c;\u4e00\u4e2a\u7ebf\u7a0b\u5bf9\u5e94\u7684\u662f \u4e00\u4e2a\u72ec\u7acb\u6267\u884c\u7684\u7528\u6237\u6001\u51fd\u6570\u8c03\u7528\u4e0a\u4e0b\u6587\u3002\u65e2\u7136\u662f\u51fd\u6570\u6267\u884c&#xff0c;\u5c31\u9700\u8981\u4e3a\u5176\u5206\u914d \u6808\u7a7a\u95f4&#xff08;\u7ebf\u7a0b\u6808&#xff09; \u7528\u4e8e\u4fdd\u5b58\u51fd\u6570\u8c03\u7528\u5e27\u4ee5\u53ca\u5c40\u90e8\u53d8\u91cf\u3002\u6bcf\u4e00\u4e2a\u7ebf\u7a0b\u90fd\u62e5\u6709\u81ea\u5df1\u72ec\u7acb\u7684\u6267\u884c\u4e0a\u4e0b\u6587\u3002<\/p>\n<p>\u867d\u7136\u7ebf\u7a0b\u4e4b\u95f4\u7684\u8d44\u6e90\u662f\u9ad8\u5ea6\u5171\u4eab\u7684&#xff0c;\u4f8b\u5982 \u6587\u4ef6\u63cf\u8ff0\u7b26\u8868\u3001\u9875\u8868\u3001\u5168\u5c40\u6570\u636e\u533a\u7b49\u8d44\u6e90 \u90fd\u662f\u5171\u4eab\u7684&#xff0c;\u4f46\u7531\u4e8e\u7ebf\u7a0b\u7684\u6267\u884c\u662f \u53ef\u72ec\u7acb\u8c03\u5ea6\u548c\u5207\u6362\u7684&#xff0c;\u56e0\u6b64\u6bcf\u4e00\u4e2a\u7ebf\u7a0b\u90fd\u5fc5\u987b\u62e5\u6709\u81ea\u5df1\u72ec\u7acb\u7684 \u7ebf\u7a0b\u6808&#xff0c;\u7528\u4e8e\u5b58\u50a8\u5176\u51fd\u6570\u8c03\u7528\u8fc7\u7a0b\u4e2d\u7684\u5c40\u90e8\u53d8\u91cf\u548c\u8fd4\u56de\u5730\u5740\u7b49\u4fe1\u606f\u3002<\/p>\n<p>\u7ebf\u7a0b\u6808\u663e\u7136\u4e0d\u53ef\u80fd\u5728\u8fdb\u7a0b\u7684\u4e3b\u7ebf\u7a0b\u6808\u4e0a\u8fdb\u884c\u5206\u914d&#xff0c;\u56e0\u4e3a\u5982\u679c\u591a\u4e2a\u7ebf\u7a0b\u7684\u6808\u7a7a\u95f4\u53d1\u751f\u91cd\u53e0&#xff0c;\u4e00\u65e6\u7ebf\u7a0b\u53d1\u751f\u4e0a\u4e0b\u6587\u5207\u6362&#xff0c;\u5c31\u4f1a\u5bfc\u81f4\u4e25\u91cd\u7684\u95ee\u9898\u3002\u4f8b\u5982\u67d0\u4e2a\u7ebf\u7a0b\u65f6\u95f4\u7247\u8017\u5c3d\u540e&#xff0c;CPU \u4f1a\u8fdb\u884c\u4e0a\u4e0b\u6587\u5207\u6362&#xff1a;\u5f53\u524d\u7ebf\u7a0b\u7684\u5bc4\u5b58\u5668\u4e0a\u4e0b\u6587\u4f1a\u88ab\u4fdd\u5b58\u5230\u5bf9\u5e94\u7684 \u5185\u6838\u6808 \u4e2d&#xff0c;\u7136\u540e\u5207\u6362\u5230\u4e0b\u4e00\u4e2a\u7ebf\u7a0b&#xff0c;\u5e76\u4ece\u8be5\u7ebf\u7a0b\u7684\u5185\u6838\u6808\u4e2d\u6062\u590d\u5bc4\u5b58\u5668\u72b6\u6001&#xff0c;\u5176\u4e2d\u5c31\u5305\u62ec \u6808\u6307\u9488\u5bc4\u5b58\u5668&#xff08;SP&#xff09;\u3002<\/p>\n<p>\u5982\u679c\u591a\u4e2a\u7ebf\u7a0b\u7684\u6808\u7a7a\u95f4\u5b58\u5728\u91cd\u53e0&#xff0c;\u90a3\u4e48\u5728\u6062\u590d\u6808\u6307\u9488\u4e4b\u540e&#xff0c;\u7ebf\u7a0b\u7684\u6808\u64cd\u4f5c\u53ef\u80fd\u4f1a\u8986\u76d6\u5176\u4ed6\u7ebf\u7a0b\u7684\u6570\u636e&#xff0c;\u4ece\u800c\u5bfc\u81f4 \u5185\u5b58\u7834\u574f\u4ee5\u53ca\u6570\u636e\u4e0d\u4e00\u81f4\u7684\u95ee\u9898\u3002\u56e0\u6b64\u7ebf\u7a0b\u6808\u5fc5\u987b\u62e5\u6709 \u72ec\u7acb\u4e14\u4e0d\u91cd\u53e0\u7684\u5185\u5b58\u7a7a\u95f4\u3002<\/p>\n<p>\u5728 Linux \u4e2d&#xff0c;\u7ebf\u7a0b\u6808\u901a\u5e38\u662f\u5728 \u7528\u6237\u6001\u5806\u533a\u5206\u914d\u7684\u4e00\u5757\u72ec\u7acb\u865a\u62df\u5730\u5740\u7a7a\u95f4\u3002\u56e0\u6b64\u6bcf\u521b\u5efa\u4e00\u4e2a\u7ebf\u7a0b&#xff0c;\u90fd\u9700\u8981\u989d\u5916\u5206\u914d\u4e00\u5757\u7528\u4e8e\u7ebf\u7a0b\u6808\u7684\u5185\u5b58\u7a7a\u95f4\u3002<\/p>\n<p>\u8fd9\u610f\u5473\u7740\u7ebf\u7a0b\u7684\u521b\u5efa\u4f1a\u5e26\u6765\u4e00\u5b9a\u7684 \u5185\u5b58\u5f00\u9500\u3002\u6b64\u5916&#xff0c;\u7ebf\u7a0b\u5e38\u88ab\u79f0\u4e3a\u201c\u8f7b\u91cf\u7ea7\u8fdb\u7a0b&#xff08;Lightweight Process&#xff09;\u201d&#xff0c;\u662f\u56e0\u4e3aLinux \u5185\u6838\u5728\u7ba1\u7406\u7ebf\u7a0b\u65f6&#xff0c;\u4f9d\u7136\u662f\u901a\u8fc7 task_struct \u7ed3\u6784\u4f53\u6765\u63cf\u8ff0\u548c\u7ba1\u7406\u8c03\u5ea6\u5b9e\u4f53\u7684\u3002\u56e0\u6b64\u521b\u5efa\u7ebf\u7a0b\u4e0d\u4ec5\u9700\u8981\u5206\u914d\u7ebf\u7a0b\u6808&#xff0c;\u8fd8\u9700\u8981\u5206\u914d\u5bf9\u5e94\u7684 task_struct \u4ee5\u53ca\u5185\u6838\u6808\u7b49\u5185\u6838\u8d44\u6e90\u3002<\/p>\n<p>\u5728 Linux \u7cfb\u7edf\u4e2d&#xff0c;\u9ed8\u8ba4\u7684\u7ebf\u7a0b\u6808\u5927\u5c0f\u901a\u5e38\u4e3a 8MB\u3002\u5982\u679c\u521b\u5efa 1000 \u4e2a\u7ebf\u7a0b&#xff0c;\u90a3\u4e48\u4ec5\u7ebf\u7a0b\u6808\u5c31\u53ef\u80fd\u5360\u7528 \u7ea6 8GB \u7684\u865a\u62df\u5730\u5740\u7a7a\u95f4\u3002\u56e0\u6b64\u7ebf\u7a0b\u6570\u91cf\u8fc7\u591a\u65f6&#xff0c;\u4f1a\u5e26\u6765\u663e\u8457\u7684 \u5185\u5b58\u8d44\u6e90\u6d88\u8017\u3002<\/p>\n<p>\u5176\u6b21&#xff0c;\u591a\u7ebf\u7a0b\u8fd8\u4f1a\u5e26\u6765 \u4e0a\u4e0b\u6587\u5207\u6362&#xff08;Context Switch&#xff09; \u7684\u5f00\u9500\u3002<\/p>\n<p>\u6211\u4eec\u77e5\u9053&#xff0c;\u5728\u540c\u4e00\u4e2a\u8fdb\u7a0b\u4e2d\u7684\u591a\u4e2a\u7ebf\u7a0b\u4e4b\u95f4&#xff0c;\u5927\u90e8\u5206\u8d44\u6e90\u662f\u5171\u4eab\u7684&#xff0c;\u4f8b\u5982 \u9875\u8868\u3001\u6587\u4ef6\u63cf\u8ff0\u7b26\u8868\u4ee5\u53ca\u4ee3\u7801\u6bb5\u548c\u6570\u636e\u6bb5 \u7b49\u3002\u56e0\u6b64\u7ebf\u7a0b\u4e4b\u95f4\u7684\u5207\u6362\u76f8\u6bd4\u8fdb\u7a0b\u5207\u6362\u6765\u8bf4\u6210\u672c\u66f4\u4f4e&#xff0c;\u56e0\u4e3a\u4e0d\u9700\u8981\u5207\u6362\u6574\u4e2a\u5730\u5740\u7a7a\u95f4\u3002<\/p>\n<p>\u4f46\u5373\u4fbf\u5982\u6b64&#xff0c;\u7ebf\u7a0b\u5207\u6362\u4f9d\u7136\u5b58\u5728\u4e00\u5b9a\u7684\u6210\u672c\u3002<\/p>\n<p>CPU \u5728\u6267\u884c\u7ebf\u7a0b\u4ee3\u7801\u65f6&#xff0c;\u5176\u8bbf\u95ee\u5185\u5b58\u4f7f\u7528\u7684\u662f \u865a\u62df\u5730\u5740\u3002\u800c\u5b9e\u9645\u8bbf\u95ee\u5185\u5b58\u9700\u8981 \u7269\u7406\u5730\u5740&#xff0c;\u56e0\u6b64\u6bcf\u4e00\u6b21\u5185\u5b58\u8bbf\u95ee\u90fd\u9700\u8981\u7ecf\u8fc7 \u865a\u62df\u5730\u5740\u5230\u7269\u7406\u5730\u5740\u7684\u8f6c\u6362\u3002\u8fd9\u4e2a\u8f6c\u6362\u8fc7\u7a0b\u7531 MMU&#xff08;Memory Management Unit&#xff0c;\u5185\u5b58\u7ba1\u7406\u5355\u5143&#xff09; \u5b8c\u6210\u3002<\/p>\n<p>\u5f53 CPU \u8fdb\u884c\u5730\u5740\u8f6c\u6362\u65f6&#xff0c;MMU \u4f1a\u9996\u5148\u67e5\u8be2 TLB&#xff08;Translation Lookaside Buffer&#xff09;\u3002TLB\u672c\u8d28\u4e0a\u662f\u4e00\u4e2a\u9ad8\u901f\u7f13\u5b58&#xff0c;\u7528\u4e8e\u7f13\u5b58\u6700\u8fd1\u4f7f\u7528\u8fc7\u7684 \u9875\u8868\u9879\u6620\u5c04\u5173\u7cfb&#xff08;\u865a\u62df\u5730\u5740 \u2192 \u7269\u7406\u5730\u5740&#xff09;\u3002<\/p>\n<p>\u5982\u679c TLB \u547d\u4e2d&#xff0c;\u90a3\u4e48\u53ef\u4ee5\u76f4\u63a5\u5f97\u5230\u7269\u7406\u5730\u5740&#xff1b;\u5982\u679c TLB \u672a\u547d\u4e2d&#xff0c;\u5219\u9700\u8981\u8bbf\u95ee\u5185\u5b58\u4e2d\u7684\u9875\u8868\u7ed3\u6784\u8fdb\u884c\u9875\u8868\u904d\u5386&#xff08;Page Walk&#xff09;\u3002\u9875\u8868\u901a\u5e38\u662f \u591a\u7ea7\u9875\u8868\u7ed3\u6784&#xff0c;\u4f8b\u5982 x86 \u67b6\u6784\u4e0b\u7684\u591a\u7ea7\u9875\u76ee\u5f55\u7ed3\u6784\u3002<\/p>\n<p>\u7531\u4e8e\u5185\u5b58\u8bbf\u95ee\u901f\u5ea6\u8fdc\u6162\u4e8e CPU \u7f13\u5b58&#xff0c;\u56e0\u6b64 TLB \u7684\u5b58\u5728\u53ef\u4ee5\u663e\u8457\u51cf\u5c11\u9875\u8868\u8bbf\u95ee\u5f00\u9500\u3002<\/p>\n<p>\u5728 \u7ebf\u7a0b\u5207\u6362 \u65f6&#xff0c;\u5982\u679c\u4ecd\u7136\u662f\u5728\u540c\u4e00\u8fdb\u7a0b\u5185\u8fdb\u884c\u7ebf\u7a0b\u5207\u6362&#xff0c;\u5219\u901a\u5e38 \u4e0d\u4f1a\u66f4\u6362\u9875\u8868\u57fa\u5730\u5740\u5bc4\u5b58\u5668&#xff08;CR3&#xff09;&#xff0c;\u56e0\u6b64\u4e0d\u4f1a\u5f3a\u5236\u5237\u65b0\u6574\u4e2a TLB\u3002\u540c\u8fdb\u7a0b\u7ebf\u7a0b\u5207\u6362\u7684\u4e3b\u8981\u5f00\u9500\u4e0d\u662f TLB \u5931\u6548&#xff0c;\u800c\u662f CPU \u7f13\u5b58\u4e2d\u7684\u70ed\u6570\u636e\u5931\u6548\u2014\u2014\u5207\u6362\u524d\u540e\u4e24\u4e2a\u7ebf\u7a0b\u8bbf\u95ee\u7684\u662f\u5b8c\u5168\u4e0d\u540c\u7684\u5185\u5b58\u533a\u57df&#xff0c;\u7f13\u5b58\u91cc\u4e4b\u524d\u9884\u70ed\u597d\u7684\u5185\u5bb9\u6362\u4e86\u4e2a\u7ebf\u7a0b\u5c31\u5168\u90e8\u5931\u6548\u4e86\u3002<\/p>\n<p>\u7531\u4e8e\u5c40\u90e8\u6027\u539f\u7406\u7684\u5b58\u5728&#xff0c;CPU \u5728\u8bbf\u95ee\u5185\u5b58\u65f6\u901a\u5e38\u4e0d\u4f1a\u53ea\u52a0\u8f7d\u5f53\u524d\u6240\u9700\u7684\u90a3\u4e00\u4e2a\u6570\u636e\u3002\u4f8b\u5982\u4ee5 32 \u4f4d\u673a\u5668 \u4e3a\u4f8b&#xff0c;\u82e5\u6570\u636e\u603b\u7ebf\u5bbd\u5ea6\u4e3a 32 \u4f4d&#xff0c;\u5219\u4e00\u6b21\u603b\u7ebf\u4f20\u8f93\u7406\u8bba\u4e0a\u53ef\u4ee5\u8bfb\u53d6 4 \u5b57\u8282\u7684\u6570\u636e\u3002\u4f46\u5728\u5b9e\u9645\u7684\u7f13\u5b58\u4f53\u7cfb\u4e2d&#xff0c;CPU \u5728\u8fdb\u884c\u4e00\u6b21\u5185\u5b58\u8bbf\u95ee\u65f6&#xff0c;\u5e76\u4e0d\u4f1a\u53ea\u8bfb\u53d6\u8fd9 4 \u5b57\u8282&#xff0c;\u800c\u662f\u4f1a\u6309\u7167 Cache Line&#xff08;64\u5b57\u8282\u7f13\u5b58\u884c&#xff09; \u7684\u7c92\u5ea6&#xff0c;\u5c06\u76ee\u6807\u5730\u5740\u9644\u8fd1\u7684\u4e00\u6574\u5757\u8fde\u7eed\u6570\u636e\u52a0\u8f7d\u5230\u7f13\u5b58\u4e2d&#xff0c;\u4e5f\u5c31\u662f\u8bf4&#xff0c;\u5f53\u53d1\u751f\u7f13\u5b58\u672a\u547d\u4e2d\u65f6&#xff0c;CPU \u4f1a\u53d1\u8d77\u4e00\u6b21\u5185\u5b58\u8bbf\u95ee\u8bf7\u6c42&#xff0c;\u968f\u540e\u5185\u5b58\u5b50\u7cfb\u7edf\u4f1a\u5360\u7528\u5185\u5b58\u603b\u7ebf&#xff0c;\u901a\u8fc7\u591a\u4e2a\u603b\u7ebf\u4f20\u8f93\u5468\u671f&#xff0c;\u5c06\u6574\u4e2a 64 \u5b57\u8282\u7684 Cache Line \u642c\u8fd0\u5230 CPU \u7f13\u5b58\u4e2d\u3002\u4f8b\u5982\u5728 32 \u4f4d\u6570\u636e\u603b\u7ebf\u7684\u60c5\u51b5\u4e0b&#xff0c;\u9700\u8981\u7ecf\u8fc7\u7ea6 16 \u6b21\u603b\u7ebf\u4f20\u8f93\u624d\u80fd\u5b8c\u6210\u8fd9\u4e00\u8fc7\u7a0b\u3002\u3002<\/p>\n<p>\u8fd9\u6837\u505a\u7684\u539f\u56e0\u5728\u4e8e \u7a7a\u95f4\u5c40\u90e8\u6027&#xff1a;\u7a0b\u5e8f\u5728\u8bbf\u95ee\u67d0\u4e2a\u5185\u5b58\u5730\u5740\u4e4b\u540e&#xff0c;\u5f88\u6709\u53ef\u80fd\u5728\u63a5\u4e0b\u6765\u8bbf\u95ee\u5176\u9644\u8fd1\u7684\u5730\u5740\u3002\u56e0\u6b64&#xff0c;CPU \u4f1a\u63d0\u524d\u5c06\u76ee\u6807\u6570\u636e\u5468\u56f4\u7684\u4e00\u6bb5\u6570\u636e\u4e00\u5e76\u52a0\u8f7d\u5230\u7f13\u5b58\u4e2d&#xff0c;\u4ee5\u63d0\u9ad8\u540e\u7eed\u8bbf\u95ee\u65f6\u7684 \u7f13\u5b58\u547d\u4e2d\u7387&#xff08;Cache Hit Rate&#xff09;&#xff0c;\u4ece\u800c\u51cf\u5c11\u5bf9\u4e3b\u5b58\u7684\u8bbf\u95ee\u6b21\u6570\u3002<\/p>\n<p>\u56e0\u6b64&#xff0c;\u8fd9\u91cc\u7684\u7ebf\u7a0b\u4e0a\u4e0b\u6587\u5207\u6362\u5f00\u9500\u901a\u5e38\u5e76\u4e0d\u662f\u7531\u4e8e TLB \u88ab\u5237\u65b0\u6240\u5bfc\u81f4\u7684&#xff0c;\u800c\u662f\u7531\u4e8e\u7ebf\u7a0b\u5207\u6362\u540e&#xff0c;\u539f\u5148\u52a0\u8f7d\u5230 CPU Cache\u4e2d\u7684\u6570\u636e\u5f88\u53ef\u80fd\u4e0d\u518d\u88ab\u5f53\u524d\u8fd0\u884c\u7684\u7ebf\u7a0b\u4f7f\u7528&#xff0c;\u4e0d\u540c\u7ebf\u7a0b\u7684\u5de5\u4f5c\u6570\u636e\u96c6\u5f80\u5f80\u4e0d\u540c&#xff0c;\u4ece\u800c\u4f7f\u5f97\u4e4b\u524d\u52a0\u8f7d\u5230 CPU Cache \u4e2d\u7684\u6570\u636e\u9010\u6e10\u5931\u6548\u5e76\u88ab\u65b0\u7684\u6570\u636e\u8986\u76d6&#xff0c;\u4ece\u800c\u5bfc\u81f4\u7f13\u5b58\u5c40\u90e8\u6027\u88ab\u7834\u574f&#xff08;Cache Locality Loss&#xff09;&#xff0c;\u8fdb\u800c\u589e\u52a0\u7f13\u5b58\u672a\u547d\u4e2d\u7684\u6982\u7387\u3002<\/p>\n<p>\u9664\u4e86\u4e0a\u8ff0\u95ee\u9898\u4e4b\u5916&#xff0c;\u591a\u7ebf\u7a0b\u8fd8\u4f1a\u589e\u52a0 CPU \u8c03\u5ea6\u7684\u5f00\u9500\u3002<\/p>\n<p>\u5728\u65e9\u671f\u7684 Linux \u5185\u6838\u5b9e\u73b0\u4e2d&#xff0c;\u5c31\u7eea\u961f\u5217&#xff08;Runqueue&#xff09;\u662f\u901a\u8fc7 \u4f18\u5148\u7ea7\u6570\u7ec4&#xff08;Priority Array&#xff09; \u5b9e\u73b0\u7684\u3002\u8be5\u6570\u7ec4\u4e2d\u7684\u6bcf\u4e00\u4e2a\u5143\u7d20\u90fd\u662f\u4e00\u4e2a\u6307\u9488&#xff0c;\u6307\u5411\u4e00\u4e2a\u94fe\u8868&#xff0c;\u800c\u6570\u7ec4\u4e0b\u6807\u5bf9\u5e94\u4e0d\u540c\u7684\u4f18\u5148\u7ea7\u3002<\/p>\n<p>\u94fe\u8868\u4e2d\u7684\u6bcf\u4e00\u4e2a\u8282\u70b9\u5c31\u662f\u4e00\u4e2a task_struct&#xff0c;\u540c\u4e00\u4e2a\u94fe\u8868\u4e2d\u7684\u8fdb\u7a0b\u5177\u6709\u76f8\u540c\u7684\u4f18\u5148\u7ea7\u3002<\/p>\n<p>Linux \u4e2d\u7684\u4f18\u5148\u7ea7\u5206\u4e3a \u9759\u6001\u4f18\u5148\u7ea7&#xff08;Static Priority&#xff09; \u548c \u52a8\u6001\u4f18\u5148\u7ea7&#xff08;Dynamic Priority&#xff09;\u3002\u9759\u6001\u4f18\u5148\u7ea7\u901a\u5e38\u53cd\u6620\u7a0b\u5e8f\u5458\u7684\u610f\u56fe&#xff0c;\u4f8b\u5982\u901a\u8fc7\u8c03\u6574 nice \u503c \u6765\u5f71\u54cd\u8fdb\u7a0b\u7684\u8c03\u5ea6\u4f18\u5148\u7ea7\u3002<\/p>\n<p>\u7136\u800c\u5185\u6838\u8c03\u5ea6\u5668\u9700\u8981\u4ece\u5168\u5c40\u89d2\u5ea6\u7ba1\u7406\u6240\u6709\u53ef\u8fd0\u884c\u8fdb\u7a0b&#xff0c;\u56e0\u6b64\u4ec5\u4f9d\u8d56\u9759\u6001\u4f18\u5148\u7ea7\u662f\u4e0d\u591f\u7684\u3002\u8c03\u5ea6\u5668\u8fd8\u4f1a\u6839\u636e \u8fdb\u7a0b\u7684\u8fd0\u884c\u65f6\u95f4\u7b49\u56e0\u7d20 \u52a8\u6001\u8c03\u6574\u5176\u4f18\u5148\u7ea7&#xff0c;\u4ece\u800c\u5f97\u5230\u6700\u7ec8\u7684\u8c03\u5ea6\u4f18\u5148\u7ea7\u3002<\/p>\n<p>\u4e3a\u4e86\u52a0\u5feb\u4f18\u5148\u7ea7\u6570\u7ec4\u7684\u67e5\u627e\u901f\u5ea6&#xff0c;\u8c03\u5ea6\u5668\u8fd8\u4f1a\u7ef4\u62a4\u4e00\u4e2a \u4f4d\u56fe&#xff08;bitmap&#xff09;&#xff0c;\u7528\u4e8e\u5feb\u901f\u5224\u65ad\u54ea\u4e9b\u4f18\u5148\u7ea7\u961f\u5217\u662f\u975e\u7a7a\u7684&#xff0c;\u4ece\u800c\u53ef\u4ee5\u5728 O(1) \u65f6\u95f4\u5185\u627e\u5230\u6700\u9ad8\u4f18\u5148\u7ea7\u7684\u53ef\u8fd0\u884c\u4efb\u52a1\u3002<\/p>\n<p>\u5f53\u65f6\u7684\u5c31\u7eea\u961f\u5217\u5b9e\u9645\u4e0a\u5305\u542b\u4e24\u4e2a\u961f\u5217&#xff1a;<\/p>\n<ul>\n<li>active \u961f\u5217<\/li>\n<li>expired \u961f\u5217<\/li>\n<\/ul>\n<p>\u5f53\u8fdb\u7a0b\u65f6\u95f4\u7247\u8017\u5c3d\u65f6&#xff0c;\u4f1a\u91cd\u65b0\u8ba1\u7b97\u5176\u65f6\u95f4\u7247\u548c\u52a8\u6001\u4f18\u5148\u7ea7&#xff0c;\u7136\u540e\u5c06\u5176\u653e\u5165 expired \u961f\u5217\u3002\u5f53 active \u961f\u5217\u4e2d\u7684\u4efb\u52a1\u5168\u90e8\u6267\u884c\u5b8c\u6bd5\u540e&#xff0c;\u8c03\u5ea6\u5668\u53ea\u9700\u8981\u4ea4\u6362\u4e24\u4e2a\u961f\u5217\u7684\u6307\u9488\u5373\u53ef\u3002<\/p>\n<p>\u56e0\u6b64\u8fd9\u79cd\u8c03\u5ea6\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(1)\u3002<\/p>\n<p>\u8fdb\u7a0b\u4ece active \u961f\u5217\u88ab\u8c03\u5ea6\u51fa\u6765\u8fd0\u884c<br \/>\n  \u2192 \u65f6\u95f4\u7247\u8017\u5c3d<br \/>\n  \u2192 \u91cd\u65b0\u8ba1\u7b97\u65b0\u7684\u65f6\u95f4\u7247\u4ee5\u53ca\u52a8\u6001\u4f18\u5148\u7ea7<br \/>\n  \u2192 \u79fb\u5165 expired \u961f\u5217<\/p>\n<p>active \u961f\u5217\u5f7b\u5e95\u7a7a\u4e86<br \/>\n  \u2192 \u76f4\u63a5\u4ea4\u6362 active \u548c expired \u4e24\u4e2a\u6307\u9488<br \/>\n  \u2192 \u539f\u6765\u7684 expired \u961f\u5217\u53d8\u6210\u65b0\u7684 active \u961f\u5217<br \/>\n  \u2192 \u91cd\u65b0\u5f00\u59cb<\/p>\n<p>\u800c\u5728\u73b0\u4ee3 Linux \u5185\u6838\u4e2d&#xff0c;\u5c31\u7eea\u961f\u5217\u91c7\u7528\u7684\u662f \u7ea2\u9ed1\u6811 \u7ed3\u6784\u8fdb\u884c\u7ec4\u7ec7\u3002\u5728\u8fd9\u79cd\u5b9e\u73b0\u4e2d&#xff0c;\u7ea2\u9ed1\u6811\u7684\u952e\u503c\u5e76\u4e0d\u662f\u4f20\u7edf\u610f\u4e49\u4e0a\u7684\u4f18\u5148\u7ea7&#xff0c;\u800c\u662f \u865a\u62df\u8fd0\u884c\u65f6\u95f4&#xff08;vruntime&#xff09;\u3002<\/p>\n<p>\u865a\u62df\u8fd0\u884c\u65f6\u95f4\u7684\u8ba1\u7b97\u4e3b\u8981\u53d6\u51b3\u4e8e\u4e24\u4e2a\u56e0\u7d20&#xff1a;\u8fdb\u7a0b\u7684\u9759\u6001\u4f18\u5148\u7ea7&#xff08;nice \u503c&#xff09;\u4ee5\u53ca\u8fdb\u7a0b\u5b9e\u9645\u7684\u8fd0\u884c\u65f6\u95f4\u3002\u5982\u679c\u4e00\u4e2a\u8fdb\u7a0b\u5b9e\u9645\u8fd0\u884c\u7684\u65f6\u95f4\u8d8a\u4e45&#xff0c;\u90a3\u4e48\u5176\u865a\u62df\u8fd0\u884c\u65f6\u95f4\u5c31\u4f1a\u8d8a\u5927&#xff1b;\u800c\u5982\u679c\u8fdb\u7a0b\u7684 nice \u503c\u8d8a\u5927&#xff08;\u4f18\u5148\u7ea7\u8d8a\u4f4e&#xff09;&#xff0c;\u90a3\u4e48\u5176\u865a\u62df\u8fd0\u884c\u65f6\u95f4\u589e\u957f\u7684\u5e45\u5ea6\u4e5f\u4f1a\u8d8a\u5927\u3002<\/p>\n<p>\u56e0\u6b64&#xff0c;\u6bcf\u5f53\u4e00\u4e2a\u8fdb\u7a0b\u5b8c\u6210\u4e00\u6b21\u8c03\u5ea6\u5468\u671f\u5e76\u88ab\u6362\u51fa CPU \u65f6&#xff0c;\u5185\u6838\u90fd\u4f1a\u6839\u636e\u8be5\u8fdb\u7a0b\u672c\u6b21\u7684 \u5b9e\u9645\u8fd0\u884c\u65f6\u95f4 \u91cd\u65b0\u8ba1\u7b97\u5e76\u66f4\u65b0\u5176\u865a\u62df\u8fd0\u884c\u65f6\u95f4\u3002<\/p>\n<p>\u5177\u4f53\u6765\u8bf4&#xff0c;\u865a\u62df\u8fd0\u884c\u65f6\u95f4\u7684\u589e\u957f\u662f\u901a\u8fc7\u5982\u4e0b\u65b9\u5f0f\u8ba1\u7b97\u7684&#xff1a;\u5c06 \u5b9e\u9645\u8fd0\u884c\u65f6\u95f4 \u4e58\u4ee5\u4e00\u4e2a \u6743\u91cd\u6bd4\u4f8b\u7cfb\u6570\u3002\u8be5\u6bd4\u4f8b\u7cfb\u6570\u7531 nice \u503c\u4e3a 0 \u65f6\u5bf9\u5e94\u7684\u57fa\u51c6\u6743\u91cd&#xff08;NICE_0_LOAD&#xff09; \u4e0e\u5f53\u524d\u8fdb\u7a0b\u7684\u6743\u91cd\u4e4b\u6bd4\u5f97\u5230\u3002\u4e5f\u5c31\u662f\u8bf4&#xff1a;<\/p>\n<ul>\n<li>nice \u503c\u8d8a\u5927&#xff08;\u4f18\u5148\u7ea7\u8d8a\u4f4e&#xff09;&#xff0c;\u5bf9\u5e94\u7684\u6743\u91cd\u8d8a\u5c0f&#xff0c;\u56e0\u6b64\u865a\u62df\u8fd0\u884c\u65f6\u95f4\u589e\u957f\u5f97\u8d8a\u5feb&#xff1b;<\/li>\n<li>nice \u503c\u8d8a\u5c0f&#xff08;\u4f18\u5148\u7ea7\u8d8a\u9ad8&#xff09;&#xff0c;\u5bf9\u5e94\u7684\u6743\u91cd\u8d8a\u5927&#xff0c;\u56e0\u6b64\u865a\u62df\u8fd0\u884c\u65f6\u95f4\u589e\u957f\u5f97\u8d8a\u6162\u3002<\/li>\n<\/ul>\n<p>\u56e0\u6b64&#xff0c;\u5728\u76f8\u540c\u7684\u5b9e\u9645\u8fd0\u884c\u65f6\u95f4\u4e0b&#xff0c;\u4f4e\u4f18\u5148\u7ea7\u8fdb\u7a0b\u7684 vruntime \u4f1a\u589e\u957f\u5f97\u66f4\u5feb&#xff0c;\u800c\u9ad8\u4f18\u5148\u7ea7\u8fdb\u7a0b\u589e\u957f\u5f97\u66f4\u6162\u3002<\/p>\n<p>\u5728\u8ba1\u7b97\u51fa\u65b0\u7684 \u865a\u62df\u8fd0\u884c\u65f6\u95f4 \u4e4b\u540e&#xff0c;\u8c03\u5ea6\u5668\u4f1a\u5c06\u8be5\u8c03\u5ea6\u5b9e\u4f53\u91cd\u65b0\u63d2\u5165\u5230 \u7ea2\u9ed1\u6811 \u4e2d\u3002\u7531\u4e8e\u7ea2\u9ed1\u6811\u662f\u4e00\u79cd\u81ea\u5e73\u8861\u4e8c\u53c9\u641c\u7d22\u6811&#xff0c;\u56e0\u6b64\u63d2\u5165\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(log N)\u3002<\/p>\n<p>\u4e3a\u4e86\u4fdd\u8bc1\u8c03\u5ea6\u7684\u516c\u5e73\u6027&#xff0c;\u9700\u8981\u63a8\u52a8\u5404\u4e2a\u8fdb\u7a0b\u7684\u6267\u884c\u8fdb\u5ea6&#xff0c;\u56e0\u6b64\u9700\u8981\u4f18\u5148\u7167\u987e\u6574\u4f53\u8fd0\u884c\u65f6\u95f4\u6700\u5c11\u7684\u8fdb\u7a0b&#xff0c;\u4ece\u800c\u63a8\u8fdb\u5176\u4efb\u52a1\u7684\u6267\u884c\u3002\u56e0\u6b64\u8c03\u5ea6\u5668\u4f1a\u9009\u62e9 \u865a\u62df\u8fd0\u884c\u65f6\u95f4\u6700\u5c0f\u7684\u8c03\u5ea6\u5b9e\u4f53&#xff0c;\u4e5f\u5c31\u662f\u7ea2\u9ed1\u6811\u4e2d\u7684 \u6700\u5de6\u8282\u70b9 \u8fdb\u884c\u8c03\u5ea6\u3002<\/p>\n<p>vruntime <span class=\"token operator\">&#043;&#061;<\/span> \u5b9e\u9645\u8fd0\u884c\u65f6\u95f4 \u00d7 <span class=\"token punctuation\">(<\/span>NICE_0_LOAD <span class=\"token operator\">\/<\/span> \u8be5\u8fdb\u7a0b\u7684\u6743\u91cd<span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token comment\">\/* \u5176\u4e2d NICE_0_LOAD \u662f nice \u503c\u4e3a 0 \u65f6\u5bf9\u5e94\u7684\u57fa\u51c6\u6743\u91cd&#xff0c;<br \/>\n   \u5728 Linux \u4e2d\u8be5\u503c\u4e3a 1024\u3002<\/p>\n<p>   Linux \u5185\u6838\u7ef4\u62a4\u4e86\u4e00\u5f20\u9759\u6001\u6743\u91cd\u8868&#xff1a;<br \/>\n   nice \u503c\u6bcf\u964d\u4f4e 1&#xff0c;\u6743\u91cd\u5927\u7ea6\u589e\u52a0 25%<br \/>\n   nice \u503c\u6bcf\u5347\u9ad8 1&#xff0c;\u6743\u91cd\u5927\u7ea6\u51cf\u5c11 20%<\/p>\n<p>   nice \u503c\u4f4e&#xff08;\u4f18\u5148\u7ea7\u9ad8&#xff09;\u7684\u8fdb\u7a0b&#xff1a;<br \/>\n   \u6743\u91cd\u5927 \u2192 vruntime \u589e\u957f\u6162 \u2192 \u66f4\u5bb9\u6613\u518d\u6b21\u88ab\u8c03\u5ea6<\/p>\n<p>   nice \u503c\u9ad8&#xff08;\u4f18\u5148\u7ea7\u4f4e&#xff09;\u7684\u8fdb\u7a0b&#xff1a;<br \/>\n   \u6743\u91cd\u5c0f \u2192 vruntime \u589e\u957f\u5feb \u2192 \u66f4\u5feb\u79fb\u52a8\u5230\u7ea2\u9ed1\u6811\u53f3\u4fa7<br \/>\n   \u4ece\u800c\u8ba9\u51fa CPU<br \/>\n*\/<\/span><\/p>\n<hr \/>\n<p>\u90a3\u4e48\u4ee5\u4e0a&#xff0c;\u6211\u4eec\u4ecb\u7ecd\u4e86\u51e0\u79cd IO \u6a21\u578b&#xff0c;\u5206\u522b\u662f\u5355\u7ebf\u7a0b\u963b\u585e\u5f0f IO \u6a21\u578b\u4ee5\u53ca\u5355\u7ebf\u7a0b \/ \u591a\u7ebf\u7a0b\u7684\u975e\u963b\u585e\u4e3b\u52a8\u8f6e\u8be2\u5f0f IO \u6a21\u578b\u3002\u901a\u8fc7\u524d\u6587\u7684\u5206\u6790\u53ef\u4ee5\u660e\u663e\u611f\u53d7\u5230&#xff0c;\u8fd9\u7c7b\u6a21\u578b\u5b58\u5728\u4e00\u4e9b\u8f83\u4e3a\u660e\u663e\u7684\u7f3a\u70b9\u3002<\/p>\n<p>\u9996\u5148&#xff0c;\u5728\u963b\u585e\u5f0f IO \u6a21\u578b\u4e2d&#xff0c;\u7ebf\u7a0b\u9700\u8981\u5728\u6761\u4ef6\u672a\u5c31\u7eea\u65f6\u88ab\u52a8\u6302\u8d77&#xff0c;\u7b49\u5f85\u6761\u4ef6\u6ee1\u8db3\u540e\u624d\u4f1a\u88ab\u5524\u9192\u3002\u5176\u6b21&#xff0c;\u5728\u8bb8\u591a\u5b9e\u73b0\u65b9\u5f0f\u4e2d\u5f80\u5f80\u91c7\u7528\u4e00\u4e2a\u7ebf\u7a0b\u5904\u7406\u4e00\u4e2a\u8fde\u63a5\u7684\u6a21\u5f0f&#xff0c;\u800c\u5728\u5178\u578b\u7684\u670d\u52a1\u7aef\u573a\u666f\u4e0b&#xff0c;\u670d\u52a1\u7aef\u901a\u5e38\u9700\u8981\u540c\u65f6\u9762\u5bf9\u5927\u91cf\u5ba2\u6237\u7aef&#xff0c;\u5373\u5b58\u5728\u4e00\u5bf9\u591a\u7684\u8fde\u63a5\u5173\u7cfb\u3002\u8fd9\u610f\u5473\u7740\u670d\u52a1\u7aef\u9700\u8981\u521b\u5efa\u5927\u91cf\u7ebf\u7a0b&#xff0c;\u6bcf\u4e00\u4e2a\u7ebf\u7a0b\u5bf9\u5e94\u4e00\u4e2a\u8fde\u63a5\u3002<\/p>\n<p>\u7136\u800c&#xff0c;\u5927\u91cf\u7ebf\u7a0b\u7684\u5b58\u5728\u4f1a\u5e26\u6765\u4e00\u7cfb\u5217\u989d\u5916\u5f00\u9500\u3002\u4f8b\u5982&#xff1a;<\/p>\n<ul>\n<li>\u7ebf\u7a0b\u4e4b\u95f4\u9891\u7e41\u7684\u4e0a\u4e0b\u6587\u5207\u6362\u5f00\u9500\u5373CPU \u7f13\u5b58\u5931\u6548\u6240\u5e26\u6765\u7684\u6027\u80fd\u635f\u8017&#xff1b;<\/li>\n<li>\u7528\u6237\u6001\u4e0e\u5185\u6838\u6001\u4e4b\u95f4\u7684\u9891\u7e41\u6a21\u5f0f\u5207\u6362&#xff1b;<\/li>\n<li>\u6bcf\u4e2a\u7ebf\u7a0b\u81ea\u8eab\u6240\u5360\u7528\u7684\u6808\u7a7a\u95f4\u7b49\u5185\u5b58\u8d44\u6e90&#xff1b;<\/li>\n<li>\u7ebf\u7a0b\u6570\u91cf\u589e\u591a\u540e&#xff0c;CPU \u8c03\u5ea6\u5668\u7684\u8c03\u5ea6\u538b\u529b\u663e\u8457\u589e\u52a0\u3002<\/li>\n<\/ul>\n<h3>I\/O\u591a\u8def\u590d\u7528<\/h3>\n<p>\u56e0\u6b64&#xff0c;\u63a5\u4e0b\u6765\u4fbf\u8fc7\u6e21\u5230\u591a\u8def\u590d\u7528 IO \u6a21\u578b&#xff08;I\/O Multiplexing&#xff09;\u3002\u8be5\u6a21\u578b\u7684\u63d0\u51fa&#xff0c;\u6b63\u662f\u4e3a\u4e86\u7f13\u89e3\u751a\u81f3\u89e3\u51b3\u4e0a\u8ff0\u6a21\u578b\u6240\u5e26\u6765\u7684\u95ee\u9898\u3002\u5b9e\u9645\u4e0a&#xff0c;\u524d\u8ff0\u6a21\u578b\u7684\u6838\u5fc3\u7f3a\u9677\u5728\u4e8e&#xff1a;\u521b\u5efa\u4e86\u8fc7\u591a\u7ebf\u7a0b\u3002\u800c\u5176\u6839\u672c\u539f\u56e0\u5219\u5728\u4e8e\u4e00\u4e2a\u7ebf\u7a0b\u4ec5\u8d1f\u8d23\u7ba1\u7406\u4e00\u4e2a\u8fde\u63a5\u3002<\/p>\n<p>\u5982\u679c\u5e0c\u671b\u89e3\u51b3\u8fd9\u4e00\u95ee\u9898&#xff0c;\u672c\u8d28\u601d\u8def\u4fbf\u662f\u51cf\u5c11\u7ebf\u7a0b\u6570\u91cf\u3002\u800c\u51cf\u5c11\u7ebf\u7a0b\u6570\u91cf\u7684\u5173\u952e\u65b9\u6cd5&#xff0c;\u5c31\u662f\u8ba9\u4e00\u4e2a\u7ebf\u7a0b\u540c\u65f6\u7ba1\u7406\u591a\u4e2a\u8fde\u63a5&#xff0c;\u800c\u4e0d\u662f\u4ec5\u7ba1\u7406\u4e00\u4e2a\u8fde\u63a5\u3002\u8fd9\u4e00\u601d\u60f3&#xff0c;\u6b63\u662f\u591a\u8def\u590d\u7528 IO \u6a21\u578b\u7684\u6838\u5fc3\u8bbe\u8ba1\u7406\u5ff5\u3002<\/p>\n<p>\u5728\u5177\u4f53\u4ecb\u7ecd\u5b9e\u73b0\u591a\u8def\u590d\u7528\u7684\u7cfb\u7edf\u8c03\u7528\u63a5\u53e3&#xff08;\u4f8b\u5982 select\u3001poll\u3001epoll \u7b49&#xff09;\u4e4b\u524d&#xff0c;\u6211\u4eec\u9996\u5148\u4ece\u601d\u60f3\u5c42\u9762\u7406\u89e3\u591a\u8def\u590d\u7528\u7684\u57fa\u672c\u673a\u5236&#xff0c;\u5e76\u5206\u6790\u5176\u76f8\u6bd4\u4e4b\u524d\u6a21\u578b\u7684\u4f18\u52bf\u6240\u5728\u3002<\/p>\n<p>\u6240\u8c13\u591a\u8def\u590d\u7528&#xff0c;\u5176\u6838\u5fc3\u601d\u60f3\u662f&#xff1a;\u7531\u4e00\u4e2a\u7ebf\u7a0b\u540c\u65f6\u68c0\u67e5\u591a\u4e2a\u6587\u4ef6\u63cf\u8ff0\u7b26&#xff08;file descriptor&#xff0c;fd&#xff09;\u7684\u5c31\u7eea\u72b6\u6001\u3002\u5177\u4f53\u6765\u8bf4&#xff0c;\u7ebf\u7a0b\u4f1a\u8c03\u7528\u76f8\u5e94\u7684\u7cfb\u7edf\u8c03\u7528&#xff0c;\u5c06\u4e00\u7ec4\u6587\u4ef6\u63cf\u8ff0\u7b26\u4ea4\u7ed9\u5185\u6838\u8fdb\u884c\u76d1\u89c6&#xff1b;\u5f53\u8fd9\u4e9b\u6587\u4ef6\u63cf\u8ff0\u7b26\u4e2d\u4efb\u610f\u4e00\u4e2a\u6216\u591a\u4e2a\u6761\u4ef6\u5c31\u7eea\u65f6&#xff0c;\u5185\u6838\u518d\u5524\u9192\u963b\u585e\u7684\u7ebf\u7a0b\u3002<\/p>\n<p>\u4ece\u8868\u9762\u4e0a\u770b&#xff0c;\u8fd9\u79cd\u673a\u5236\u4f3c\u4e4e\u4e0e\u6700\u521d\u4ecb\u7ecd\u7684\u963b\u585e\u5f0f IO \u6a21\u578b\u7c7b\u4f3c&#xff0c;\u56e0\u4e3a\u7ebf\u7a0b\u540c\u6837\u4f1a\u8fdb\u5165\u963b\u585e\u72b6\u6001\u7b49\u5f85\u6761\u4ef6\u5c31\u7eea\u3002\u4f46\u4e24\u8005\u4e4b\u95f4\u5b58\u5728\u4e00\u4e2a\u5173\u952e\u533a\u522b&#xff1a; \u5728\u963b\u585e\u5f0f IO \u6a21\u578b\u4e2d&#xff0c;\u7ebf\u7a0b\u53ea\u7b49\u5f85\u4e00\u4e2a fd \u7684\u5c31\u7eea\u4e8b\u4ef6&#xff1b;\u800c\u5728\u591a\u8def\u590d\u7528\u6a21\u578b\u4e2d&#xff0c;\u7ebf\u7a0b\u540c\u65f6\u7b49\u5f85\u4e00\u7ec4 fd \u7684\u5c31\u7eea\u4e8b\u4ef6\u3002<\/p>\n<p>\u8fd9\u610f\u5473\u7740\u7ebf\u7a0b\u5e76\u4e0d\u5bb9\u6613\u957f\u65f6\u95f4\u9677\u5165\u65e0\u610f\u4e49\u7684\u963b\u585e\u72b6\u6001\u3002\u56e0\u4e3a\u5728\u4e00\u7ec4 fd \u4e2d&#xff0c;\u53ea\u8981\u4efb\u610f\u4e00\u4e2a fd \u6761\u4ef6\u5c31\u7eea&#xff0c;\u7ebf\u7a0b\u4fbf\u4f1a\u88ab\u5185\u6838\u5524\u9192\u3002\u7531\u4e8e\u540c\u65f6\u76d1\u89c6\u591a\u4e2a fd&#xff0c;\u8fd9\u4e5f\u663e\u8457\u63d0\u9ad8\u4e86\u6761\u4ef6\u5c31\u7eea\u4e8b\u4ef6\u53d1\u751f\u7684\u6982\u7387&#xff0c;\u4ece\u800c\u4f7f\u7ebf\u7a0b\u80fd\u591f\u66f4\u52a0\u9891\u7e41\u5730\u88ab\u6709\u6548\u5524\u9192\u3002<\/p>\n<p>\u5e76\u4e14&#xff0c;\u5f53\u7ebf\u7a0b\u88ab\u5524\u9192\u65f6&#xff0c;\u5f80\u5f80\u4e0d\u4ec5\u4ec5\u662f\u4e00\u4e2a fd \u5c31\u7eea&#xff0c;\u800c\u662f\u53ef\u80fd\u6709\u591a\u4e2a fd \u540c\u65f6\u5c31\u7eea\u3002\u8fd9\u4e00\u8fc7\u7a0b\u53ef\u4ee5\u7c7b\u6bd4\u4e3a\u5728\u6cb3\u8fb9\u9493\u9c7c&#xff1a; \u5728\u4f20\u7edf\u6a21\u578b\u4e2d&#xff0c;\u76f8\u5f53\u4e8e\u4e00\u4e2a\u4eba\u5728\u6cb3\u8fb9\u53ea\u653e\u7f6e\u4e00\u6839\u9c7c\u7aff&#xff0c;\u7136\u540e\u7b49\u5f85\u9c7c\u513f\u4e0a\u94a9&#xff1b;\u800c\u5728\u591a\u8def\u590d\u7528\u6a21\u578b\u4e2d&#xff0c;\u5219\u76f8\u5f53\u4e8e\u5728\u6cb3\u8fb9\u540c\u65f6\u653e\u7f6e\u4e86\u591a\u6839\u9c7c\u7aff\u3002\u867d\u7136\u6bcf\u4e00\u6761\u9c7c\u54ac\u94a9\u7684\u6982\u7387\u5e76\u6ca1\u6709\u6539\u53d8&#xff0c;\u4f46\u9c7c\u7aff\u6570\u91cf\u8d8a\u591a&#xff0c;\u88ab\u9c7c\u54ac\u94a9\u7684\u6982\u7387\u5c31\u8d8a\u5927&#xff0c;\u56e0\u6b64\u4e00\u6b21\u80fd\u591f\u6536\u83b7\u7684\u9c7c\u4e5f\u5c31\u8d8a\u591a\u3002\u7c7b\u4f3c\u5730&#xff0c;\u4e00\u4e2a\u7ebf\u7a0b\u4e00\u6b21\u4fbf\u53ef\u80fd\u68c0\u6d4b\u5230\u591a\u4e2a fd \u5904\u4e8e\u5c31\u7eea\u72b6\u6001\u3002<\/p>\n<p>\u5f53\u68c0\u6d4b\u5230\u591a\u4e2a\u6587\u4ef6\u63cf\u8ff0\u7b26\u5c31\u7eea\u4e4b\u540e&#xff0c;\u6bcf\u4e00\u4e2a\u6587\u4ef6\u63cf\u8ff0\u7b26\u901a\u5e38\u90fd\u5bf9\u5e94\u7740\u7279\u5b9a\u7684\u4e1a\u52a1\u5904\u7406\u903b\u8f91\u3002\u56e0\u6b64&#xff0c;\u63a5\u4e0b\u6765\u4fbf\u53ef\u4ee5\u6839\u636e\u5177\u4f53\u60c5\u51b5&#xff0c;\u5c06\u8fd9\u4e9b\u5c31\u7eea\u7684 fd \u5206\u914d\u7ed9\u76f8\u5e94\u7684\u7ebf\u7a0b\u8fdb\u884c\u5904\u7406\u3002<\/p>\n<p>\u76f8\u6bd4\u4e4b\u524d\u7684\u591a\u7ebf\u7a0b\u975e\u963b\u585e IO \u6a21\u578b&#xff0c;\u90a3\u79cd\u6a21\u578b\u5f80\u5f80\u662f\u7531\u4e3b\u7ebf\u7a0b\u4e3a\u6bcf\u4e00\u4e2a\u8fde\u63a5\u521b\u5efa\u6216\u5206\u914d\u4e00\u4e2a\u7ebf\u7a0b&#xff0c;\u6bcf\u4e2a\u7ebf\u7a0b\u53ea\u8d1f\u8d23\u7ba1\u7406\u4e00\u4e2a fd&#xff0c;\u5e76\u901a\u8fc7\u975e\u963b\u585e\u65b9\u5f0f\u4e0d\u65ad\u8f6e\u8be2\u8be5 fd \u7684\u72b6\u6001\u3002\u8fd9\u79cd\u65b9\u5f0f\u5b58\u5728\u4e00\u4e2a\u660e\u663e\u95ee\u9898&#xff1a;CPU \u4f1a\u51fa\u73b0\u5927\u91cf\u7a7a\u8f6c\u3002<\/p>\n<p>\u539f\u56e0\u5728\u4e8e&#xff0c;\u5bf9\u4e8e\u5355\u4e2a\u7ebf\u7a0b\u800c\u8a00&#xff0c;\u5176\u6240\u76d1\u89c6\u7684 fd \u5728\u5927\u591a\u6570\u8f6e\u8be2\u5468\u671f\u5185\u5f80\u5f80\u5e76\u4e0d\u4f1a\u7acb\u5373\u5c31\u7eea&#xff0c;\u56e0\u6b64\u7ebf\u7a0b\u4f1a\u4e0d\u65ad\u91cd\u590d\u68c0\u67e5&#xff0c;\u5374\u5f88\u5c11\u83b7\u5f97\u6709\u6548\u7ed3\u679c\u3002\u5bf9\u4e8e\u5178\u578b\u7684\u5ba2\u6237\u7aef\u2014\u670d\u52a1\u7aef\u6a21\u578b\u6765\u8bf4&#xff0c;\u8fd9\u91cc\u901a\u5e38\u5173\u6ce8\u7684\u662f TCP \u5957\u63a5\u5b57\u662f\u5426\u5c31\u7eea&#xff0c;\u4f8b\u5982&#xff1a;<\/p>\n<ul>\n<li>\u63a5\u6536\u7f13\u51b2\u533a\u662f\u5426\u5b58\u5728\u53ef\u8bfb\u6570\u636e&#xff1b;<\/li>\n<li>\u53d1\u9001\u7f13\u51b2\u533a\u662f\u5426\u5b58\u5728\u53ef\u5199\u7a7a\u95f4\u3002<\/li>\n<\/ul>\n<p>\u800c\u670d\u52a1\u7aef\u901a\u5e38\u9700\u8981\u5148\u63a5\u6536\u5230\u5ba2\u6237\u7aef\u53d1\u9001\u7684\u8bf7\u6c42\u62a5\u6587&#xff0c;\u624d\u80fd\u7ee7\u7eed\u6267\u884c\u540e\u7eed\u4e1a\u52a1\u903b\u8f91\u6bd4\u5982\u89e3\u6790\u8bf7\u6c42\u4ee5\u53ca\u6784\u5efa\u54cd\u5e94\u7b49\u3002\u5982\u679c\u7ebf\u7a0b\u53ea\u8d1f\u8d23\u4e00\u4e2a fd&#xff0c;\u800c\u8be5 fd \u957f\u65f6\u95f4\u672a\u5c31\u7eea&#xff0c;\u90a3\u4e48\u7ebf\u7a0b\u65e2\u65e0\u6cd5\u6267\u884c\u6709\u6548\u5de5\u4f5c&#xff0c;\u53c8\u6301\u7eed\u5360\u7528 CPU \u8fdb\u884c \u8f6e\u8be2\u68c0\u67e5&#xff0c;\u4ece\u800c\u5bfc\u81f4CPU \u51fa\u73b0\u5927\u91cf\u65e0\u6548\u7a7a\u8f6c&#xff0c;\u9020\u6210\u8d44\u6e90\u6d6a\u8d39\u3002<\/p>\n<p>\u56e0\u6b64&#xff0c;\u591a\u8def\u590d\u7528\u6a21\u578b\u7684\u4f18\u52bf\u53ef\u4ee5\u6982\u62ec\u4e3a\u4ee5\u4e0b\u51e0\u70b9&#xff1a;<\/p>\n<p>\u9996\u5148&#xff0c;\u901a\u8fc7\u4e00\u4e2a\u7ebf\u7a0b\u7ba1\u7406\u591a\u4e2a\u8fde\u63a5&#xff0c;\u663e\u8457\u51cf\u5c11\u4e86\u7ebf\u7a0b\u6570\u91cf&#xff0c;\u4ece\u800c\u964d\u4f4e\u4e86\u7ebf\u7a0b\u4e0a\u4e0b\u6587\u5207\u6362\u3001\u5185\u5b58\u5360\u7528\u4ee5\u53ca\u8c03\u5ea6\u5f00\u9500\u3002<\/p>\n<p>\u5176\u6b21&#xff0c;\u7531\u4e8e\u7ebf\u7a0b\u4e00\u6b21\u76d1\u89c6\u7684\u662f\u4e00\u7ec4 fd \u800c\u4e0d\u662f\u5355\u4e2a fd&#xff0c;\u56e0\u6b64\u7ebf\u7a0b\u5728\u963b\u585e\u7b49\u5f85\u65f6&#xff0c;\u66f4\u5bb9\u6613\u7b49\u5230\u67d0\u4e2a fd \u5c31\u7eea&#xff0c;\u4ece\u800c\u51cf\u5c11\u65e0\u610f\u4e49\u7684\u7b49\u5f85\u65f6\u95f4\u3002<\/p>\n<p>\u6700\u540e&#xff0c;\u5f53\u7ebf\u7a0b\u88ab\u5524\u9192\u65f6&#xff0c;\u5f80\u5f80\u80fd\u591f\u540c\u65f6\u68c0\u6d4b\u5230\u591a\u4e2a fd \u5c31\u7eea\u4e8b\u4ef6&#xff0c;\u968f\u540e\u518d\u5c06\u8fd9\u4e9b\u5c31\u7eea\u7684 fd \u5206\u53d1\u7ed9\u76f8\u5e94\u7684\u5de5\u4f5c\u7ebf\u7a0b\u8fdb\u884c\u5904\u7406\u3002\u8fd9\u6837\u65e2\u907f\u514d\u4e86\u7ebf\u7a0b\u7ba1\u7406\u5355\u4e2a\u8fde\u63a5\u6240\u5e26\u6765\u7684\u65e0\u6548\u8f6e\u8be2\u95ee\u9898&#xff0c;\u4e5f\u663e\u8457\u51cf\u5c11\u4e86 CPU \u7a7a\u8f6c\u6240\u5e26\u6765\u7684\u8d44\u6e90\u6d6a\u8d39\u3002<\/p>\n<hr \/>\n<h4>select<\/h4>\n<p>\u90a3\u4e48\u8ba4\u8bc6\u5230\u8fd9\u4e00\u70b9\u4e4b\u540e&#xff0c;\u63a5\u4e0b\u6765\u6211\u4eec\u5c31\u53ef\u4ee5\u8fdb\u4e00\u6b65\u4ecb\u7ecd\u4e0eI\/O \u591a\u8def\u590d\u7528\u76f8\u5173\u7684\u7cfb\u7edf\u8c03\u7528\u63a5\u53e3\u3002\u9996\u5148\u8981\u4ecb\u7ecd\u7684\u662f select \u7cfb\u7edf\u8c03\u7528\u63a5\u53e3\u3002\u6839\u636e\u4e0a\u6587\u7684\u5206\u6790&#xff0c;\u591a\u8def\u590d\u7528\u7684\u6838\u5fc3\u601d\u60f3\u5728\u4e8e&#xff1a;\u8fdb\u7a0b\u672c\u8eab\u4ecd\u7136\u4f1a\u9677\u5165\u963b\u585e\u7b49\u5f85&#xff0c;\u4f46\u963b\u585e\u7684\u5bf9\u8c61\u4e0d\u518d\u662f\u5355\u4e2a\u6587\u4ef6\u63cf\u8ff0\u7b26&#xff0c;\u800c\u662f\u4e00\u7ec4\u6587\u4ef6\u63cf\u8ff0\u7b26&#xff0c;\u5f53\u5176\u4e2d\u4efb\u610f\u4e00\u4e2a\u6587\u4ef6\u63cf\u8ff0\u7b26\u7684\u6761\u4ef6\u5c31\u7eea\u65f6&#xff0c;\u8fdb\u7a0b\u5c31\u4f1a\u88ab\u5524\u9192\u3002<\/p>\n<p>\u7531\u4e8e\u4e00\u4e2a\u7ebf\u7a0b\u9700\u8981\u540c\u65f6\u7b49\u5f85\u4e00\u7ec4\u6587\u4ef6\u63cf\u8ff0\u7b26&#xff0c;\u56e0\u6b64\u5728\u8c03\u7528 select \u63a5\u53e3\u65f6&#xff0c;\u9700\u8981\u5411\u5185\u6838\u4f20\u9012\u4e00\u4e2a\u5f85\u68c0\u6d4b\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u96c6\u5408\u3002\u5728 select \u7684\u5b9e\u73b0\u4e2d&#xff0c;\u8fd9\u4e2a\u96c6\u5408\u662f\u901a\u8fc7**\u4f4d\u56fe&#xff08;bitmap&#xff09;**\u7ed3\u6784\u6765\u8868\u793a\u7684\u3002<\/p>\n<ul>\n<li>\u7cfb\u7edf\u8c03\u7528&#xff1a;select<\/li>\n<li>\u5934\u6587\u4ef6&#xff1a;&lt;sys\/select.h&gt;<\/li>\n<li>\u51fd\u6570\u58f0\u660e&#xff1a;int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);<\/li>\n<li>\u8fd4\u56de\u503c&#xff1a;\u8fd4\u56de\u503c\u5927\u4e8e 0 \u8868\u793a\u5c31\u7eea\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u6570\u91cf&#xff1b;\u8fd4\u56de\u503c\u7b49\u4e8e 0 \u8868\u793a\u5728\u6307\u5b9a\u8d85\u65f6\u65f6\u95f4\u5185\u6ca1\u6709\u4efb\u4f55\u6587\u4ef6\u63cf\u8ff0\u7b26\u5c31\u7eea&#xff1b;\u8fd4\u56de\u503c\u5c0f\u4e8e 0 \u8868\u793a\u53d1\u751f\u9519\u8bef&#xff0c;\u5e76\u4f1a\u8bbe\u7f6e errno\u3002<\/li>\n<\/ul>\n<p>\u8fd9\u91cc\u7684 fd_set \u7c7b\u578b\u672c\u8d28\u4e0a\u662f\u4e00\u4e2a\u7ed3\u6784\u4f53&#xff0c;\u5176\u5185\u90e8\u7ef4\u62a4\u4e86\u4e00\u4e2a\u4f4d\u56fe\u6570\u7ec4&#xff08;\u901a\u5e38\u662f long \u7c7b\u578b\u7684\u6570\u7ec4&#xff09;\u3002\u4f4d\u56fe\u4e2d\u7684\u6bcf\u4e00\u4e2a\u6bd4\u7279\u4f4d\u90fd\u5bf9\u5e94\u4e00\u4e2a\u7279\u5b9a\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u3002\u4f8b\u5982&#xff1a;<\/p>\n<ul>\n<li>\u6570\u7ec4\u7b2c\u4e00\u4e2a\u5143\u7d20\u7684\u7b2c\u4e00\u4e2a\u6bd4\u7279\u4f4d\u5bf9\u5e94 \u6587\u4ef6\u63cf\u8ff0\u7b26 0&#xff1b;<\/li>\n<li>\u7b2c\u4e00\u4e2a\u5143\u7d20\u7684\u7b2c\u4e09\u4e2a\u6bd4\u7279\u4f4d\u5bf9\u5e94 \u6587\u4ef6\u63cf\u8ff0\u7b26 2\u3002<\/li>\n<\/ul>\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\">__FD_SETSIZE<\/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\">struct<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">unsigned<\/span> <span class=\"token keyword\">long<\/span> fds_bits<span class=\"token punctuation\">[<\/span>__FD_SETSIZE <span class=\"token operator\">\/<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token number\">8<\/span> <span class=\"token operator\">*<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">unsigned<\/span> <span class=\"token keyword\">long<\/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 punctuation\">}<\/span> fd_set<span class=\"token punctuation\">;<\/span><\/p>\n<p>\u5f53\u67d0\u4e2a\u6bd4\u7279\u4f4d\u7684\u503c\u4e3a 1 \u65f6&#xff0c;\u8868\u793a\u9700\u8981\u68c0\u6d4b\u8be5\u6bd4\u7279\u4f4d\u5bf9\u5e94\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u662f\u5426\u6ee1\u8db3\u6307\u5b9a\u6761\u4ef6&#xff1b;\u5f53\u8be5\u6bd4\u7279\u4f4d\u4e3a 0 \u65f6&#xff0c;\u5219\u8868\u793a\u4e0d\u9700\u8981\u68c0\u6d4b\u5bf9\u5e94\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u3002<\/p>\n<p>\u7531\u4e8e\u5411\u5185\u6838\u4f20\u9012\u7684\u662f\u4e00\u4e2a\u4f4d\u56fe\u5f62\u5f0f\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u96c6\u5408&#xff0c;\u56e0\u6b64\u8be5\u4f4d\u56fe\u4e2d\u5e76\u4e0d\u4e00\u5b9a\u6240\u6709\u6bd4\u7279\u4f4d\u90fd\u4e3a 1\u3002\u5b9e\u9645\u4e0a&#xff0c;\u4f4d\u56fe\u4e2d\u65e2\u5305\u542b\u9700\u8981\u68c0\u6d4b\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26&#xff0c;\u4e5f\u5305\u542b\u4e0d\u9700\u8981\u68c0\u6d4b\u7684\u4f4d\u7f6e\u3002\u5bf9\u4e8e\u5185\u6838\u6765\u8bf4&#xff0c;\u5b83\u5fc5\u987b\u904d\u5386\u8fd9\u4e2a\u4f4d\u56fe&#xff0c;\u627e\u51fa\u503c\u4e3a 1 \u7684\u6bd4\u7279\u4f4d&#xff0c;\u5e76\u68c0\u67e5\u5bf9\u5e94\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u72b6\u6001\u3002\u56e0\u6b64&#xff0c;\u8fd9\u4e2a\u904d\u5386\u8fc7\u7a0b\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(N)\u3002<\/p>\n<p>\u800c\u5728\u904d\u5386\u8fc7\u7a0b\u4e2d&#xff0c;\u4e0d\u53ef\u907f\u514d\u5730\u4f1a\u51fa\u73b0\u65e0\u6548\u904d\u5386\u2014\u2014\u5373\u626b\u63cf\u5230\u90a3\u4e9b\u5e76\u672a\u88ab\u4f7f\u7528\u7684\u6bd4\u7279\u4f4d\u3002\u4e3a\u4e86\u51cf\u5c11\u8fd9\u79cd\u65e0\u6548\u904d\u5386&#xff0c;select \u7684\u7b2c\u4e00\u4e2a\u53c2\u6570 nfds \u5c31\u53d1\u6325\u4e86\u4f5c\u7528\u3002<\/p>\n<p>nfds \u8868\u793a**\u9700\u8981\u68c0\u6d4b\u7684\u6700\u5927\u6587\u4ef6\u63cf\u8ff0\u7b26\u503c\u52a0\u4e00 **\u3002\u6362\u53e5\u8bdd\u8bf4&#xff0c;\u5b83\u544a\u8bc9\u5185\u6838&#xff1a;\u4f4d\u56fe\u53ea\u9700\u8981\u904d\u5386\u5230\u8be5\u4f4d\u7f6e\u5373\u53ef&#xff0c;\u540e\u7eed\u90e8\u5206\u65e0\u9700\u626b\u63cf\u3002\u8fd9\u6837\u53ef\u4ee5\u5728\u4e00\u5b9a\u7a0b\u5ea6\u4e0a\u51cf\u5c11\u65e0\u6548\u904d\u5386&#xff0c;\u63d0\u9ad8\u68c0\u6d4b\u6548\u7387\u3002<\/p>\n<p>\u63a5\u4e0b\u6765\u9700\u8981\u8ba8\u8bba\u7684\u662f select \u7684\u7b2c\u4e8c\u4e2a\u548c\u7b2c\u4e09\u4e2a\u53c2\u6570&#xff0c;\u5373 readfds \u548c writefds\u3002\u5728\u4e0a\u6587\u4e2d\u6211\u4eec\u591a\u6b21\u63d0\u5230&#xff1a;\u7ebf\u7a0b\u9700\u8981\u68c0\u6d4b\u6587\u4ef6\u63cf\u8ff0\u7b26\u5bf9\u5e94\u7684\u6761\u4ef6\u662f\u5426\u5c31\u7eea\u3002\u7136\u800c\u8fd9\u91cc\u7684\u201c\u6761\u4ef6\u201d\u5e76\u4e0d\u662f\u5355\u4e00\u7684&#xff0c;\u5b83\u53d6\u51b3\u4e8e\u6587\u4ef6\u63cf\u8ff0\u7b26\u6240\u5173\u8054\u7684\u5177\u4f53\u5bf9\u8c61\u7c7b\u578b\u3002<\/p>\n<p>\u6211\u4eec\u77e5\u9053&#xff0c;\u4e00\u4e2a\u6587\u4ef6\u63cf\u8ff0\u7b26\u5728\u5185\u6838\u4e2d\u7684\u672c\u8d28\u8868\u793a\u662f\u4e00\u4e2a file \u7ed3\u6784\u4f53\u6307\u9488\u3002\u800c Linux \u7684\u8bbe\u8ba1\u54f2\u5b66\u662f \u201c\u4e00\u5207\u7686\u6587\u4ef6&#xff08;Everything is a file&#xff09;\u201d&#xff0c;\u56e0\u6b64\u5404\u79cd\u8d44\u6e90\u90fd\u4f1a\u901a\u8fc7\u6587\u4ef6\u5bf9\u8c61\u8fdb\u884c\u62bd\u8c61\u3002\u4f8b\u5982&#xff1a;<\/p>\n<ul>\n<li>\u78c1\u76d8\u6587\u4ef6&#xff1a;\u78c1\u76d8\u4e2d\u7684\u666e\u901a\u6587\u4ef6\u5728\u88ab\u8fdb\u7a0b\u6253\u5f00\u540e&#xff0c;\u4f1a\u5728\u5185\u6838\u4e2d\u521b\u5efa\u5bf9\u5e94\u7684 file \u7ed3\u6784\u4f53&#xff1b;<\/li>\n<li>\u5185\u5b58\u7ea7\u6587\u4ef6&#xff1a;\u4f8b\u5982\u533f\u540d\u7ba1\u9053&#xff08;pipe&#xff09;&#xff0c;\u867d\u7136\u672c\u8d28\u4e0a\u662f\u5185\u5b58\u7f13\u51b2\u533a&#xff0c;\u4f46\u540c\u6837\u901a\u8fc7 file \u7ed3\u6784\u4f53\u8fdb\u884c\u63cf\u8ff0&#xff1b;<\/li>\n<li>\u7f51\u7edc\u5957\u63a5\u5b57&#xff08;socket&#xff09;&#xff1a;\u7f51\u7edc\u901a\u4fe1\u5bf9\u8c61\u540c\u6837\u4f1a\u6620\u5c04\u4e3a\u4e00\u4e2a file \u7ed3\u6784\u4f53\u3002<\/li>\n<\/ul>\n<p>\u56e0\u6b64&#xff0c;file \u7ed3\u6784\u4f53\u65e2\u53ef\u4ee5\u8868\u793a\u78c1\u76d8\u7ea7\u6587\u4ef6&#xff0c;\u4e5f\u53ef\u4ee5\u8868\u793a\u5185\u5b58\u7ea7\u6587\u4ef6&#xff0c;\u8fd8\u53ef\u4ee5\u8868\u793a\u7f51\u7edc\u5957\u63a5\u5b57\u3002\u800c\u4e0d\u540c\u7c7b\u578b\u5bf9\u8c61\u7684\u5c31\u7eea\u6761\u4ef6\u81ea\u7136\u4e5f\u4e0d\u540c\u3002<\/p>\n<p>\u5728\u524d\u6587\u4e2d&#xff0c;\u6211\u4eec\u5df2\u7ecf\u6309\u7167\u6570\u636e\u6d41\u5411\u5c06 I\/O \u64cd\u4f5c\u5206\u4e3a\u4e24\u5927\u7c7b&#xff1a;<\/p>\n<ul>\n<li>\u8bfb\u64cd\u4f5c&#xff1a;\u6570\u636e\u4ece\u5185\u6838\u7a7a\u95f4\u6d41\u5411\u7528\u6237\u7a7a\u95f4<\/li>\n<li>\u5199\u64cd\u4f5c&#xff1a;\u6570\u636e\u4ece\u7528\u6237\u7a7a\u95f4\u6d41\u5411\u5185\u6838\u7a7a\u95f4<\/li>\n<\/ul>\n<p>\u63a5\u4e0b\u6765\u4ee5\u8bfb\u6761\u4ef6\u4e3a\u4f8b\u8fdb\u884c\u8bf4\u660e\u3002<\/p>\n<li>\u78c1\u76d8\u6587\u4ef6<\/li>\n<p>\u5bf9\u4e8e\u78c1\u76d8\u6587\u4ef6\u800c\u8a00&#xff0c;\u6587\u4ef6\u7531\u5c5e\u6027\u548c\u5185\u5bb9\u4e24\u90e8\u5206\u6784\u6210\u3002file \u7ed3\u6784\u4f53\u5185\u90e8\u7ef4\u62a4\u4e86\u4e00\u4e2a\u8bfb\u5199\u504f\u79fb\u91cf f_pos&#xff08;\u6ce8\u610f&#xff1a;\u8bfb\u548c\u5199\u5171\u7528\u540c\u4e00\u4e2a\u504f\u79fb\u91cf&#xff09;\u3002\u540c\u65f6&#xff0c;file \u7ed3\u6784\u4f53\u8fd8\u4f1a\u5173\u8054\u4e00\u4e2a inode \u7ed3\u6784\u4f53&#xff0c;\u7528\u4e8e\u8bb0\u5f55\u6587\u4ef6\u7684\u5143\u6570\u636e&#xff0c;\u5176\u4e2d\u5305\u62ec\u6587\u4ef6\u5185\u5bb9\u5927\u5c0f i_size\u3002<\/p>\n<p>\u56e0\u6b64&#xff0c;\u5bf9\u4e8e\u78c1\u76d8\u6587\u4ef6\u6765\u8bf4&#xff0c;\u8bfb\u6761\u4ef6\u662f\u5426\u5c31\u7eea\u53d6\u51b3\u4e8e&#xff1a;<\/p>\n<ul>\n<li>\u5f53\u524d\u8bfb\u504f\u79fb\u91cf f_pos \u662f\u5426\u5230\u8fbe\u6587\u4ef6\u672b\u5c3e i_size\u3002<\/li>\n<\/ul>\n<p>\u5982\u679c f_pos &lt; i_size&#xff0c;\u8bf4\u660e\u6587\u4ef6\u4e2d\u4ecd\u7136\u5b58\u5728\u672a\u8bfb\u53d6\u7684\u6570\u636e&#xff0c;\u6b64\u65f6\u8bfb\u6761\u4ef6\u662f\u5c31\u7eea\u7684&#xff1b;\u5982\u679c f_pos &#061;&#061; i_size&#xff0c;\u5219\u8bf4\u660e\u5df2\u7ecf\u8bfb\u53d6\u5230\u6587\u4ef6\u672b\u5c3e&#xff0c;\u8bfb\u6761\u4ef6\u4e0d\u518d\u5c31\u7eea\u3002<\/p>\n<li>\u7ba1\u9053&#xff08;Pipe&#xff09;<\/li>\n<p>\u5bf9\u4e8e\u5185\u5b58\u7ea7\u6587\u4ef6&#xff0c;\u4f8b\u5982\u533f\u540d\u7ba1\u9053&#xff0c;\u5176\u5185\u90e8\u5b9e\u73b0\u672c\u8d28\u4e0a\u662f\u4e00\u4e2a\u73af\u5f62\u7f13\u51b2\u533a\u3002\u7ba1\u9053\u5206\u4e3a\u8bfb\u7aef\u548c\u5199\u7aef&#xff1a;<\/p>\n<ul>\n<li>\u8bfb\u7aef\u5bf9\u5e94\u4e00\u4e2a file \u7ed3\u6784\u4f53<\/li>\n<li>\u5199\u7aef\u5bf9\u5e94\u53e6\u4e00\u4e2a file \u7ed3\u6784\u4f53<\/li>\n<\/ul>\n<p>\u4f46\u8fd9\u4e24\u4e2a file \u7ed3\u6784\u4f53\u90fd\u4f1a\u5173\u8054\u5230\u540c\u4e00\u4e2a\u7ba1\u9053\u5bf9\u8c61\u3002<\/p>\n<p>\u5728\u5185\u6838\u4e2d&#xff0c;file \u7ed3\u6784\u4f53\u4f1a\u901a\u8fc7\u6307\u9488\u5173\u8054\u4e00\u4e2a pipe_inode_info \u7ed3\u6784\u4f53&#xff0c;\u5176\u4e2d\u7ef4\u62a4\u4e24\u4e2a\u5173\u952e\u6307\u9488&#xff1a;<\/p>\n<ul>\n<li>head&#xff1a;\u8bfb\u6307\u9488<\/li>\n<li>tail&#xff1a;\u5199\u6307\u9488<\/li>\n<\/ul>\n<p>\u8bfb\u6761\u4ef6\u662f\u5426\u5c31\u7eea\u53d6\u51b3\u4e8e\u8fd9\u4e24\u4e2a\u6307\u9488\u662f\u5426\u91cd\u5408&#xff1a;<\/p>\n<ul>\n<li>\u5982\u679c head &#061;&#061; tail&#xff0c;\u8bf4\u660e\u7f13\u51b2\u533a\u4e3a\u7a7a&#xff0c;\u8bfb\u6761\u4ef6\u4e0d\u5c31\u7eea&#xff1b;<\/li>\n<li>\u5982\u679c head !&#061; tail&#xff0c;\u8bf4\u660e\u7f13\u51b2\u533a\u4e2d\u4ecd\u7136\u5b58\u5728\u6570\u636e&#xff0c;\u8bfb\u6761\u4ef6\u5c31\u7eea\u3002<\/li>\n<\/ul>\n<li>\u5957\u63a5\u5b57&#xff08;Socket&#xff09;<\/li>\n<p>\u5bf9\u4e8e\u5957\u63a5\u5b57\u800c\u8a00&#xff0c;file \u7ed3\u6784\u4f53\u4e2d\u7684 private_data \u5b57\u6bb5\u4f1a\u6307\u5411 socket \u7ed3\u6784\u4f53&#xff0c;\u800c socket \u7ed3\u6784\u4f53\u5185\u90e8\u53c8\u4f1a\u5173\u8054\u4e00\u4e2a\u6838\u5fc3\u7684 sock \u7ed3\u6784\u4f53&#xff0c;\u7528\u4e8e\u7ef4\u62a4&#xff1a;<\/p>\n<ul>\n<li>\u7f51\u7edc\u5c42\u548c\u4f20\u8f93\u5c42\u7684\u72b6\u6001\u4fe1\u606f<\/li>\n<li>\u63a5\u6536\u7f13\u51b2\u533a\u4e0e\u53d1\u9001\u7f13\u51b2\u533a<\/li>\n<\/ul>\n<p>\u56e0\u6b64&#xff0c;\u5bf9\u4e8e\u5957\u63a5\u5b57\u6765\u8bf4&#xff1a;<\/p>\n<ul>\n<li>\u8bfb\u6761\u4ef6\u5c31\u7eea&#xff1a;\u63a5\u6536\u7f13\u51b2\u533a\u4e0d\u4e3a\u7a7a<\/li>\n<li>\u5199\u6761\u4ef6\u5c31\u7eea&#xff1a;\u53d1\u9001\u7f13\u51b2\u533a\u672a\u6ee1<\/li>\n<\/ul>\n<p>\u5199\u6761\u4ef6\u7684\u5224\u65ad\u540c\u6837\u4f9d\u8d56\u4e8e\u5bf9\u8c61\u7c7b\u578b&#xff1a;<\/p>\n<ul>\n<li>\u78c1\u76d8\u6587\u4ef6&#xff1a;\u53ea\u8981\u53ef\u4ee5\u7ee7\u7eed\u5199\u5165&#xff08;\u4f8b\u5982\u5141\u8bb8\u6269\u5c55\u6587\u4ef6&#xff09;&#xff0c;\u5199\u6761\u4ef6\u901a\u5e38\u8ba4\u4e3a\u662f\u5c31\u7eea\u7684&#xff1b;<\/li>\n<li>\u7ba1\u9053&#xff1a;\u5f53 (tail &#043; 1) % size !&#061; head \u65f6&#xff0c;\u8bf4\u660e\u7f13\u51b2\u533a\u672a\u6ee1&#xff0c;\u53ef\u4ee5\u7ee7\u7eed\u5199\u5165&#xff1b;<\/li>\n<li>\u5957\u63a5\u5b57&#xff1a;\u5f53\u53d1\u9001\u7f13\u51b2\u533a\u672a\u6ee1\u65f6&#xff0c;\u5199\u6761\u4ef6\u5c31\u7eea\u3002<\/li>\n<\/ul>\n<p>\u56e0\u6b64&#xff0c;select \u7684\u7b2c\u4e8c\u4e2a\u548c\u7b2c\u4e09\u4e2a\u53c2\u6570\u5b9e\u9645\u4e0a\u5bf9\u5e94\u4e24\u7c7b\u6587\u4ef6\u63cf\u8ff0\u7b26\u96c6\u5408&#xff1a;<\/p>\n<ul>\n<li>readfds&#xff1a;\u9700\u8981\u68c0\u6d4b\u8bfb\u6761\u4ef6\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u96c6\u5408<\/li>\n<li>writefds&#xff1a;\u9700\u8981\u68c0\u6d4b\u5199\u6761\u4ef6\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u96c6\u5408<\/li>\n<\/ul>\n<p>\u5982\u679c readfds \u4e0d\u4e3a NULL \u800c writefds \u4e3a NULL&#xff0c;\u5219\u8868\u793a\u53ea\u68c0\u6d4b\u8fd9\u4e9b\u6587\u4ef6\u63cf\u8ff0\u7b26\u7684\u8bfb\u6761\u4ef6&#xff1b;\u53cd\u4e4b\u4ea6\u7136\u3002\u5982\u679c\u4e24\u8005\u90fd\u4e0d\u4e3a NULL&#xff0c;\u5219\u4e24\u79cd\u6761\u4ef6\u6784\u6210\u4e00\u79cd\u903b\u8f91\u6216\u5173\u7cfb&#xff1a;\u53ea\u8981\u67d0\u4e2a\u6587\u4ef6\u63cf\u8ff0\u7b26\u6ee1\u8db3\u8bfb\u6216\u5199\u6761\u4ef6\u4e2d\u7684\u4efb\u610f\u4e00\u4e2a&#xff0c;\u8fdb\u7a0b\u5c31\u4f1a\u88ab\u5524\u9192\u3002<\/p>\n<p>\u7b2c\u56db\u4e2a\u53c2\u6570 exceptfds \u8868\u793a\u5f02\u5e38\u6761\u4ef6\u96c6\u5408&#xff0c;\u4f8b\u5982\u5e26\u5916\u6570\u636e\u7b49\u60c5\u51b5\u3002\u4f46\u5728\u5b9e\u9645\u5f00\u53d1\u4e2d\u4f7f\u7528\u8f83\u5c11&#xff0c;\u901a\u5e38\u4f1a\u5c06\u5176\u8bbe\u7f6e\u4e3a NULL\u3002<\/p>\n<p>\u8bfb\u8005\u770b\u5230\u8fd9\u91cc&#xff0c;\u53ef\u80fd\u4f1a\u4ea7\u751f\u4e00\u4e2a\u7591\u95ee&#xff1a;<\/p>\n<p>\u65e2\u7136\u4e0d\u540c\u5bf9\u8c61\u7684\u8bfb\u6761\u4ef6\u5224\u65ad\u903b\u8f91\u4e0d\u540c&#xff0c;\u90a3\u4e48\u5728\u8c03\u7528 select \u65f6&#xff0c;\u6211\u4eec\u4ec5\u4ec5\u4f20\u9012\u4e86\u4e00\u4e2a \u8bfb\u96c6\u5408&#xff0c;\u5e76\u6ca1\u6709\u544a\u8bc9\u5185\u6838\u8be5\u6587\u4ef6\u63cf\u8ff0\u7b26\u5177\u4f53\u5c5e\u4e8e\u54ea\u79cd\u5bf9\u8c61\u3002\u90a3\u4e48\u5185\u6838\u5728\u68c0\u6d4b\u8fd9\u4e9b\u6587\u4ef6\u63cf\u8ff0\u7b26\u65f6&#xff0c;\u662f\u5426\u8fd8\u9700\u8981\u901a\u8fc7\u5927\u91cf if-else \u6765\u5224\u65ad\u5bf9\u8c61\u7c7b\u578b&#xff1f;<\/p>\n<p>\u5b9e\u9645\u4e0a\u5e76\u4e0d\u9700\u8981\u3002\u56e0\u4e3a file \u7ed3\u6784\u4f53\u5185\u90e8\u7ef4\u62a4\u4e86\u4e00\u4e2a\u6587\u4ef6\u64cd\u4f5c\u51fd\u6570\u8868 f_op&#xff08;\u5373 file_operations \u7ed3\u6784\u4f53&#xff09;&#xff0c;\u5b83\u672c\u8d28\u4e0a\u662f\u4e00\u7ec4\u51fd\u6570\u6307\u9488\u3002\u5176\u4e2d\u5c31\u5305\u542b\u4e00\u4e2a poll \u65b9\u6cd5\u3002<\/p>\n<p>\u5728\u521b\u5efa file \u7ed3\u6784\u4f53\u65f6&#xff0c;\u5185\u6838\u4f1a\u6839\u636e\u8be5\u6587\u4ef6\u5bf9\u8c61\u7684\u5177\u4f53\u7c7b\u578b&#xff08;\u78c1\u76d8\u6587\u4ef6\u3001\u7ba1\u9053\u3001socket \u7b49&#xff09;&#xff0c;\u4e3a f_op \u586b\u5145\u4e0d\u540c\u7684\u51fd\u6570\u5b9e\u73b0\u3002\u56e0\u6b64&#xff0c;\u5728 select \u6267\u884c\u68c0\u6d4b\u65f6&#xff0c;\u5185\u6838\u53ea\u9700\u8981\u7edf\u4e00\u8c03\u7528 file-&gt;f_op-&gt;poll()&#xff0c;\u800c\u5177\u4f53\u7684\u5c31\u7eea\u6761\u4ef6\u5224\u65ad\u903b\u8f91\u5219\u7531\u5404\u4e2a\u5bf9\u8c61\u7c7b\u578b\u5bf9\u5e94\u7684 poll \u5b9e\u73b0\u5b8c\u6210\u3002<\/p>\n<p>\u8fd9\u79cd\u8bbe\u8ba1\u672c\u8d28\u4e0a\u4f53\u73b0\u4e86\u4e00\u79cd\u9762\u5411\u5bf9\u8c61\u4e2d\u7684\u591a\u6001\u601d\u60f3&#xff1a;<\/p>\n<ul>\n<li>\u8c03\u7528\u63a5\u53e3\u662f\u7edf\u4e00\u7684<\/li>\n<li>\u5b9e\u9645\u6267\u884c\u903b\u8f91\u7531\u5bf9\u8c61\u7c7b\u578b\u51b3\u5b9a<\/li>\n<\/ul>\n<p>\u56e0\u6b64&#xff0c;\u5185\u6838\u65e0\u9700\u663e\u5f0f\u5224\u65ad\u6587\u4ef6\u7c7b\u578b&#xff0c;\u53ea\u9700\u8c03\u7528\u7edf\u4e00\u63a5\u53e3\u5373\u53ef\u5b8c\u6210\u4e0d\u540c\u5bf9\u8c61\u7684\u5c31\u7eea\u72b6\u6001\u68c0\u6d4b\u3002<\/p>\n<p>\u800c\u8fd9\u91cc\u9700\u8981\u989d\u5916\u8865\u5145\u4e00\u70b9&#xff1a;\u5bf9\u4e8e\u5957\u63a5\u5b57\u800c\u8a00&#xff0c;\u6211\u4eec\u4e4b\u524d\u63d0\u5230\u8bfb\u6761\u4ef6\u5c31\u7eea\u901a\u5e38\u610f\u5473\u7740\u63a5\u6536\u7f13\u51b2\u533a\u4e0d\u4e3a\u7a7a\u3002\u7136\u800c\u5bf9\u4e8e TCP \u5957\u63a5\u5b57 \u6765\u8bf4&#xff0c;\u9700\u8981\u8fdb\u4e00\u6b65\u533a\u5206 \u76d1\u542c\u5957\u63a5\u5b57&#xff08;listening socket&#xff09; \u4e0e \u5df2\u8fde\u63a5\u5957\u63a5\u5b57&#xff08;connected socket&#xff09;\u3002<\/p>\n<p>\u867d\u7136\u8fd9\u4e24\u7c7b\u5957\u63a5\u5b57\u5728\u5185\u6838\u4e2d\u7684\u7ed3\u6784\u4f53\u7cfb\u662f\u76f8\u540c\u7684&#xff0c;\u5747\u5c5e\u4e8e\u540c\u4e00\u6761\u7ee7\u627f\u94fe&#xff1a;\u6700\u9876\u5c42\u662f\u5305\u542b\u53d1\u9001\u7f13\u51b2\u533a\u548c\u63a5\u6536\u7f13\u51b2\u533a\u7684 sock \u7ed3\u6784\u4f53&#xff0c;\u7136\u540e\u5728\u5176\u57fa\u7840\u4e0a\u6269\u5c55\u4e3a inet_sock \u7ed3\u6784\u4f53&#xff0c;\u968f\u540e\u662f inet_connection_sock \u7ed3\u6784\u4f53&#xff0c;\u6700\u7ec8\u5177\u4f53\u5b9e\u73b0\u4e3a tcp_sock\u3002\u4e5f\u5c31\u662f\u8bf4&#xff0c;\u4ece\u6570\u636e\u7ed3\u6784\u89d2\u5ea6\u6765\u770b&#xff0c;\u5b83\u4eec\u5171\u4eab\u540c\u4e00\u5957 TCP \u5957\u63a5\u5b57\u5bf9\u8c61\u6a21\u578b\u3002<\/p>\n<p>\u4f46\u662f&#xff0c;\u76d1\u542c\u5957\u63a5\u5b57\u4e0e\u5df2\u8fde\u63a5\u5957\u63a5\u5b57\u5728\u804c\u8d23\u4e0a\u662f\u5b8c\u5168\u4e0d\u540c\u7684&#xff0c;\u56e0\u6b64\u5b83\u4eec\u5728\u5b9e\u9645\u8fd0\u884c\u65f6\u8bbf\u95ee sock \u4f53\u7cfb\u7ed3\u6784\u4e2d\u7684\u4e0d\u540c\u90e8\u5206&#xff1a;<\/p>\n<ul>\n<li>\u5df2\u8fde\u63a5\u5957\u63a5\u5b57&#xff1a;\u4e3b\u8981\u7528\u4e8e\u8fdb\u884c\u5b9e\u9645\u7684\u6570\u636e\u6536\u53d1&#xff0c;\u56e0\u6b64\u4f1a\u8bbf\u95ee sock \u7ed3\u6784\u4f53\u4e2d\u7684\u53d1\u9001\u7f13\u51b2\u533a\u548c\u63a5\u6536\u7f13\u51b2\u533a\u3002<\/li>\n<li>\u76d1\u542c\u5957\u63a5\u5b57&#xff1a;\u5176\u804c\u8d23\u4ec5\u4ec5\u662f\u63a5\u6536\u65b0\u7684 TCP \u8fde\u63a5\u8bf7\u6c42&#xff0c;\u5e76\u4e0d\u4f1a\u53c2\u4e0e\u5177\u4f53\u7684\u6570\u636e\u6536\u53d1\u3002\u56e0\u6b64\u5b83\u5e76\u4e0d\u4f1a\u4f7f\u7528 sock \u4e2d\u7684\u53d1\u9001\u7f13\u51b2\u533a\u548c\u63a5\u6536\u7f13\u51b2\u533a&#xff0c;\u800c\u662f\u4e3b\u8981\u8bbf\u95ee inet_connection_sock \u4e2d\u7ef4\u62a4\u7684 \u534a\u8fde\u63a5\u961f\u5217&#xff08;SYN queue&#xff09; \u548c \u5168\u8fde\u63a5\u961f\u5217&#xff08;accept queue&#xff09;\u3002<\/li>\n<\/ul>\n<p>\u56e0\u6b64&#xff0c;\u8fd9\u91cc\u9700\u8981\u7279\u522b\u6ce8\u610f&#xff1a;\u76d1\u542c\u5957\u63a5\u5b57\u4e0e\u5df2\u8fde\u63a5\u5957\u63a5\u5b57\u7684\u8bfb\u5c31\u7eea\u6761\u4ef6\u662f\u4e0d\u540c\u7684\u3002<\/p>\n<p>\u5bf9\u4e8e \u5df2\u8fde\u63a5\u5957\u63a5\u5b57 \u800c\u8a00&#xff0c;\u8bfb\u6761\u4ef6\u5c31\u7eea\u901a\u5e38\u610f\u5473\u7740\u63a5\u6536\u7f13\u51b2\u533a\u4e2d\u5b58\u5728\u53ef\u8bfb\u6570\u636e\u3002<\/p>\n<p>\u800c\u5bf9\u4e8e \u76d1\u542c\u5957\u63a5\u5b57 \u800c\u8a00&#xff0c;\u5176\u8bfb\u6761\u4ef6\u5e76\u4e0d\u662f\u63a5\u6536\u7f13\u51b2\u533a\u4e0d\u4e3a\u7a7a&#xff0c;\u56e0\u4e3a\u76d1\u542c\u5957\u63a5\u5b57\u6839\u672c\u4e0d\u4f1a\u8fdb\u884c\u6570\u636e\u63a5\u6536\u64cd\u4f5c\u3002\u76d1\u542c\u5957\u63a5\u5b57\u7684\u804c\u8d23\u4ec5\u4ec5\u662f\u63a5\u6536\u65b0\u8fde\u63a5&#xff0c;\u56e0\u6b64\u5b83\u7684\u8bfb\u6761\u4ef6\u5c31\u7eea\u5b9e\u9645\u4e0a\u662f&#xff1a;<\/p>\n<p>\u5168\u8fde\u63a5\u961f\u5217&#xff08;accept queue&#xff09;\u4e0d\u4e3a\u7a7a\u3002<\/p>\n<p>\u4e00\u65e6\u6709\u65b0\u7684 TCP \u8fde\u63a5\u5b8c\u6210\u4e09\u6b21\u63e1\u624b\u5e76\u8fdb\u5165\u5168\u8fde\u63a5\u961f\u5217&#xff0c;\u5185\u6838\u5c31\u4f1a\u5224\u5b9a\u8be5\u76d1\u542c\u5957\u63a5\u5b57\u8bfb\u5c31\u7eea\u3002<\/p>\n<hr \/>\n<p>\u6240\u4ee5\u8fd9\u91cc\u5bf9\u4e8e\u670d\u52a1\u7aef\u6765\u8bf4&#xff0c;\u5176\u521d\u59cb\u72b6\u6001\u901a\u5e38\u662f&#xff1a;\u521b\u5efa\u4e00\u4e2a\u76d1\u542c\u5957\u63a5\u5b57&#xff0c;\u7136\u540e\u4e3b\u7ebf\u7a0b\u5c06\u8be5\u76d1\u542c\u5957\u63a5\u5b57\u52a0\u5165 select \u9700\u8981\u68c0\u6d4b\u7684\u8bfb\u96c6\u5408\u4e2d\u3002<\/p>\n<p>\u5f53\u4e3b\u7ebf\u7a0b\u56e0\u4e3a select \u88ab\u5524\u9192&#xff0c;\u5e76\u68c0\u6d4b\u5230\u76d1\u542c\u5957\u63a5\u5b57\u5904\u4e8e\u8bfb\u5c31\u7eea\u72b6\u6001\u65f6&#xff0c;\u8bf4\u660e\u5f53\u524d\u5168\u8fde\u63a5\u961f\u5217\u4e2d\u5b58\u5728\u5df2\u7ecf\u5b8c\u6210\u4e09\u6b21\u63e1\u624b\u7684\u8fde\u63a5\u3002\u6b64\u65f6\u670d\u52a1\u7aef\u4f1a\u8c03\u7528 accept&#xff0c;\u4ece\u5168\u8fde\u63a5\u961f\u5217\u4e2d\u53d6\u51fa\u4e00\u4e2a\u8fde\u63a5&#xff0c;\u5e76\u83b7\u5f97\u5bf9\u5e94\u7684\u5df2\u8fde\u63a5\u5957\u63a5\u5b57\u6587\u4ef6\u63cf\u8ff0\u7b26\u3002\u968f\u540e\u518d\u5c06\u8be5\u6587\u4ef6\u63cf\u8ff0\u7b26\u52a0\u5165\u5230\u8bfb\u96c6\u5408\u4e2d&#xff0c;\u7528\u4e8e\u68c0\u6d4b\u8be5\u8fde\u63a5\u4e0a\u662f\u5426\u5b58\u5728\u53ef\u8bfb\u6570\u636e\u3002<\/p>\n<hr \/>\n<p>\u800c select \u7684\u6700\u540e\u4e00\u4e2a\u53c2\u6570\u662f\u4e00\u4e2a timeval \u7ed3\u6784\u4f53&#xff0c;\u7528\u4e8e\u6307\u5b9a\u8d85\u65f6\u65f6\u95f4\u3002\u8be5\u7ed3\u6784\u4f53\u5305\u542b\u4e24\u4e2a\u5b57\u6bb5&#xff0c;\u5206\u522b\u8868\u793a\u79d2\u548c\u5fae\u79d2&#xff1a;<\/p>\n<p><span class=\"token comment\">\/* timeval \u7ed3\u6784\u5b9a\u4e49 *\/<\/span><br \/>\n<span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">timeval<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">long<\/span> tv_sec<span class=\"token punctuation\">;<\/span>   <span class=\"token comment\">\/* \u79d2 *\/<\/span><br \/>\n    <span class=\"token keyword\">long<\/span> tv_usec<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/* \u5fae\u79d2 *\/<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>timeval \u7ed3\u6784\u4f53\u7684\u4f5c\u7528\u662f\u4e3a select \u6307\u5b9a\u4e00\u4e2a\u6700\u5927\u7b49\u5f85\u65f6\u95f4\u3002\u5f53 select \u88ab\u8c03\u7528\u540e&#xff0c;\u5185\u6838\u4f1a\u4e3a\u5176\u8bbe\u7f6e\u4e00\u4e2a\u5b9a\u65f6\u5668\u3002\u5982\u679c\u5728\u8be5\u65f6\u95f4\u5185\u6ca1\u6709\u4efb\u4f55\u6587\u4ef6\u63cf\u8ff0\u7b26\u5c31\u7eea&#xff0c;\u4e00\u65e6\u5b9a\u65f6\u5668\u5230\u671f&#xff0c;\u5185\u6838\u4e5f\u4f1a\u5524\u9192\u56e0\u8c03\u7528 select \u800c\u963b\u585e\u7684\u8fdb\u7a0b\u3002<\/p>\n<p>\u4ece\u884c\u4e3a\u4e0a\u6765\u770b&#xff0c;\u8fd9\u76f8\u5f53\u4e8e\u8ba9 select \u5177\u5907\u8d85\u65f6\u8fd4\u56de\u673a\u5236&#xff0c;\u4ece\u800c\u907f\u514d\u65e0\u9650\u671f\u963b\u585e\u3002<\/p>\n<p>\u4e0d\u8fc7\u5728\u5f88\u591a\u5178\u578b\u7684\u670d\u52a1\u5668\u8bbe\u8ba1\u4e2d&#xff0c;select \u901a\u5e38\u7531\u4e3b\u7ebf\u7a0b\u8c03\u7528&#xff0c;\u800c\u4e3b\u7ebf\u7a0b\u7684\u4e3b\u8981\u804c\u8d23\u5f80\u5f80\u53ea\u662f\u8d1f\u8d23\u76d1\u542c\u65b0\u8fde\u63a5\u5e76\u5206\u53d1\u4efb\u52a1\u3002\u56e0\u6b64\u5373\u4f7f\u56e0\u4e3a\u8d85\u65f6\u800c\u88ab\u5524\u9192&#xff0c;\u4e3b\u7ebf\u7a0b\u5f80\u5f80\u4e5f\u6ca1\u6709\u5176\u4ed6\u5b9e\u9645\u5de5\u4f5c\u9700\u8981\u6267\u884c&#xff0c;\u6240\u4ee5\u8fd9\u79cd\u8d85\u65f6\u673a\u5236\u5728\u5f88\u591a\u573a\u666f\u4e0b\u610f\u4e49\u5e76\u4e0d\u7279\u522b\u5927\u3002\u76f8\u6bd4\u4e4b\u4e0b&#xff0c;\u540e\u6587\u5c06\u8981\u4ecb\u7ecd\u7684 poll \u5728\u67d0\u4e9b\u8bbe\u8ba1\u6a21\u5f0f\u4e0b\u4f1a\u66f4\u6709\u5e2e\u52a9\u3002<\/p>\n<hr \/>\n<p>\u6b64\u5916&#xff0c;\u5bf9\u4e8e select \u7684\u7b2c\u4e8c\u3001\u7b2c\u4e09\u3001\u7b2c\u56db\u4e2a\u53c2\u6570&#xff0c;\u4e5f\u5c31\u662f\u8bfb\u96c6\u5408\u3001\u5199\u96c6\u5408\u4ee5\u53ca\u5f02\u5e38\u96c6\u5408&#xff0c;\u4ee5\u53ca\u6700\u540e\u7684 timeout \u53c2\u6570&#xff0c;\u90fd\u5c5e\u4e8e\u8f93\u5165\u8f93\u51fa\u578b\u53c2\u6570&#xff08;in\/out parameter&#xff09;\u3002<\/p>\n<p>\u5728\u8c03\u7528 select \u65f6&#xff1a;<\/p>\n<ul>\n<li>\u8fdb\u7a0b\u9996\u5148\u5c06\u9700\u8981\u68c0\u6d4b\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u52a0\u5165\u5230\u8bfb\u96c6\u5408\u3001\u5199\u96c6\u5408\u6216\u5f02\u5e38\u96c6\u5408\u4e2d&#xff0c;\u6b64\u65f6\u8fd9\u4e9b\u96c6\u5408\u5c5e\u4e8e\u8f93\u5165\u53c2\u6570\u3002<\/li>\n<li>\u5185\u6838\u968f\u540e\u4f1a\u904d\u5386\u8fd9\u4e9b\u96c6\u5408\u5bf9\u5e94\u7684\u4f4d\u56fe&#xff08;bitmap&#xff09;&#xff0c;\u68c0\u67e5\u54ea\u4e9b\u6bd4\u7279\u4f4d\u4e3a 1&#xff0c;\u5e76\u5bf9\u5bf9\u5e94\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u9010\u4e2a\u68c0\u6d4b\u5176\u72b6\u6001\u662f\u5426\u6ee1\u8db3\u5c31\u7eea\u6761\u4ef6\u3002<\/li>\n<\/ul>\n<p>\u5f53\u904d\u5386\u68c0\u6d4b\u7ed3\u675f\u540e&#xff0c;\u5185\u6838\u8fd8\u9700\u8981\u628a\u68c0\u6d4b\u7ed3\u679c\u8fd4\u56de\u7ed9\u7528\u6237\u6001\u3002\u4e3a\u6b64&#xff0c;\u5185\u6838\u4f1a\u76f4\u63a5\u4fee\u6539\u8fdb\u7a0b\u4f20\u5165\u7684\u4f4d\u56fe\u7ed3\u6784&#xff0c;\u5c06\u5176\u8986\u76d6\u4e3a\u65b0\u7684\u7ed3\u679c\u96c6\u5408&#xff1a;<\/p>\n<ul>\n<li>\u82e5\u67d0\u4e2a\u6bd4\u7279\u4f4d\u4ecd\u4e3a 1&#xff0c;\u8868\u793a\u8be5\u6587\u4ef6\u63cf\u8ff0\u7b26\u5df2\u7ecf\u5c31\u7eea&#xff1b;<\/li>\n<li>\u82e5\u88ab\u6e05\u96f6&#xff0c;\u5219\u8868\u793a\u8be5\u6587\u4ef6\u63cf\u8ff0\u7b26\u5f53\u524d\u672a\u5c31\u7eea\u3002<\/li>\n<\/ul>\n<p>\u56e0\u6b64&#xff0c;\u5728 select \u8fd4\u56de\u4e4b\u540e&#xff0c;\u5e94\u7528\u7a0b\u5e8f\u4ecd\u7136\u9700\u8981\u518d\u6b21\u904d\u5386\u8fd9\u4e9b\u4f4d\u56fe&#xff0c;\u67e5\u627e\u54ea\u4e9b\u4f4d\u7f6e\u4e3a 1&#xff0c;\u4ece\u800c\u786e\u5b9a\u7a76\u7adf\u662f\u54ea\u4e9b\u6587\u4ef6\u63cf\u8ff0\u7b26\u5df2\u7ecf\u5c31\u7eea\u3002<\/p>\n<hr \/>\n<p>timeout \u540c\u6837\u4e5f\u662f\u4e00\u4e2a\u8f93\u5165\u8f93\u51fa\u578b\u53c2\u6570\u3002\u5f53 select \u8fd4\u56de\u65f6&#xff0c;\u5185\u6838\u4f1a\u5c06 timeout \u4fee\u6539\u4e3a\u5269\u4f59\u5c1a\u672a\u6d88\u8017\u7684\u65f6\u95f4\u3002\u56e0\u6b64\u5728\u5faa\u73af\u4e2d\u53cd\u590d\u8c03\u7528 select \u65f6&#xff0c;\u5fc5\u987b\u5728\u6bcf\u6b21\u8c03\u7528\u4e4b\u524d\u91cd\u65b0\u8bbe\u7f6e timeout\u3002<\/p>\n<p>\u8fd9\u4e00\u70b9\u4e0e \u6bcf\u6b21\u8c03\u7528 select \u524d\u9700\u8981\u91cd\u65b0\u6784\u9020\u6587\u4ef6\u63cf\u8ff0\u7b26\u96c6\u5408 \u7684\u539f\u56e0\u662f\u5b8c\u5168\u4e00\u81f4\u7684\u2014\u2014\u56e0\u4e3a\u8fd9\u4e9b\u53c2\u6570\u5728\u8fd4\u56de\u65f6\u90fd\u5df2\u7ecf\u88ab\u5185\u6838\u4fee\u6539\u8fc7\u3002<\/p>\n<p>\u90a3\u4e48\u5728\u8ba4\u8bc6\u4e86 select \u7cfb\u7edf\u8c03\u7528\u4e4b\u540e&#xff0c;\u5728\u8c03\u7528 select \u63a5\u53e3\u4e4b\u524d&#xff0c;\u9996\u5148\u9700\u8981\u7531\u7528\u6237\u6001\u51c6\u5907\u4e00\u4e2a\u8bfb\u96c6\u5408\u6216\u8005\u5199\u96c6\u5408\u6240\u5bf9\u5e94\u7684\u4f4d\u56fe\u6570\u7ec4\u3002\u8be5\u4f4d\u56fe\u6570\u7ec4\u7528\u4e8e\u6807\u8bc6\u5f53\u524d\u9700\u8981\u88ab\u5185\u6838\u68c0\u6d4b\u72b6\u6001\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u96c6\u5408\u3002<\/p>\n<p>\u4f4d\u56fe\u6570\u7ec4\u9700\u8981\u8fdb\u884c\u521d\u59cb\u5316\u3002\u5bf9\u6b64&#xff0c;Linux \u5185\u6838\u5df2\u7ecf\u4e3a\u6211\u4eec\u63d0\u4f9b\u4e86\u76f8\u5e94\u7684\u8f85\u52a9\u63a5\u53e3&#xff0c;\u56e0\u6b64\u65e0\u9700\u81ea\u884c\u5b9e\u73b0\u76f8\u5173\u903b\u8f91\u3002\u901a\u5e38\u6211\u4eec\u4f1a\u521b\u5efa\u4e00\u4e2a fd_set \u7c7b\u578b\u7684\u6808\u5bf9\u8c61&#xff0c;\u800c\u7531\u4e8e\u6808\u5185\u5b58\u4e2d\u7684\u5185\u5bb9\u5728\u521d\u59cb\u5316\u65f6\u53ef\u80fd\u662f\u968f\u673a\u503c&#xff0c;\u56e0\u6b64\u5fc5\u987b\u9996\u5148\u5c06\u8be5\u5bf9\u8c61\u4e2d\u7684\u6240\u6709\u6bd4\u7279\u4f4d\u521d\u59cb\u5316\u4e3a 0\u3002\u4e5f\u5c31\u662f\u8bf4&#xff0c;\u9700\u8981\u5c06\u4f4d\u56fe\u6570\u7ec4\u6e05\u7a7a&#xff0c;\u6b64\u65f6\u5c31\u9700\u8981\u8c03\u7528 FD_ZERO \u63a5\u53e3\u3002<\/p>\n<p><span class=\"token keyword\">void<\/span> <span class=\"token function\">FD_ZERO<\/span><span class=\"token punctuation\">(<\/span>fd_set <span class=\"token operator\">*<\/span>set<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u4f7f\u7528\u793a\u4f8b<\/span><br \/>\nfd_set readfds<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token function\">FD_ZERO<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>readfds<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u5c06\u6240\u6709\u4f4d\u6e05\u96f6<\/span><\/p>\n<p>\u5728\u5b8c\u6210\u6e05\u96f6\u64cd\u4f5c\u4e4b\u540e&#xff0c;\u63a5\u4e0b\u6765\u5c31\u9700\u8981\u5bf9\u4f4d\u56fe\u6570\u7ec4\u8fdb\u884c\u8bbe\u7f6e\u3002\u7531\u4e8e\u4f4d\u56fe\u6570\u7ec4\u4e2d\u7684\u6bcf\u4e00\u4e2a\u6bd4\u7279\u4f4d\u90fd\u5bf9\u5e94\u4e00\u4e2a\u7279\u5b9a\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26&#xff0c;\u56e0\u6b64\u6211\u4eec\u9700\u8981\u5c06\u9700\u8981\u68c0\u6d4b\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u5728\u4f4d\u56fe\u6570\u7ec4\u4e2d\u7684\u5bf9\u5e94\u6bd4\u7279\u4f4d\u8bbe\u7f6e\u4e3a 1\u3002\u6b64\u65f6\u5c31\u9700\u8981\u4f7f\u7528 FD_SET \u51fd\u6570\u6765\u5b8c\u6210\u8be5\u64cd\u4f5c\u3002<\/p>\n<p>\u8be5\u51fd\u6570\u63a5\u6536\u4e24\u4e2a\u53c2\u6570&#xff1a;\u4e00\u4e2a\u662f\u6587\u4ef6\u63cf\u8ff0\u7b26 fd&#xff0c;\u53e6\u4e00\u4e2a\u662f\u4f4d\u56fe\u6570\u7ec4 fd_set\u3002\u5176\u5e95\u5c42\u5b9e\u73b0\u672c\u8d28\u4e0a\u662f\u901a\u8fc7\u4f4d\u8fd0\u7b97&#xff0c;\u6839\u636e\u4f20\u5165\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u7f16\u53f7\u8ba1\u7b97\u5bf9\u5e94\u7684\u6bd4\u7279\u4f4d\u4f4d\u7f6e&#xff0c;\u5e76\u5c06\u8be5\u6bd4\u7279\u4f4d\u7f6e\u4e3a 1\u3002\u56e0\u6b64\u8fd9\u91cc\u7684\u7b2c\u4e8c\u4e2a\u53c2\u6570&#xff08;\u4f4d\u56fe\u6570\u7ec4&#xff09;\u5c5e\u4e8e\u8f93\u51fa\u578b\u53c2\u6570\u3002<\/p>\n<p><span class=\"token keyword\">void<\/span> <span class=\"token function\">FD_SET<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> fd<span class=\"token punctuation\">,<\/span> fd_set <span class=\"token operator\">*<\/span>set<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u4f7f\u7528\u793a\u4f8b<\/span><br \/>\n<span class=\"token function\">FD_SET<\/span><span class=\"token punctuation\">(<\/span>sockfd<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>readfds<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>   <span class=\"token comment\">\/\/ \u5c06sockfd\u5bf9\u5e94\u7684\u4f4d\u8bbe\u4e3a1<\/span><\/p>\n<p>\u800c\u4e0a\u8ff0\u4e24\u4e2a\u63a5\u53e3&#xff0c;\u5373 FD_ZERO \u548c FD_SET&#xff0c;\u4e3b\u8981\u662f\u5728\u8c03\u7528 select \u4e4b\u524d\u4f7f\u7528&#xff0c;\u7528\u4e8e\u5c06\u4f4d\u56fe\u6570\u7ec4\u4f5c\u4e3a\u8f93\u5165\u53c2\u6570\u4f20\u9012\u7ed9\u5185\u6838&#xff0c;\u4ece\u800c\u544a\u77e5\u5185\u6838\u9700\u8981\u68c0\u6d4b\u54ea\u4e9b\u6587\u4ef6\u63cf\u8ff0\u7b26\u7684\u4e8b\u4ef6\u72b6\u6001\u3002<\/p>\n<p>\u9700\u8981\u6ce8\u610f\u7684\u662f&#xff0c;\u5728 select \u63a5\u53e3\u7684\u53c2\u6570\u4e2d&#xff0c;\u9664\u4e86\u7b2c\u4e00\u4e2a\u53c2\u6570 nfds \u4e4b\u5916&#xff0c;\u5176\u4f59\u53c2\u6570\u5747\u5c5e\u4e8e\u8f93\u5165\u8f93\u51fa\u578b\u53c2\u6570\u3002\u4e5f\u5c31\u662f\u8bf4&#xff0c;\u5f53\u8fdb\u7a0b\u88ab\u5524\u9192\u4e4b\u540e&#xff0c;\u5185\u6838\u4f1a\u76f4\u63a5\u4fee\u6539\u7528\u6237\u4f20\u5165\u7684\u4f4d\u56fe\u6570\u7ec4&#xff0c;\u4ec5\u4fdd\u7559\u90a3\u4e9b\u5df2\u7ecf\u5c31\u7eea\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u3002\u56e0\u6b64&#xff0c;\u5728 select \u8fd4\u56de\u4e4b\u540e&#xff0c;\u7528\u6237\u6001\u9700\u8981\u91cd\u65b0\u904d\u5386\u4e4b\u524d\u4f20\u5165\u7684\u4f4d\u56fe\u6570\u7ec4&#xff0c;\u4ee5\u786e\u5b9a\u54ea\u4e9b\u6587\u4ef6\u63cf\u8ff0\u7b26\u5df2\u7ecf\u5c31\u7eea\u3002<\/p>\n<p>\u4e3a\u6b64&#xff0c;Linux \u63d0\u4f9b\u4e86 FD_ISSET \u63a5\u53e3\u7528\u4e8e\u68c0\u6d4b\u67d0\u4e2a\u6587\u4ef6\u63cf\u8ff0\u7b26\u662f\u5426\u4ecd\u7136\u5728\u96c6\u5408\u4e2d\u3002\u8be5\u51fd\u6570\u540c\u6837\u63a5\u6536\u4e24\u4e2a\u53c2\u6570&#xff1a;\u6587\u4ef6\u63cf\u8ff0\u7b26 fd \u4ee5\u53ca\u4f4d\u56fe\u6570\u7ec4 fd_set\u3002\u5176\u5e95\u5c42\u5b9e\u73b0\u4f9d\u7136\u662f\u901a\u8fc7\u4f4d\u8fd0\u7b97&#xff0c;\u6839\u636e\u6587\u4ef6\u63cf\u8ff0\u7b26\u7f16\u53f7\u5b9a\u4f4d\u5230\u5bf9\u5e94\u7684\u6bd4\u7279\u4f4d&#xff0c;\u7136\u540e\u68c0\u6d4b\u8be5\u6bd4\u7279\u4f4d\u662f\u5426\u4e3a 1\u3002\u82e5\u7ed3\u679c\u4e3a\u975e\u96f6&#xff0c;\u5219\u8bf4\u660e\u8be5\u6587\u4ef6\u63cf\u8ff0\u7b26\u5904\u4e8e\u96c6\u5408\u4e2d&#xff08;\u5373\u8be5\u4e8b\u4ef6\u5c31\u7eea&#xff09;&#xff0c;\u5426\u5219\u8fd4\u56de 0\u3002<\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">FD_ISSET<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> fd<span class=\"token punctuation\">,<\/span> fd_set <span class=\"token operator\">*<\/span>set<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u8fd4\u56de\u503c&#xff1a;\u5982\u679cfd\u5728\u96c6\u5408\u4e2d\u8fd4\u56de\u975e0&#xff0c;\u5426\u5219\u8fd4\u56de0<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u4f7f\u7528\u793a\u4f8b<\/span><br \/>\n<span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">FD_ISSET<\/span><span class=\"token punctuation\">(<\/span>sockfd<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>readfds<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ sockfd\u53ef\u8bfb<\/span><br \/>\n    <span class=\"token function\">recv<\/span><span class=\"token punctuation\">(<\/span>sockfd<span class=\"token punctuation\">,<\/span> buf<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>buf<span class=\"token punctuation\">)<\/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 punctuation\">}<\/span><\/p>\n<p>\u6b64\u5916&#xff0c;\u8fd8\u6709\u4e00\u4e2a\u63a5\u53e3 FD_CLR&#xff0c;\u5176\u4f5c\u7528\u662f\u4ece\u4f4d\u56fe\u6570\u7ec4\u4e2d\u6e05\u9664\u67d0\u4e2a\u6587\u4ef6\u63cf\u8ff0\u7b26&#xff0c;\u5373\u5c06\u5bf9\u5e94\u7684\u6bd4\u7279\u4f4d\u4ece 1 \u91cd\u65b0\u8bbe\u7f6e\u4e3a 0&#xff0c;\u8868\u793a\u4e0d\u518d\u68c0\u6d4b\u8be5\u6587\u4ef6\u63cf\u8ff0\u7b26\u3002\u8be5\u51fd\u6570\u540c\u6837\u63a5\u6536\u6587\u4ef6\u63cf\u8ff0\u7b26\u4ee5\u53ca\u4f4d\u56fe\u6570\u7ec4\u4e24\u4e2a\u53c2\u6570&#xff0c;\u5176\u4e2d\u4f4d\u56fe\u6570\u7ec4\u5c5e\u4e8e\u8f93\u51fa\u578b\u53c2\u6570\u3002<\/p>\n<p>\u4e0d\u8fc7\u5728\u5b9e\u9645\u5f00\u53d1\u4e2d&#xff0c;\u76f8\u6bd4\u4e8e\u524d\u9762\u51e0\u4e2a\u63a5\u53e3&#xff0c;FD_CLR \u7684\u4f7f\u7528\u9891\u7387\u901a\u5e38\u8f83\u4f4e\u3002<\/p>\n<p><span class=\"token keyword\">void<\/span> <span class=\"token function\">FD_CLR<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> fd<span class=\"token punctuation\">,<\/span> fd_set <span class=\"token operator\">*<\/span>set<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u4f7f\u7528\u793a\u4f8b<\/span><br \/>\n<span class=\"token function\">FD_CLR<\/span><span class=\"token punctuation\">(<\/span>sockfd<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>readfds<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>   <span class=\"token comment\">\/\/ \u5c06sockfd\u5bf9\u5e94\u7684\u4f4d\u6e05\u9664\u4e3a0<\/span><\/p>\n<hr \/>\n<p>\u63a5\u4e0b\u6765&#xff0c;\u6211\u4eec\u7ed3\u5408\u4e0a\u8ff0\u63a5\u53e3\u4ee5\u53ca select \u63a5\u53e3&#xff0c;\u6765\u8bf4\u660e select \u7684\u5178\u578b\u4f7f\u7528\u65b9\u5f0f\u3002<\/p>\n<p>select \u63a5\u53e3\u5728\u5b9e\u9645\u4f7f\u7528\u4e2d\u7ecf\u5e38\u88ab\u8ba4\u4e3a\u8f83\u4e3a\u590d\u6742&#xff0c;\u5176\u4e2d\u4e00\u4e2a\u91cd\u8981\u539f\u56e0\u5c31\u5728\u4e8e&#xff1a;\u9664\u7b2c\u4e00\u4e2a\u53c2\u6570\u5916&#xff0c;\u5176\u4f59\u53c2\u6570\u5168\u90e8\u4e3a\u8f93\u5165\u8f93\u51fa\u578b\u53c2\u6570\u3002\u8fd9\u610f\u5473\u7740\u6bcf\u6b21\u8c03\u7528 select \u4e4b\u540e&#xff0c;\u8fd9\u4e9b\u96c6\u5408\u90fd\u4f1a\u88ab\u5185\u6838\u4fee\u6539&#xff0c;\u56e0\u6b64\u9700\u8981\u5728\u4e0b\u4e00\u6b21\u8c03\u7528\u4e4b\u524d\u91cd\u65b0\u8fdb\u884c\u6784\u9020\u3002<\/p>\n<p>\u5bf9\u4e8e\u4e00\u4e2a\u670d\u52a1\u7aef\u8fdb\u7a0b\u800c\u8a00&#xff0c;\u5176\u521d\u59cb\u9636\u6bb5\u901a\u5e38\u9700\u8981\u5b8c\u6210\u5982\u4e0b\u6b65\u9aa4&#xff1a;<\/p>\n<li>\u521b\u5efa\u76d1\u542c\u5957\u63a5\u5b57&#xff08;\u83b7\u53d6\u76d1\u542c\u5957\u63a5\u5b57\u5bf9\u5e94\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26&#xff09;<\/li>\n<li>\u7ed1\u5b9a\u5730\u5740&#xff08;bind&#xff09;<\/li>\n<li>\u5c06\u76d1\u542c\u5957\u63a5\u5b57\u8bbe\u7f6e\u4e3a\u76d1\u542c\u72b6\u6001&#xff08;\u8c03\u7528 listen&#xff09;<\/li>\n<p>\u5728\u4f20\u7edf\u7684\u5b9e\u73b0\u65b9\u5f0f\u4e2d&#xff0c;\u4e3b\u7ebf\u7a0b\u5728\u5b8c\u6210 listen \u4e4b\u540e\u901a\u5e38\u4f1a\u8fdb\u5165\u4e00\u4e2a while \u5faa\u73af&#xff0c;\u5e76\u4e0d\u65ad\u8c03\u7528 accept \u83b7\u53d6\u65b0\u7684\u8fde\u63a5\u3002\u4e00\u65e6 accept \u6210\u529f\u8fd4\u56de\u5df2\u8fde\u63a5\u5957\u63a5\u5b57&#xff0c;\u5c31\u5c06\u8be5\u8fde\u63a5\u5206\u914d\u7ed9\u7ebf\u7a0b\u6c60\u4e2d\u7684\u5de5\u4f5c\u7ebf\u7a0b\u8fdb\u884c\u5904\u7406\u3002<\/p>\n<p>\u800c\u5728\u91c7\u7528 I\/O \u591a\u8def\u590d\u7528\u6a21\u578b \u4e4b\u540e&#xff0c;\u6574\u4f53\u903b\u8f91\u4f1a\u53d1\u751f\u53d8\u5316\u3002\u5bf9\u4e8e\u4e3b\u7ebf\u7a0b\u800c\u8a00&#xff0c;\u5176\u4e0d\u518d\u53ea\u5173\u6ce8\u76d1\u542c\u5957\u63a5\u5b57\u662f\u5426\u5c31\u7eea&#xff0c;\u800c\u662f\u540c\u65f6\u5173\u6ce8&#xff1a;<\/p>\n<ul>\n<li>\u76d1\u542c\u5957\u63a5\u5b57\u7684\u8bfb\u4e8b\u4ef6&#xff08;\u8868\u793a\u6709\u65b0\u7684\u8fde\u63a5\u5230\u6765&#xff09;<\/li>\n<li>\u5df2\u8fde\u63a5\u5957\u63a5\u5b57\u7684\u8bfb\u4e8b\u4ef6&#xff08;\u8868\u793a\u5ba2\u6237\u7aef\u53d1\u9001\u4e86\u6570\u636e&#xff09;<\/li>\n<\/ul>\n<p>\u56e0\u6b64&#xff0c;\u4e3b\u7ebf\u7a0b\u5728\u8c03\u7528 listen \u4e4b\u540e&#xff0c;\u4e0d\u4f1a\u76f4\u63a5\u8fdb\u5165\u4e00\u4e2a\u4ec5\u8c03\u7528 accept \u7684\u5faa\u73af&#xff0c;\u800c\u662f\u9996\u5148\u521d\u59cb\u5316\u4e00\u4e2a\u8bfb\u96c6\u5408\u3002\u7531\u4e8e\u670d\u52a1\u7aef\u521a\u542f\u52a8\u65f6\u53ea\u6709\u76d1\u542c\u5957\u63a5\u5b57&#xff0c;\u56e0\u6b64\u521d\u59cb\u72b6\u6001\u4e0b\u53ea\u9700\u8981\u5c06\u76d1\u542c\u5957\u63a5\u5b57\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u52a0\u5165\u8bfb\u96c6\u5408\u4e2d\u3002\u540c\u65f6\u8fd8\u9700\u8981\u51c6\u5907 timeval \u7ed3\u6784\u4f53&#xff0c;\u7528\u4e8e\u6307\u5b9a select \u7684\u8d85\u65f6\u65f6\u95f4\u3002\u901a\u5e38\u5728\u5b9e\u9645\u7cfb\u7edf\u4e2d&#xff0c;select \u5e76\u4e0d\u4f1a\u65e0\u9650\u963b\u585e&#xff0c;\u800c\u662f\u8bbe\u7f6e\u4e00\u5b9a\u7684\u8d85\u65f6\u65f6\u95f4\u3002<\/p>\n<p>\u5b8c\u6210\u8bfb\u96c6\u5408\u548c timeval \u7684\u521d\u59cb\u5316\u4e4b\u540e&#xff0c;\u7a0b\u5e8f\u8fdb\u5165\u4e3b\u5faa\u73af\u3002<\/p>\n<p>\u7531\u4e8e\u8bfb\u96c6\u5408\u4f1a\u4f5c\u4e3a\u8f93\u5165\u8f93\u51fa\u578b\u53c2\u6570\u4f20\u9012\u7ed9 select&#xff0c;\u56e0\u6b64\u5185\u6838\u5728\u8fd4\u56de\u65f6\u4f1a\u76f4\u63a5\u8986\u76d6\u8be5\u4f4d\u56fe\u6570\u7ec4\u3002\u5982\u679c\u4e0b\u4e00\u8f6e\u5faa\u73af\u7ee7\u7eed\u4f7f\u7528\u8be5\u96c6\u5408&#xff0c;\u5c31\u5fc5\u987b\u91cd\u65b0\u6784\u9020\u3002\u56e0\u6b64\u8fd9\u91cc\u4e0d\u80fd\u76f4\u63a5\u5c06\u539f\u59cb\u8bfb\u96c6\u5408\u4f20\u9012\u7ed9 select&#xff0c;\u800c\u662f\u9700\u8981\u5728\u5faa\u73af\u5185\u90e8\u521b\u5efa\u4e00\u4e2a\u526f\u672c&#xff08;\u4e34\u65f6\u96c6\u5408&#xff09;&#xff0c;\u7136\u540e\u5c06\u8be5\u526f\u672c\u4f20\u9012\u7ed9 select\u3002<\/p>\n<p>\u6b64\u5916&#xff0c;\u5728\u670d\u52a1\u7aef\u7a0b\u5e8f\u4e2d&#xff0c;\u8fd8\u9700\u8981\u989d\u5916\u7ef4\u62a4\u4e00\u4e2a\u8f85\u52a9\u6570\u7ec4\u3002\u539f\u56e0\u5728\u4e8e&#xff1a;\u5bf9\u4e8e TCP \u8fde\u63a5\u800c\u8a00&#xff0c;\u4e00\u65e6\u5ba2\u6237\u7aef\u4e3b\u52a8\u5173\u95ed\u8fde\u63a5&#xff0c;\u670d\u52a1\u7aef\u4e5f\u4f1a\u5173\u95ed\u5bf9\u5e94\u7684\u5df2\u8fde\u63a5\u5957\u63a5\u5b57&#xff0c;\u6b64\u65f6\u8be5\u6587\u4ef6\u63cf\u8ff0\u7b26\u5c06\u4e0d\u518d\u6709\u6548\u3002\u56e0\u6b64&#xff0c;\u670d\u52a1\u7aef\u9700\u8981\u52a8\u6001\u7ef4\u62a4\u5f53\u524d\u4ecd\u7136\u9700\u8981\u68c0\u6d4b\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u96c6\u5408\u3002<\/p>\n<p>\u6362\u53e5\u8bdd\u8bf4&#xff0c;\u5df2\u8fde\u63a5\u5957\u63a5\u5b57\u7684\u751f\u547d\u5468\u671f\u662f\u52a8\u6001\u53d8\u5316\u7684\u3002\u56e0\u6b64\u9700\u8981\u4e00\u4e2a\u7528\u6237\u6001\u7684\u6570\u636e\u7ed3\u6784\u6765\u8bb0\u5f55\u5f53\u524d\u6709\u6548\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u96c6\u5408\u3002\u5728\u672c\u5b9e\u73b0\u4e2d&#xff0c;\u8fd9\u4e2a\u7ed3\u6784\u5c31\u662f\u6240\u8c13\u7684\u8bfb\u96c6\u5408\u8f85\u52a9\u6570\u7ec4\u3002<\/p>\n<p>\u8be5\u8f85\u52a9\u6570\u7ec4\u672c\u8d28\u4e0a\u662f&#xff1a;<\/p>\n<p>\u7528\u6237\u6001\u7684\u201c\u771f\u5b9e\u72b6\u6001&#xff08;source of truth&#xff09;\u201d<\/p>\n<p>\u800c fd_set \u53ea\u662f&#xff1a;<\/p>\n<p>\u6bcf\u6b21\u8c03\u7528 select \u65f6\u63d0\u4ea4\u7ed9\u5185\u6838\u7684\u77ac\u65f6\u5feb\u7167&#xff08;snapshot&#xff09;<\/p>\n<p>\u56e0\u6b64&#xff0c;\u5728\u8c03\u7528 select \u4e4b\u524d&#xff0c;\u9700\u8981\u6839\u636e\u8f85\u52a9\u6570\u7ec4\u91cd\u65b0\u6784\u9020\u8bfb\u96c6\u5408&#xff0c;\u5e76\u8ba1\u7b97\u5f53\u524d\u6700\u5927\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u503c&#xff08;max_fd&#xff09;\u3002\u968f\u540e\u518d\u590d\u5236\u4e00\u4efd\u96c6\u5408\u526f\u672c\u4f20\u9012\u7ed9 select\u3002<\/p>\n<p>\u5f53 select \u8fd4\u56de\u4e4b\u540e&#xff0c;\u9700\u8981\u68c0\u67e5\u5176\u8fd4\u56de\u503c&#xff1a;<\/p>\n<ul>\n<li>\u5927\u4e8e 0&#xff1a;\u8868\u793a\u6709\u6587\u4ef6\u63cf\u8ff0\u7b26\u5c31\u7eea&#xff0c;\u6b64\u65f6\u8c03\u7528\u4e13\u95e8\u7684\u5904\u7406\u51fd\u6570\u5224\u65ad\u662f\u76d1\u542c\u5957\u63a5\u5b57\u8fd8\u662f\u5df2\u8fde\u63a5\u5957\u63a5\u5b57\u5c31\u7eea<\/li>\n<li>\u7b49\u4e8e 0&#xff1a;\u8868\u793a\u8d85\u65f6&#xff0c;\u7ee7\u7eed\u4e0b\u4e00\u8f6e\u5faa\u73af<\/li>\n<li>\u5c0f\u4e8e 0&#xff1a;\u8868\u793a select \u8c03\u7528\u5931\u8d25&#xff0c;\u6b64\u65f6\u901a\u5e38\u9700\u8981\u8bb0\u5f55\u65e5\u5fd7\u5e76\u9000\u51fa<\/li>\n<\/ul>\n<p>\u9700\u8981\u6ce8\u610f\u7684\u662f&#xff0c;select \u7684\u6700\u540e\u4e00\u4e2a\u53c2\u6570&#xff08;timeval&#xff09;\u540c\u6837\u662f\u8f93\u5165\u8f93\u51fa\u578b\u53c2\u6570&#xff0c;\u5185\u6838\u5728\u8fd4\u56de\u65f6\u4f1a\u4fee\u6539\u5176\u4e2d\u7684\u5269\u4f59\u65f6\u95f4\u3002\u56e0\u6b64\u5728\u6bcf\u4e00\u6b21\u5faa\u73af\u5f00\u59cb\u4e4b\u524d&#xff0c;\u90fd\u9700\u8981\u91cd\u65b0\u521d\u59cb\u5316 timeval \u7ed3\u6784\u4f53\u3002<\/p>\n<p>\u4ee3\u7801\u793a\u4f8b\u5982\u4e0b&#xff1a;<\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">Select_Server<\/span><span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token function\">Select_Server<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">uint16_t<\/span> _port<span class=\"token operator\">&#061;<\/span><span class=\"token number\">8888<\/span><span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string _ip<span class=\"token operator\">&#061;<\/span>_deafault<span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token operator\">:<\/span><span class=\"token function\">port<\/span><span class=\"token punctuation\">(<\/span>_port<span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token punctuation\">,<\/span> <span class=\"token function\">ip<\/span><span class=\"token punctuation\">(<\/span>_ip<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">,<\/span><span class=\"token function\">read_tp<\/span><span class=\"token punctuation\">(<\/span>threadpool<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">getinstance<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/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> fd_num_max<span class=\"token punctuation\">;<\/span> i<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token punctuation\">{<\/span><br \/>\n                        read_fd_array<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/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 keyword\">for<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/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>fd_num_max<span class=\"token punctuation\">;<\/span>i<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n          <span class=\"token punctuation\">{<\/span><br \/>\n            write_fd_array<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token operator\">&#061;<\/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><br \/>\n    <span class=\"token comment\">\/\/&#8230;.<\/span><br \/>\n     <span class=\"token keyword\">bool<\/span> <span class=\"token function\">init<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n                listensock<span class=\"token punctuation\">.<\/span><span class=\"token function\">socket<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                listensock<span class=\"token punctuation\">.<\/span><span class=\"token function\">bind<\/span><span class=\"token punctuation\">(<\/span>ip<span class=\"token punctuation\">,<\/span> port<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n      <span class=\"token keyword\">void<\/span> <span class=\"token function\">handlertask<\/span><span class=\"token punctuation\">(<\/span>fd_set<span class=\"token operator\">*<\/span> read_set<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n               <span class=\"token comment\">\/\/&#8230;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">start<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token function\">signal<\/span><span class=\"token punctuation\">(<\/span>SIGPIPE<span class=\"token punctuation\">,<\/span> SIG_IGN<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ &#x1f31f; \u5168\u5c40\u5ffd\u7565 SIGPIPE \u4fe1\u53f7<\/span><br \/>\n                listensock<span class=\"token punctuation\">.<\/span><span class=\"token function\">listen<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                read_tp<span class=\"token punctuation\">.<\/span><span class=\"token function\">start<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                 <span class=\"token comment\">\/\/&#8230;<\/span><br \/>\n                <span class=\"token keyword\">int<\/span> listensock_fd <span class=\"token operator\">&#061;<\/span> listensock<span class=\"token punctuation\">.<\/span><span class=\"token function\">fd<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                read_fd_array<span class=\"token punctuation\">[<\/span>listensock_fd<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                fd_set read_set<span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">timeval<\/span> time <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token number\">5<\/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> max_fd<span class=\"token operator\">&#061;<\/span><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token function\">FD_ZERO<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>read_set<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            max_fd<span class=\"token operator\">&#061;<\/span><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n           <span class=\"token keyword\">for<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/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>fd_num_max<span class=\"token punctuation\">;<\/span>i<span class=\"token operator\">&#043;&#043;<\/span><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>read_fd_array<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token operator\">&#061;&#061;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><br \/>\n              <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token function\">FD_SET<\/span><span class=\"token punctuation\">(<\/span>i<span class=\"token punctuation\">,<\/span><span class=\"token operator\">&amp;<\/span>read_set<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>i<span class=\"token operator\">&gt;<\/span>max_fd<span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token punctuation\">{<\/span><br \/>\n                    max_fd<span class=\"token operator\">&#061;<\/span>i<span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><br \/>\n              <span class=\"token punctuation\">}<\/span><br \/>\n           <span class=\"token punctuation\">}<\/span><br \/>\n           fd_set temp_set<span class=\"token operator\">&#061;<\/span>read_set<span class=\"token punctuation\">;<\/span><br \/>\n           time<span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">{<\/span><span class=\"token number\">5<\/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> n <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">select<\/span><span class=\"token punctuation\">(<\/span>max_fd <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>temp_set<span class=\"token punctuation\">,<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>time<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <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><br \/>\n         <span class=\"token punctuation\">{<\/span><br \/>\n                lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>Fatal<span class=\"token punctuation\">,<\/span><span class=\"token string\">&#034;select error&#034;<\/span><span class=\"token punctuation\">)<\/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><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><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>info<span class=\"token punctuation\">,<\/span><span class=\"token string\">&#034;select timeout&#034;<\/span><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 function\">handlertask<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>temp_set<span class=\"token punctuation\">)<\/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 punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">private<\/span><span class=\"token operator\">:<\/span><br \/>\n        sock listensock<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">uint16_t<\/span> port<span class=\"token punctuation\">;<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>string ip<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">int<\/span> read_fd_array<span class=\"token punctuation\">[<\/span>fd_num_max<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n         <span class=\"token keyword\">int<\/span> write_fd_array<span class=\"token punctuation\">[<\/span>fd_num_max<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        threadpool<span class=\"token operator\">&amp;<\/span> read_tp<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/&#8230;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>\u800c\u4e00\u65e6 select \u7684\u8fd4\u56de\u503c \u5927\u4e8e 0&#xff0c;\u5219\u8bf4\u660e\u5f53\u524d\u5df2\u7ecf\u5b58\u5728\u8bfb\u6761\u4ef6\u5c31\u7eea\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u3002\u6b64\u65f6\u7a0b\u5e8f\u5c31\u4f1a\u8fdb\u5165 handlertask \u51fd\u6570\u8fdb\u884c\u5904\u7406\u3002\u8be5\u51fd\u6570\u7684\u6838\u5fc3\u804c\u8d23\u662f&#xff1a;\u5224\u65ad\u5177\u4f53\u662f\u54ea\u4e2a\u6587\u4ef6\u63cf\u8ff0\u7b26\u53d1\u751f\u4e86\u8bfb\u4e8b\u4ef6&#xff0c;\u4ee5\u53ca\u8be5\u4e8b\u4ef6\u5bf9\u5e94\u7684\u7c7b\u578b\u3002<\/p>\n<p>\u5177\u4f53\u5b9e\u73b0\u65b9\u5f0f\u662f&#xff1a;\u904d\u5386\u4f20\u9012\u7ed9 select \u63a5\u53e3\u7684\u8bfb\u96c6\u5408&#xff08;\u5373\u88ab\u5185\u6838\u4fee\u6539\u540e\u7684 fd_set&#xff09;&#xff0c;\u5e76\u4f9d\u6b21\u68c0\u67e5\u6bcf\u4e00\u4e2a\u6587\u4ef6\u63cf\u8ff0\u7b26\u662f\u5426\u5728\u96c6\u5408\u4e2d\u3002\u5982\u679c\u67d0\u4e2a\u6587\u4ef6\u63cf\u8ff0\u7b26\u5bf9\u5e94\u7684\u6bd4\u7279\u4f4d\u4ecd\u7136\u4e3a 1&#xff0c;\u5219\u8bf4\u660e\u8be5\u6587\u4ef6\u63cf\u8ff0\u7b26\u5df2\u7ecf\u5c31\u7eea\u3002<\/p>\n<p>\u968f\u540e\u9700\u8981\u6839\u636e\u6587\u4ef6\u63cf\u8ff0\u7b26\u7684\u7c7b\u578b\u8fdb\u884c\u4e0d\u540c\u7684\u5904\u7406&#xff1a;<\/p>\n<li>\u5982\u679c\u5c31\u7eea\u7684\u662f\u76d1\u542c\u5957\u63a5\u5b57 \u8bf4\u660e\u6709\u65b0\u7684\u5ba2\u6237\u7aef\u8fde\u63a5\u5230\u8fbe&#xff0c;\u6b64\u65f6\u9700\u8981\u8c03\u7528 accept \u63a5\u53e3\u83b7\u53d6\u65b0\u7684\u8fde\u63a5&#xff0c;\u5373\u83b7\u53d6\u5bf9\u5e94\u7684\u5df2\u8fde\u63a5\u5957\u63a5\u5b57\u6587\u4ef6\u63cf\u8ff0\u7b26\u3002\u968f\u540e\u5c06\u8be5\u6587\u4ef6\u63cf\u8ff0\u7b26\u52a0\u5165\u5230\u8f85\u52a9\u6570\u7ec4\u4e2d&#xff0c;\u4ee5\u4fbf\u5728\u4e0b\u4e00\u6b21\u8c03\u7528 select \u4e4b\u524d\u80fd\u591f\u91cd\u65b0\u6784\u9020\u8bfb\u96c6\u5408&#xff0c;\u4ece\u800c\u6301\u7eed\u76d1\u63a7\u8be5\u8fde\u63a5\u7684\u8bfb\u4e8b\u4ef6\u3002<\/li>\n<li>\u5982\u679c\u5c31\u7eea\u7684\u662f\u5df2\u8fde\u63a5\u5957\u63a5\u5b57 \u8bf4\u660e\u5bf9\u5e94\u5ba2\u6237\u7aef\u5df2\u7ecf\u5411\u670d\u52a1\u7aef\u53d1\u9001\u4e86\u6570\u636e\u3002\u6b64\u65f6\u4e3b\u7ebf\u7a0b\u4e0d\u4f1a\u76f4\u63a5\u5904\u7406\u6570\u636e&#xff0c;\u800c\u662f\u5c06\u8be5\u6587\u4ef6\u63cf\u8ff0\u7b26\u5c01\u88c5\u4e3a\u4efb\u52a1\u5bf9\u8c61&#xff0c;\u5e76\u5206\u914d\u7ed9\u7ebf\u7a0b\u6c60\u4e2d\u7684\u5de5\u4f5c\u7ebf\u7a0b\u8fdb\u884c\u5904\u7406&#xff0c;\u4ece\u800c\u5b9e\u73b0\u4e3b\u7ebf\u7a0b\u8d1f\u8d23\u4e8b\u4ef6\u5206\u53d1&#xff0c;\u5de5\u4f5c\u7ebf\u7a0b\u8d1f\u8d23\u4e1a\u52a1\u5904\u7406\u7684\u5e76\u53d1\u6a21\u578b\u3002<\/li>\n<p>\u5bf9\u5e94\u4ee3\u7801\u5982\u4e0b&#xff1a;<\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">Select_Server<\/span><span class=\"token punctuation\">{<\/span><br \/>\n   <span class=\"token comment\">\/\/&#8230;<\/span><br \/>\n   <span class=\"token keyword\">void<\/span> <span class=\"token function\">Accepet<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sockaddr_in<\/span> Client<span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token function\">memset<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>Client<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>Client<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                socklen_t Client_len <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>Client<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">int<\/span> connfd <span class=\"token operator\">&#061;<\/span> listensock<span class=\"token punctuation\">.<\/span><span class=\"token function\">accept<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>Client<span class=\"token punctuation\">,<\/span><span class=\"token operator\">&amp;<\/span>Client_len<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\">&lt;<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token punctuation\">{<\/span><br \/>\n                    lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>Fatal<span class=\"token punctuation\">,<\/span><span class=\"token string\">&#034;accept error&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>connfd<span class=\"token operator\">&gt;&#061;<\/span>fd_num_max<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>Fatal<span class=\"token punctuation\">,<\/span><span class=\"token string\">&#034;fd overflow&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>                read_fd_array<span class=\"token punctuation\">[<\/span>connfd<span class=\"token punctuation\">]<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                last_active_time<span class=\"token punctuation\">[<\/span>connfd<span class=\"token punctuation\">]<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token function\">time<\/span><span class=\"token punctuation\">(<\/span><span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">lock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                send_queues<span class=\"token punctuation\">[<\/span>connfd<span class=\"token punctuation\">]<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token keyword\">new<\/span> SendQueue<span class=\"token punctuation\">;<\/span><br \/>\n                send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/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>  <span class=\"token keyword\">void<\/span> <span class=\"token function\">Distribute<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> fd<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n                   read_fd_array<span class=\"token punctuation\">[<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                   Task <span class=\"token function\">t<\/span><span class=\"token punctuation\">(<\/span>fd<span class=\"token punctuation\">,<\/span>read_fd_array<span class=\"token punctuation\">,<\/span>write_fd_array<span class=\"token punctuation\">,<\/span>last_active_time<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                   read_tp<span class=\"token punctuation\">.<\/span><span class=\"token function\">push<\/span><span class=\"token punctuation\">(<\/span>t<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token keyword\">void<\/span> <span class=\"token function\">handlertask<\/span><span class=\"token punctuation\">(<\/span>fd_set<span class=\"token operator\">*<\/span> read_set<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/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> fd_num_max<span class=\"token punctuation\">;<\/span> i<span class=\"token operator\">&#043;&#043;<\/span><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><span class=\"token function\">FD_ISSET<\/span><span class=\"token punctuation\">(<\/span>i<span class=\"token punctuation\">,<\/span> read_set<span class=\"token punctuation\">)<\/span><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>i <span class=\"token operator\">&#061;&#061;<\/span> listensock<span class=\"token punctuation\">.<\/span><span class=\"token function\">fd<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n                                <span class=\"token punctuation\">{<\/span><br \/>\n                                        <span class=\"token function\">Accepet<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                                <span class=\"token punctuation\">}<\/span><br \/>\n                                <span class=\"token keyword\">else<\/span><br \/>\n                                <span class=\"token punctuation\">{<\/span><br \/>\n                                        <span class=\"token function\">Distribute<\/span><span class=\"token punctuation\">(<\/span>i<span class=\"token punctuation\">)<\/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 punctuation\">}<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token comment\">\/\/&#8230;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u5728\u8be5\u5b9e\u73b0\u4e2d&#xff0c;handlertask \u51fd\u6570\u672c\u8d28\u4e0a\u627f\u62c5\u7684\u662f**\u4e8b\u4ef6\u5206\u53d1\u5668&#xff08;Event Dispatcher&#xff09;**\u7684\u89d2\u8272&#xff1a;<\/p>\n<ul>\n<li>\u5982\u679c\u76d1\u542c\u5957\u63a5\u5b57\u5c31\u7eea \u2192 \u5904\u7406\u65b0\u8fde\u63a5\u5efa\u7acb<\/li>\n<li>\u5982\u679c\u5df2\u8fde\u63a5\u5957\u63a5\u5b57\u5c31\u7eea \u2192 \u5c06\u4efb\u52a1\u4ea4\u7531\u7ebf\u7a0b\u6c60\u5904\u7406<\/li>\n<\/ul>\n<p>\u8fd9\u79cd\u8bbe\u8ba1\u4f7f\u5f97\u4e3b\u7ebf\u7a0b\u59cb\u7ec8\u4fdd\u6301\u8f7b\u91cf&#xff0c;\u4ec5\u8d1f\u8d23 I\/O \u4e8b\u4ef6\u68c0\u6d4b\u4e0e\u4efb\u52a1\u5206\u53d1&#xff0c;\u800c\u5177\u4f53\u7684\u4e1a\u52a1\u5904\u7406\u5219\u7531\u7ebf\u7a0b\u6c60\u4e2d\u7684\u5de5\u4f5c\u7ebf\u7a0b\u5b8c\u6210&#xff0c;\u4ece\u800c\u63d0\u9ad8\u6574\u4f53\u7cfb\u7edf\u7684\u5e76\u53d1\u5904\u7406\u80fd\u529b\u3002<\/p>\n<p>\u53e6\u5916\u9700\u8981\u6ce8\u610f\u7684\u4e00\u70b9\u662f&#xff0c;\u5728 Distribute \u51fd\u6570\u4e2d&#xff1a;<\/p>\n<p>read_fd_array<span class=\"token punctuation\">[<\/span>fd<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>\u8be5\u64cd\u4f5c\u7684\u542b\u4e49\u662f&#xff1a;\u5728\u4efb\u52a1\u88ab\u5206\u53d1\u7ed9\u5de5\u4f5c\u7ebf\u7a0b\u4e4b\u540e&#xff0c;\u6682\u65f6\u505c\u6b62\u4e3b\u7ebf\u7a0b\u5bf9\u8be5\u6587\u4ef6\u63cf\u8ff0\u7b26\u8bfb\u4e8b\u4ef6\u7684\u76d1\u63a7&#xff0c;\u4ee5\u907f\u514d\u5728\u5de5\u4f5c\u7ebf\u7a0b\u5c1a\u672a\u5904\u7406\u5b8c\u6210\u65f6\u518d\u6b21\u89e6\u53d1\u8bfb\u4e8b\u4ef6&#xff0c;\u4ece\u800c\u5bfc\u81f4\u540c\u4e00\u8fde\u63a5\u88ab\u91cd\u590d\u5206\u53d1\u5904\u7406\u3002\u8fd9\u5b9e\u9645\u4e0a\u662f\u4e00\u79cd\u7b80\u5355\u7684\u5e76\u53d1\u4fdd\u62a4\u7b56\u7565\u3002<\/p>\n<p>select\u7ebf\u7a0b&#xff08;\u4e3b\u7ebf\u7a0b&#xff09;<br \/>\n        \u2502<br \/>\n        \u2502 \u4e8b\u4ef6\u68c0\u6d4b<br \/>\n        \u25bc<br \/>\nhandlertask&#xff08;\u4e8b\u4ef6\u5206\u53d1&#xff09;<br \/>\n        \u2502<br \/>\n        \u251c\u2500\u2500 \u65b0\u8fde\u63a5 \u2192 accept<br \/>\n        \u2502<br \/>\n        \u2514\u2500\u2500 \u5df2\u8fde\u63a5FD \u2192 \u6295\u9012\u7ebf\u7a0b\u6c60<br \/>\n                         \u2502<br \/>\n                         \u25bc<br \/>\n                    \u5de5\u4f5c\u7ebf\u7a0b\u5904\u7406\u4e1a\u52a1<\/p>\n<p>\u90a3\u4e48\u8ba4\u8bc6\u4e86\u5982\u4f55\u8c03\u7528 select \u63a5\u53e3\u6765\u5b9e\u73b0 I\/O \u591a\u8def\u590d\u7528 \u4e4b\u540e&#xff0c;\u63a5\u4e0b\u6765\u9700\u8981\u8fdb\u4e00\u6b65\u4e86\u89e3 select \u63a5\u53e3\u672c\u8eab\u6240\u5b58\u5728\u7684\u4e00\u4e9b\u5c40\u9650\u6027\u3002<\/p>\n<p>\u9996\u5148&#xff0c;select \u6240\u80fd\u591f\u68c0\u67e5\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u6570\u91cf\u662f\u5b58\u5728\u4e0a\u9650\u7684\u3002\u901a\u5e38\u60c5\u51b5\u4e0b&#xff0c;\u5176\u6700\u591a\u53ea\u80fd\u68c0\u67e5 1024 \u4e2a\u6587\u4ef6\u63cf\u8ff0\u7b26\u3002\u7136\u800c&#xff0c;\u5bf9\u4e8e\u4e00\u4e2a\u8fdb\u7a0b\u800c\u8a00&#xff0c;\u5176\u6587\u4ef6\u63cf\u8ff0\u7b26\u8868\u7684\u5bb9\u91cf\u5b9e\u9645\u4e0a\u662f\u53ef\u4ee5\u8d85\u8fc7 1024 \u7684\u3002\u56e0\u6b64&#xff0c;\u5f53\u670d\u52a1\u7aef\u4e3b\u7ebf\u7a0b\u4e0d\u65ad\u63a5\u6536\u65b0\u7684\u8fde\u63a5&#xff0c;\u5e76\u901a\u8fc7 accept \u83b7\u53d6\u5df2\u8fde\u63a5\u5957\u63a5\u5b57\u5bf9\u5e94\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u65f6&#xff0c;\u5c31\u53ef\u80fd\u51fa\u73b0\u4e00\u4e2a\u95ee\u9898&#xff1a;\u90e8\u5206\u6587\u4ef6\u63cf\u8ff0\u7b26\u65e0\u6cd5\u88ab select \u8fdb\u884c\u76d1\u542c\u3002<\/p>\n<p>\u5177\u4f53\u6765\u8bf4&#xff0c;select \u6240\u4f7f\u7528\u7684 fd_set \u672c\u8d28\u4e0a\u662f\u4e00\u4e2a \u4f4d\u56fe\u6570\u7ec4&#xff08;bitmap&#xff09;&#xff0c;\u5176\u5927\u5c0f\u7531\u5b8f FD_SETSIZE \u51b3\u5b9a\u3002\u5728\u7edd\u5927\u591a\u6570\u7cfb\u7edf\u5b9e\u73b0\u4e2d&#xff0c;FD_SETSIZE \u88ab\u786c\u7f16\u7801\u4e3a 1024\u3002\u8fd9\u610f\u5473\u7740\u8be5\u4f4d\u56fe\u6570\u7ec4\u4ec5\u5305\u542b 1024 \u4e2a\u6bd4\u7279\u4f4d&#xff0c;\u56e0\u6b64\u53ea\u80fd\u8868\u793a 0&#xff5e;1023 \u8303\u56f4\u5185\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u3002\u7531\u4e8e\u6587\u4ef6\u63cf\u8ff0\u7b26\u7684\u6570\u503c\u672c\u8eab\u5c31\u662f\u6587\u4ef6\u63cf\u8ff0\u7b26\u8868\u4e2d\u7684\u6570\u7ec4\u4e0b\u6807&#xff0c;\u4e00\u65e6\u67d0\u4e2a\u6587\u4ef6\u63cf\u8ff0\u7b26\u7684\u503c \u22651024&#xff0c;\u90a3\u4e48\u5728\u4f4d\u56fe\u4e2d\u5c31\u4e0d\u5b58\u5728\u5bf9\u5e94\u7684\u4f4d\u7f6e&#xff0c;\u4e5f\u5c31\u65e0\u6cd5\u901a\u8fc7 FD_SET \u5c06\u5176\u52a0\u5165\u5230\u76d1\u542c\u96c6\u5408\u4e2d\u3002<\/p>\n<p>\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b&#xff0c;\u5373\u4fbf\u670d\u52a1\u7aef\u5df2\u7ecf\u901a\u8fc7 accept \u83b7\u53d6\u5230\u4e86\u65b0\u7684\u5df2\u8fde\u63a5\u5957\u63a5\u5b57&#xff0c;\u5176\u5bf9\u5e94\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u4e5f\u65e0\u6cd5\u52a0\u5165 select \u7684\u76d1\u542c\u96c6\u5408\u3002\u56e0\u6b64\u4e3b\u7ebf\u7a0b\u65e0\u6cd5\u5224\u65ad\u8be5\u5957\u63a5\u5b57\u7684 \u8bfb\u4e8b\u4ef6\u662f\u5426\u5c31\u7eea&#xff0c;\u4e5f\u65e0\u6cd5\u5c06\u5176\u7eb3\u5165\u4e8b\u4ef6\u9a71\u52a8\u7684\u5904\u7406\u6d41\u7a0b\u3002\u5b9e\u9645\u5de5\u7a0b\u4e2d\u901a\u5e38\u53ea\u80fd\u9009\u62e9\u62d2\u7edd\u8be5\u8fde\u63a5&#xff0c;\u6216\u8005\u91c7\u7528\u5176\u4ed6\u673a\u5236\u8fdb\u884c\u5904\u7406\u3002\u7531\u6b64\u53ef\u89c1&#xff0c;\u8fd9\u4e00\u9650\u5236\u76f4\u63a5\u7ea6\u675f\u4e86 select \u7684\u53ef\u6269\u5c55\u6027\u4e0e\u5e76\u53d1\u80fd\u529b&#xff0c;\u8fd9\u662f select \u6700\u663e\u8457\u7684\u5c40\u9650\u4e4b\u4e00\u3002<\/p>\n<p>\u5176\u6b21&#xff0c;select \u5728\u4e8b\u4ef6\u68c0\u6d4b\u8fc7\u7a0b\u4e2d\u5b58\u5728 O(N) \u7684\u65f6\u95f4\u590d\u6742\u5ea6\u5f00\u9500\u3002select \u63a5\u53e3\u9700\u8981\u4f20\u5165\u8bfb\u96c6\u5408\u3001\u5199\u96c6\u5408\u4ee5\u53ca\u5f02\u5e38\u96c6\u5408&#xff0c;\u8fd9\u4e9b\u96c6\u5408\u5747\u4ee5 \u4f4d\u56fe\u6570\u7ec4 \u7684\u5f62\u5f0f\u8868\u793a\u3002\u9700\u8981\u6ce8\u610f\u7684\u662f&#xff0c;\u8fd9\u4e9b\u96c6\u5408\u4e2d\u65e2\u5305\u542b\u771f\u6b63\u9700\u8981\u68c0\u6d4b\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26&#xff0c;\u4e5f\u5305\u542b\u672a\u88ab\u4f7f\u7528\u7684\u4f4d\u7f6e\u3002\u56e0\u6b64\u5728\u5185\u6838\u4fa7\u5b9e\u73b0\u4e2d&#xff0c;\u6bcf\u6b21\u6267\u884c select \u65f6&#xff0c;\u5185\u6838\u90fd\u5fc5\u987b\u904d\u5386 fd_set \u4f4d\u56fe\u6765\u68c0\u67e5\u5bf9\u5e94\u6587\u4ef6\u63cf\u8ff0\u7b26\u7684\u72b6\u6001&#xff0c;\u5176\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(N)\u3002<\/p>\n<p>\u6b64\u5916&#xff0c;\u5f53 select \u4ece\u5185\u6838\u6001\u8fd4\u56de\u7528\u6237\u6001&#xff08;\u5373\u8fdb\u7a0b\u4ece\u963b\u585e\u72b6\u6001\u88ab\u5524\u9192&#xff09;\u65f6&#xff0c;\u7528\u6237\u6001\u8fdb\u7a0b\u540c\u6837\u9700\u8981\u518d\u6b21\u904d\u5386\u4e00\u904d\u4f20\u9012\u7ed9 select \u7684\u96c6\u5408&#xff0c;\u4ee5\u627e\u51fa\u54ea\u4e9b\u6587\u4ef6\u63cf\u8ff0\u7b26\u771f\u6b63\u5c31\u7eea\u3002\u8fd9\u4e00\u904d\u5386\u8fc7\u7a0b\u540c\u6837\u5177\u6709 O(N) \u7684\u590d\u6742\u5ea6&#xff0c;\u5e76\u4e14\u5176\u4e2d\u5f80\u5f80\u5305\u542b\u5927\u91cf\u7684\u65e0\u6548\u904d\u5386&#xff0c;\u56e0\u6b64&#xff0c;\u5728\u6587\u4ef6\u63cf\u8ff0\u7b26\u6570\u91cf\u8f83\u591a\u7684\u573a\u666f\u4e0b&#xff0c;\u8fd9\u79cd \u201c\u5185\u6838\u4e00\u6b21\u904d\u5386 &#043; \u7528\u6237\u6001\u518d\u4e00\u6b21\u904d\u5386\u201d \u7684\u6a21\u5f0f\u4f1a\u5e26\u6765\u660e\u663e\u7684\u6027\u80fd\u5f00\u9500\u3002<\/p>\n<p>\u6700\u540e\u4e00\u4e2a\u5e38\u88ab\u8bdf\u75c5\u7684\u95ee\u9898\u662f&#xff1a;select \u63a5\u53e3\u7684\u5927\u90e8\u5206\u53c2\u6570\u90fd\u662f \u8f93\u5165\u8f93\u51fa\u578b\u53c2\u6570&#xff08;in-out parameter&#xff09;\u3002\u9664\u4e86\u7b2c\u4e00\u4e2a\u53c2\u6570 nfds \u4ec5\u4f5c\u4e3a\u8f93\u5165\u53c2\u6570\u4e4b\u5916&#xff0c;\u5176\u4f59\u53c2\u6570&#xff08;\u8bfb\u96c6\u5408\u3001\u5199\u96c6\u5408\u548c\u5f02\u5e38\u96c6\u5408&#xff09;\u5728\u8c03\u7528\u8fc7\u7a0b\u4e2d\u90fd\u4f1a\u88ab\u5185\u6838\u539f\u5730\u4fee\u6539\u3002\u4e5f\u5c31\u662f\u8bf4&#xff0c;\u5f53 select \u8fd4\u56de\u65f6&#xff0c;\u8fd9\u4e9b\u96c6\u5408\u4e2d\u53ea\u4f1a\u4fdd\u7559\u5df2\u7ecf\u5c31\u7eea\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u3002<\/p>\n<p>\u8fd9\u5c31\u5bfc\u81f4\u5728\u5b9e\u9645\u7f16\u7a0b\u65f6&#xff0c;\u6211\u4eec\u901a\u5e38\u9700\u8981\u7ef4\u62a4\u4e00\u4e2a\u989d\u5916\u7684\u8f85\u52a9\u6570\u7ec4&#xff0c;\u7528\u4e8e\u4fdd\u5b58\u5f53\u524d\u9700\u8981\u76d1\u542c\u7684\u5168\u90e8\u6709\u6548\u6587\u4ef6\u63cf\u8ff0\u7b26\u3002\u5728\u6bcf\u4e00\u6b21\u8c03\u7528 select \u4e4b\u524d&#xff0c;\u90fd\u5fc5\u987b\u6839\u636e\u8be5\u8f85\u52a9\u7ed3\u6784\u91cd\u65b0\u6784\u9020\u4e00\u4efd fd_set \u4f4d\u56fe&#xff0c;\u5e76\u4e14\u901a\u5e38\u8fd8\u9700\u8981\u51c6\u5907\u4e00\u4e2a\u526f\u672c\u4f20\u9012\u7ed9 select&#xff0c;\u4ee5\u907f\u514d\u539f\u59cb\u96c6\u5408\u88ab\u7834\u574f\u3002\u8fd9\u4e0d\u4ec5\u589e\u52a0\u4e86\u4ee3\u7801\u7684\u590d\u6742\u5ea6&#xff0c;\u4e5f\u5e26\u6765\u4e86\u989d\u5916\u7684\u5185\u5b58\u64cd\u4f5c\u5f00\u9500\u3002<\/p>\n<p>\u7efc\u4e0a\u6240\u8ff0&#xff0c;select \u5728\u8bbe\u8ba1\u4e0a\u5b58\u5728\u591a\u65b9\u9762\u9650\u5236&#xff1a;\u5305\u62ec \u6587\u4ef6\u63cf\u8ff0\u7b26\u6570\u91cf\u4e0a\u9650\u8f83\u4f4e\u3001\u4e8b\u4ef6\u68c0\u6d4b\u6548\u7387\u4e3a O(N)\u3001\u4ee5\u53ca\u63a5\u53e3\u53c2\u6570\u8bbe\u8ba1\u5e26\u6765\u7684\u4f7f\u7528\u590d\u6742\u5ea6\u3002\u8fd9\u4e9b\u56e0\u7d20\u4f7f\u5f97 select \u96be\u4ee5\u652f\u6491\u771f\u6b63\u7684\u9ad8\u5e76\u53d1\u670d\u52a1\u5668\u6a21\u578b\u3002\u56e0\u6b64&#xff0c;\u5728\u73b0\u4ee3\u9ad8\u5e76\u53d1\u7f51\u7edc\u7f16\u7a0b\u4e2d&#xff0c;select \u7684\u5b9e\u9645\u5e94\u7528\u573a\u666f\u5df2\u7ecf\u76f8\u5bf9\u8f83\u5c11&#xff0c;\u5e76\u9010\u6e10\u6de1\u51fa\u4e3b\u6d41\u4f7f\u7528\u8303\u56f4\u3002<\/p>\n<p>\u4e0d\u8fc7&#xff0c;\u5728\u5b66\u4e60 I\/O \u591a\u8def\u590d\u7528\u673a\u5236\u65f6&#xff0c;\u7406\u89e3 select \u7684\u5de5\u4f5c\u539f\u7406\u4ecd\u7136\u5177\u6709\u91cd\u8981\u610f\u4e49\u3002\u6b63\u662f\u7531\u4e8e select \u66b4\u9732\u51fa\u7684\u8fd9\u4e9b\u95ee\u9898&#xff0c;\u540e\u7eed\u7cfb\u7edf\u63a5\u53e3&#xff08;\u4f8b\u5982 poll \u548c epoll&#xff09;\u624d\u5728\u8bbe\u8ba1\u4e0a\u9488\u5bf9\u8fd9\u4e9b\u7f3a\u9677\u8fdb\u884c\u4e86\u6539\u8fdb\u3002\u56e0\u6b64&#xff0c;\u5148\u7406\u89e3 select \u7684\u8bbe\u8ba1\u601d\u60f3\u4e0e\u5c40\u9650&#xff0c;\u6709\u52a9\u4e8e\u6211\u4eec\u66f4\u52a0\u81ea\u7136\u5730\u8fc7\u6e21\u5230\u540e\u7eed poll \u4e0e epoll \u7684\u5b66\u4e60&#xff0c;\u5e76\u4e3a\u6df1\u5165\u638c\u63e1\u8fd9\u4e9b\u9ad8\u6027\u80fd I\/O \u591a\u8def\u590d\u7528\u673a\u5236\u6253\u4e0b\u57fa\u7840\u3002<\/p>\n<h4>poll<\/h4>\n<p>\u90a3\u4e48\u63a5\u4e0b\u6765\u5c31\u8ba9\u6211\u4eec\u8fc7\u6e21\u5230 poll\u3002\u6839\u636e\u4e0a\u6587\u7684\u5206\u6790&#xff0c;\u6211\u4eec\u5df2\u7ecf\u8ba4\u8bc6\u5230 select \u63a5\u53e3\u6240\u5b58\u5728\u7684\u4e00\u4e9b\u5c40\u9650\u6027&#xff0c;\u800c poll \u63a5\u53e3 \u7684\u8bbe\u8ba1\u521d\u8877\u6b63\u662f\u4e3a\u4e86\u5728\u4e00\u5b9a\u7a0b\u5ea6\u4e0a\u7f13\u89e3\u8fd9\u4e9b\u95ee\u9898\u3002<\/p>\n<p>\u9996\u5148&#xff0c;select \u7684\u4e00\u4e2a\u91cd\u8981\u9650\u5236\u5728\u4e8e&#xff1a;\u5176\u5185\u90e8\u4f7f\u7528 \u4f4d\u56fe&#xff08;bitmap&#xff09; \u6765\u8868\u793a\u9700\u8981\u68c0\u6d4b\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u96c6\u5408&#xff0c;\u800c\u8be5\u4f4d\u56fe\u7684\u957f\u5ea6\u5728\u5b9e\u73b0\u4e0a\u901a\u5e38\u662f\u56fa\u5b9a\u7684\u3002\u56e0\u6b64&#xff0c;select \u80fd\u591f\u68c0\u6d4b\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u6570\u91cf\u662f\u6709\u9650\u7684\u3002\u5728 Linux \u7684\u9ed8\u8ba4\u5b9e\u73b0\u4e2d&#xff0c;\u901a\u5e38\u53ea\u80fd\u68c0\u6d4b \u6587\u4ef6\u63cf\u8ff0\u7b26\u503c\u5c0f\u4e8e 1024 \u7684\u60c5\u51b5\u3002\u4e00\u65e6\u6587\u4ef6\u63cf\u8ff0\u7b26\u7684\u503c\u8d85\u8fc7\u8be5\u8303\u56f4&#xff0c;\u4e3b\u7ebf\u7a0b\u5c31\u65e0\u6cd5\u518d\u5c06\u5176\u52a0\u5165\u5230\u5bf9\u5e94\u7684\u8bfb\u96c6\u5408\u6216\u5199\u96c6\u5408\u4e2d&#xff0c;\u8fd9\u5c31\u5bf9\u9ad8\u5e76\u53d1\u573a\u666f\u4e0b\u7684\u8fde\u63a5\u89c4\u6a21\u5f62\u6210\u4e86\u660e\u663e\u9650\u5236\u3002<\/p>\n<p>\u5176\u6b21&#xff0c;\u5728 select \u7684\u5b9e\u73b0\u4e2d&#xff0c;\u65e0\u8bba\u662f \u7528\u6237\u6001 \u8fd8\u662f \u5185\u6838\u6001&#xff0c;\u90fd\u9700\u8981\u5bf9\u6574\u4e2a\u4f4d\u56fe\u6570\u7ec4\u8fdb\u884c\u904d\u5386\u3002\u5728\u904d\u5386\u8fc7\u7a0b\u4e2d&#xff0c;\u5927\u91cf\u4f4d\u7f6e\u5b9e\u9645\u4e0a\u5e76\u6ca1\u6709\u5bf9\u5e94\u6709\u6548\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26&#xff0c;\u56e0\u6b64\u4f1a\u4ea7\u751f\u8f83\u591a \u65e0\u6548\u904d\u5386&#xff08;invalid traversal&#xff09;&#xff0c;\u4ece\u800c\u5e26\u6765\u989d\u5916\u7684\u65f6\u95f4\u5f00\u9500\u3002<\/p>\n<p>\u6b64\u5916&#xff0c;select \u7684\u63a5\u53e3\u53c2\u6570\u4e2d&#xff0c;\u9664\u4e86\u7b2c\u4e00\u4e2a\u53c2\u6570&#xff08;\u6700\u5927\u6587\u4ef6\u63cf\u8ff0\u7b26\u503c &#043;1&#xff09;\u4ee5\u5916&#xff0c;\u5176\u4f59\u591a\u4e2a\u53c2\u6570\u90fd\u5c5e\u4e8e \u8f93\u5165\u8f93\u51fa\u578b\u53c2\u6570&#xff08;in-out parameters&#xff09;\u3002\u8fd9\u610f\u5473\u7740\u8c03\u7528\u524d\u9700\u8981\u7531\u7528\u6237\u6001\u91cd\u65b0\u521d\u59cb\u5316&#xff0c;\u800c\u8c03\u7528\u8fd4\u56de\u540e\u53c8\u9700\u8981\u4ece\u540c\u4e00\u5757\u5185\u5b58\u4e2d\u8bfb\u53d6\u7ed3\u679c&#xff0c;\u8fd9\u79cd\u8bbe\u8ba1\u5728\u63a5\u53e3\u8bed\u4e49\u4e0a\u5e76\u4e0d\u5341\u5206\u6e05\u6670&#xff0c;\u4e5f\u589e\u52a0\u4e86\u4f7f\u7528\u590d\u6742\u5ea6\u3002<\/p>\n<p>\u6b63\u56e0\u4e3a\u4e0a\u8ff0\u8fd9\u4e9b\u95ee\u9898&#xff0c;poll \u63a5\u53e3\u88ab\u5f15\u5165&#xff0c;\u4ee5\u5bf9 select \u7684\u8fd9\u4e9b\u7f3a\u9677\u8fdb\u884c\u6539\u8fdb\u3002<\/p>\n<ul>\n<li>\u7cfb\u7edf\u8c03\u7528&#xff1a;poll<\/li>\n<li>\u5934\u6587\u4ef6&#xff1a;&lt;poll.h&gt;<\/li>\n<li>\u51fd\u6570\u58f0\u660e&#xff1a;int poll(struct pollfd *fds, nfds_t nfds, int timeout)<\/li>\n<li>\u8fd4\u56de\u503c&#xff1a;\u6210\u529f&#xff1a;\u8fd4\u56de revents \u975e\u96f6\u7684\u7ed3\u6784\u4f53\u6570\u91cf&#xff1b;\u8d85\u65f6&#xff1a;\u8fd4\u56de 0&#xff1b;\u9519\u8bef&#xff1a;\u8fd4\u56de -1 \u5e76\u8bbe\u7f6e errno\u3002<\/li>\n<\/ul>\n<p>poll \u7684\u7b2c\u4e00\u4e2a\u53c2\u6570\u662f\u4e00\u4e2a\u6307\u9488&#xff0c;\u8be5\u6307\u9488\u6307\u5411\u4e00\u4e2a \u7ed3\u6784\u4f53\u6570\u7ec4\u3002\u6570\u7ec4\u4e2d\u7684\u6bcf\u4e2a\u5143\u7d20\u7c7b\u578b\u4e3a struct pollfd&#xff0c;\u7528\u4e8e\u63cf\u8ff0\u4e00\u4e2a\u9700\u8981\u88ab\u76d1\u89c6\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u53ca\u5176\u5bf9\u5e94\u7684\u4e8b\u4ef6\u3002<\/p>\n<p><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">pollfd<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">int<\/span>   fd<span class=\"token punctuation\">;<\/span>      <span class=\"token comment\">\/* \u8981\u76d1\u89c6\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26 *\/<\/span><br \/>\n    <span class=\"token keyword\">short<\/span> events<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/* \u5173\u5fc3\u7684\u4e8b\u4ef6&#xff08;\u8f93\u5165&#xff09; *\/<\/span><br \/>\n    <span class=\"token keyword\">short<\/span> revents<span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/* \u5b9e\u9645\u53d1\u751f\u7684\u4e8b\u4ef6&#xff08;\u8f93\u51fa&#xff09; *\/<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>\u53ef\u4ee5\u770b\u5230&#xff0c;struct pollfd \u7ed3\u6784\u4f53\u5305\u542b\u4e09\u4e2a\u5b57\u6bb5\u3002\u8be5\u7ed3\u6784\u4f53\u7684\u8bbe\u8ba1\u5728\u4e00\u5b9a\u7a0b\u5ea6\u4e0a\u89e3\u51b3\u4e86 select \u63a5\u53e3\u4e2d \u8f93\u5165\u8f93\u51fa\u53c2\u6570\u6df7\u5408 \u7684\u95ee\u9898\u3002<\/p>\n<p>\u9700\u8981\u6ce8\u610f\u7684\u662f&#xff1a;\u6574\u4e2a\u7ed3\u6784\u4f53\u6570\u7ec4\u5728\u8bed\u4e49\u4e0a\u4ecd\u7136\u5c5e\u4e8e \u8f93\u5165\u8f93\u51fa\u578b\u53c2\u6570&#xff0c;\u4f46\u662f poll \u901a\u8fc7\u7ed3\u6784\u4f53\u5185\u90e8\u5b57\u6bb5\u7684\u5212\u5206&#xff0c;\u4f7f \u8f93\u5165\u4fe1\u606f\u4e0e\u8f93\u51fa\u4fe1\u606f\u5728\u903b\u8f91\u4e0a\u8fdb\u884c\u4e86\u5206\u79bb\u3002\u5176\u4e2d&#xff1a;<\/p>\n<ul>\n<li>events \u5b57\u6bb5\u4f5c\u4e3a \u8f93\u5165\u53c2\u6570&#xff0c;\u7528\u4e8e\u544a\u8bc9\u5185\u6838\u5f53\u524d\u5173\u5fc3\u54ea\u4e9b\u4e8b\u4ef6&#xff1b;<\/li>\n<li>revents \u5b57\u6bb5\u4f5c\u4e3a \u8f93\u51fa\u53c2\u6570&#xff0c;\u7531\u5185\u6838\u5728\u8fd4\u56de\u65f6\u586b\u5199&#xff0c;\u7528\u4e8e\u8868\u793a\u8be5\u6587\u4ef6\u63cf\u8ff0\u7b26\u4e0a\u5b9e\u9645\u53d1\u751f\u7684\u4e8b\u4ef6\u3002<\/li>\n<\/ul>\n<p>\u6b64\u5916&#xff0c;\u8fd9\u4e2a\u7ed3\u6784\u4f53\u6570\u7ec4\u4e2d\u7684\u6bcf\u4e00\u4e2a\u5143\u7d20\u90fd\u663e\u5f0f\u5730\u63cf\u8ff0\u4e86\u4e00\u4e2a \u9700\u8981\u88ab\u76d1\u89c6\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26&#xff08;\u5373fd\u5b57\u6bb5&#xff09;&#xff0c;\u56e0\u6b64\u4e0d\u5b58\u5728\u50cf select \u4f4d\u56fe\u90a3\u6837\u7684\u5927\u91cf\u65e0\u6548\u4f4d\u7f6e\u3002\u5185\u6838\u53ea\u9700\u8981\u904d\u5386\u8be5\u6570\u7ec4&#xff0c;\u8bfb\u53d6 fd \u5b57\u6bb5&#xff0c;\u5c31\u53ef\u4ee5\u6709\u9488\u5bf9\u6027\u5730\u68c0\u6d4b\u5bf9\u5e94\u6587\u4ef6\u63cf\u8ff0\u7b26\u7684\u72b6\u6001&#xff0c;\u4ece\u800c\u51cf\u5c11\u4e0d\u5fc5\u8981\u7684\u904d\u5386\u5f00\u9500\u3002<\/p>\n<p>\u56e0\u6b64\u53ef\u4ee5\u8ba4\u4e3a&#xff0c;struct pollfd \u7684\u5f15\u5165\u5728\u63a5\u53e3\u5c42\u9762\u4e0a\u540c\u65f6\u6539\u8fdb\u4e86\u4e24\u70b9&#xff1a;<\/p>\n<li>\u8f93\u5165\u4e0e\u8f93\u51fa\u4fe1\u606f\u903b\u8f91\u5206\u79bb&#xff0c;\u4f7f\u63a5\u53e3\u8bed\u4e49\u66f4\u52a0\u6e05\u6670&#xff1b;<\/li>\n<li>\u907f\u514d\u4f4d\u56fe\u7ed3\u6784\u5e26\u6765\u7684\u5927\u91cf\u65e0\u6548\u904d\u5386\u95ee\u9898\u3002<\/li>\n<p>\u63a5\u4e0b\u6765\u518d\u6765\u770b events \u5b57\u6bb5\u3002\u8be5\u5b57\u6bb5\u5c5e\u4e8e \u8f93\u5165\u578b\u53c2\u6570&#xff0c;\u7528\u4e8e\u544a\u8bc9\u5185\u6838\u9700\u8981\u68c0\u6d4b\u54ea\u4e9b\u7c7b\u578b\u7684\u4e8b\u4ef6&#xff0c;\u4f8b\u5982\u8bfb\u4e8b\u4ef6\u3001\u5199\u4e8b\u4ef6\u7b49\u3002\u800c revents \u5b57\u6bb5\u5219\u7531\u5185\u6838\u5728\u8fd4\u56de\u65f6\u586b\u5199&#xff0c;\u5176\u503c\u540c\u6837\u7531 Linux \u5185\u6838\u5b9a\u4e49\u7684\u4e00\u7ec4 \u4e8b\u4ef6\u5b8f&#xff08;event flags&#xff09; \u8868\u793a&#xff1a;<\/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\">POLLIN<\/span>     <span class=\"token expression\"><span class=\"token number\">0x001<\/span>    <\/span><span class=\"token comment\">\/\/ \u4e8c\u8fdb\u5236&#xff1a;0000 0000 0001  \u6709\u6570\u636e\u53ef\u8bfb<\/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\">POLLPRI<\/span>    <span class=\"token expression\"><span class=\"token number\">0x002<\/span>    <\/span><span class=\"token comment\">\/\/ \u4e8c\u8fdb\u5236&#xff1a;0000 0000 0010  \u6709\u7d27\u6025\u6570\u636e\u53ef\u8bfb<\/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\">POLLOUT<\/span>    <span class=\"token expression\"><span class=\"token number\">0x004<\/span>    <\/span><span class=\"token comment\">\/\/ \u4e8c\u8fdb\u5236&#xff1a;0000 0000 0100  \u53ef\u4ee5\u5199\u5165\u6570\u636e<\/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\">POLLERR<\/span>    <span class=\"token expression\"><span class=\"token number\">0x008<\/span>    <\/span><span class=\"token comment\">\/\/ \u4e8c\u8fdb\u5236&#xff1a;0000 0000 1000  \u53d1\u751f\u9519\u8bef&#xff08;\u4ec5\u8f93\u51fa&#xff09;<\/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\">POLLHUP<\/span>    <span class=\"token expression\"><span class=\"token number\">0x010<\/span>    <\/span><span class=\"token comment\">\/\/ \u4e8c\u8fdb\u5236&#xff1a;0000 0001 0000  \u6302\u8d77&#xff08;\u4ec5\u8f93\u51fa&#xff09;<\/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\">POLLNVAL<\/span>   <span class=\"token expression\"><span class=\"token number\">0x020<\/span>    <\/span><span class=\"token comment\">\/\/ \u4e8c\u8fdb\u5236&#xff1a;0000 0010 0000  \u65e0\u6548\u8bf7\u6c42&#xff08;fd \u672a\u6253\u5f00&#xff0c;\u4ec5\u8f93\u51fa&#xff09;<\/span><\/span><\/p>\n<p>\u7531\u4e8e\u8fd9\u4e9b\u4e8b\u4ef6\u5b8f\u672c\u8d28\u4e0a\u662f \u4f4d\u6807\u5fd7&#xff08;bit flags&#xff09;&#xff0c;\u56e0\u6b64\u5982\u679c\u9700\u8981\u540c\u65f6\u68c0\u6d4b\u591a\u4e2a\u4e8b\u4ef6&#xff0c;\u53ea\u9700\u8981\u901a\u8fc7 \u6309\u4f4d\u6216\u8fd0\u7b97&#xff08;bitwise OR&#xff09; \u5c06\u591a\u4e2a\u4e8b\u4ef6\u7ec4\u5408\u5373\u53ef\u3002\u4f8b\u5982\u540c\u65f6\u68c0\u6d4b\u8bfb\u4e8b\u4ef6\u548c\u5199\u4e8b\u4ef6&#xff0c;\u53ef\u4ee5\u8bbe\u7f6e\u4e3a&#xff1a;<\/p>\n<p>events &#061; POLLIN | POLLOUT<\/p>\n<p>\u5728\u5b9e\u9645\u6267\u884c\u8fc7\u7a0b\u4e2d&#xff0c;poll \u7684\u5e95\u5c42\u884c\u4e3a\u5927\u81f4\u53ef\u4ee5\u6982\u62ec\u4e3a\u4ee5\u4e0b\u6b65\u9aa4&#xff1a;<\/p>\n<li>\u5185\u6838\u63a5\u6536\u5230\u7528\u6237\u6001\u4f20\u5165\u7684 struct pollfd \u6570\u7ec4&#xff1b;<\/li>\n<li>\u904d\u5386\u8be5\u6570\u7ec4&#xff0c;\u8bfb\u53d6\u6bcf\u4e2a\u5143\u7d20\u7684 fd \u5b57\u6bb5&#xff1b;<\/li>\n<li>\u6839\u636e fd \u627e\u5230\u5bf9\u5e94\u7684 file \u7ed3\u6784\u4f53&#xff1b;<\/li>\n<li>\u6839\u636e events \u5b57\u6bb5\u5224\u65ad\u9700\u8981\u68c0\u6d4b\u7684\u4e8b\u4ef6\u7c7b\u578b&#xff1b;<\/li>\n<li>\u8c03\u7528\u8be5\u6587\u4ef6\u5bf9\u8c61 file_operations \u4e2d\u7684 poll \u51fd\u6570&#xff08;\u5373 f_op-&gt;poll&#xff09;&#xff1b;<\/li>\n<li>\u82e5\u5bf9\u5e94\u6761\u4ef6\u6ee1\u8db3&#xff0c;\u5219\u5728 revents \u5b57\u6bb5\u4e2d\u8bbe\u7f6e\u76f8\u5e94\u7684\u5c31\u7eea\u4e8b\u4ef6\u6807\u5fd7\u3002<\/li>\n<p>poll \u7684\u7b2c\u4e8c\u4e2a\u53c2\u6570 nfds \u8868\u793a \u7ed3\u6784\u4f53\u6570\u7ec4\u7684\u957f\u5ea6&#xff0c;\u5373\u9700\u8981\u76d1\u89c6\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u6570\u91cf\u3002<\/p>\n<p>\u6700\u540e\u4e00\u4e2a\u53c2\u6570 timeout \u662f\u4e00\u4e2a \u8f93\u5165\u578b\u53c2\u6570&#xff0c;\u7528\u4e8e\u6307\u5b9a poll \u7684\u8d85\u65f6\u65f6\u95f4&#xff08;\u5355\u4f4d\u4e3a\u6beb\u79d2&#xff09;\u3002\u5982\u679c\u5728\u6307\u5b9a\u65f6\u95f4\u5185\u6ca1\u6709\u4efb\u4f55\u4e8b\u4ef6\u5c31\u7eea&#xff0c;\u90a3\u4e48 poll \u4f1a\u56e0\u4e3a \u8d85\u65f6 \u800c\u8fd4\u56de&#xff0c;\u6b64\u65f6\u8fd4\u56de\u503c\u4e3a 0&#xff0c;\u8fdb\u7a0b\u4e5f\u4f1a\u4ece\u963b\u585e\u72b6\u6001\u88ab\u5524\u9192\u3002<\/p>\n<p>\u9700\u8981\u7279\u522b\u6ce8\u610f\u7684\u662f&#xff1a;\u5373\u4f7f\u4f7f\u7528 poll&#xff0c;\u5176\u5e95\u5c42\u4ecd\u7136\u4e0d\u53ef\u907f\u514d\u5730\u4f1a\u5b58\u5728 O(N) \u7ea7\u522b\u7684\u904d\u5386\u64cd\u4f5c\u3002\u5177\u4f53\u6765\u8bf4&#xff0c;\u4ecd\u7136\u5305\u62ec\u4e24\u90e8\u5206\u904d\u5386&#xff1a;<\/p>\n<li>\u5185\u6838\u6001\u904d\u5386&#xff1a;\u5185\u6838\u904d\u5386 pollfd \u6570\u7ec4&#xff0c;\u68c0\u67e5\u6bcf\u4e2a\u6587\u4ef6\u63cf\u8ff0\u7b26\u7684\u72b6\u6001&#xff1b;<\/li>\n<li>\u7528\u6237\u6001\u904d\u5386&#xff1a;poll \u8fd4\u56de\u540e&#xff0c;\u7528\u6237\u7a0b\u5e8f\u4ecd\u7136\u9700\u8981\u904d\u5386\u8be5\u6570\u7ec4&#xff0c;\u4ee5\u786e\u8ba4\u54ea\u4e9b revents \u5b57\u6bb5\u88ab\u8bbe\u7f6e&#xff0c;\u4ece\u800c\u786e\u5b9a\u54ea\u4e9b\u6587\u4ef6\u63cf\u8ff0\u7b26\u5df2\u7ecf\u5c31\u7eea\u3002<\/li>\n<p>\u4e0d\u8fc7&#xff0c;\u4e0e select \u76f8\u6bd4&#xff0c;poll \u7684\u904d\u5386\u5bf9\u8c61\u4e0d\u518d\u662f\u56fa\u5b9a\u5927\u5c0f\u7684\u4f4d\u56fe&#xff0c;\u800c\u662f \u53ea\u5305\u542b\u6709\u6548\u6587\u4ef6\u63cf\u8ff0\u7b26\u7684\u7ed3\u6784\u4f53\u6570\u7ec4\u3002\u56e0\u6b64&#xff0c;\u65e0\u8bba\u5728\u5185\u6838\u6001\u8fd8\u662f\u7528\u6237\u6001&#xff0c;\u90fd\u53ef\u4ee5\u663e\u8457\u51cf\u5c11\u65e0\u6548\u904d\u5386\u7684\u6570\u91cf&#xff0c;\u4ece\u800c\u5728\u5b9e\u8df5\u4e2d\u83b7\u5f97\u66f4\u597d\u7684\u6548\u7387\u8868\u73b0\u3002<\/p>\n<p>\u6b64\u5916&#xff0c;poll \u4e5f \u4e0d\u518d\u5bf9\u6587\u4ef6\u63cf\u8ff0\u7b26\u7684\u6700\u5927\u503c\u505a\u56fa\u5b9a\u9650\u5236\u3002\u7531\u4e8e\u5176\u4f7f\u7528\u7684\u662f\u6570\u7ec4\u7ed3\u6784&#xff0c;\u5e76\u901a\u8fc7 nfds \u53c2\u6570\u663e\u5f0f\u6307\u5b9a\u6570\u7ec4\u957f\u5ea6&#xff0c;\u56e0\u6b64\u8be5\u6570\u7ec4\u53ef\u4ee5\u662f \u52a8\u6001\u5206\u914d\u7684\u3002\u53ea\u8981\u4f20\u5165\u6b63\u786e\u7684 nfds \u503c&#xff0c;\u5185\u6838\u5c31\u80fd\u591f\u77e5\u9053\u9700\u8981\u68c0\u67e5\u591a\u5c11\u4e2a\u6587\u4ef6\u63cf\u8ff0\u7b26&#xff0c;\u4ece\u800c\u5728\u63a5\u53e3\u5c42\u9762\u89e3\u51b3\u4e86 select \u7684 \u6587\u4ef6\u63cf\u8ff0\u7b26\u6570\u91cf\u4e0a\u9650\u95ee\u9898\u3002<\/p>\n<h2>\u7528Poll\u5b9e\u73b0\u9ad8\u5e76\u53d1\u7684HTTP\u670d\u52a1\u5668<\/h2>\n<h3>Poll_Server<\/h3>\n<p>\u81f3\u6b64&#xff0c;\u4e0a\u6587\u5df2\u7ecf\u4e3a\u6211\u4eec\u5efa\u7acb\u4e86 poll \u7684\u7406\u8bba\u57fa\u7840&#xff0c;\u5e76\u4e86\u89e3\u4e86\u5982\u4f55\u4f7f\u7528 poll \u63a5\u53e3\u3002\u63a5\u4e0b\u6765&#xff0c;\u6211\u4eec\u4fbf\u53ef\u4ee5\u7740\u624b\u5b9e\u73b0\u4e00\u4e2a HTTP \u670d\u52a1\u5668\u3002\u5728\u5b9e\u73b0\u8fc7\u7a0b\u4e2d&#xff0c;\u6211\u4eec\u9009\u62e9\u4f7f\u7528 C&#043;&#043; \u8fdb\u884c\u4ee3\u7801\u7f16\u5199\u3002\u7531\u4e8e C&#043;&#043; \u662f\u4e00\u95e8\u5178\u578b\u7684 \u9762\u5411\u5bf9\u8c61\u7f16\u7a0b\u8bed\u8a00&#xff0c;\u56e0\u6b64\u8fd9\u91cc\u5c06\u670d\u52a1\u5668\u62bd\u8c61\u4e3a\u4e00\u4e2a\u5bf9\u8c61&#xff0c;\u901a\u8fc7\u4e00\u4e2a Poll_Server \u7c7b\u6765\u8fdb\u884c\u63cf\u8ff0\u3002<\/p>\n<p>\u800c\u8fd9\u4e2a Poll_Server \u7c7b\u9996\u5148\u5fc5\u7136\u4f1a\u5305\u542b\u4e00\u4e2a \u76d1\u542c\u5957\u63a5\u5b57\u3002\u8fd9\u91cc\u6211\u4eec\u5c06\u5957\u63a5\u5b57\u8fdb\u4e00\u6b65\u5c01\u88c5\u4e3a\u4e00\u4e2a sock \u7c7b&#xff0c;\u5176\u4e2d sock \u7c7b\u5185\u90e8\u5305\u542b\u4e00\u4e2a\u539f\u59cb\u7684 \u6587\u4ef6\u63cf\u8ff0\u7b26&#xff08;file descriptor&#xff09;&#xff0c;\u5e76\u4e14\u5c06\u6240\u6709\u4e0e\u5957\u63a5\u5b57\u76f8\u5173\u7684\u7cfb\u7edf\u8c03\u7528\u63a5\u53e3\u5c01\u88c5\u4e3a sock \u7c7b\u7684\u6210\u5458\u51fd\u6570&#xff0c;\u4f8b\u5982 socket \u6210\u5458\u51fd\u6570\u4ee5\u53ca accept \u6210\u5458\u51fd\u6570\u7b49\u3002\u540c\u65f6&#xff0c;\u5bf9\u8fd9\u4e9b\u7cfb\u7edf\u8c03\u7528\u7684\u8fd4\u56de\u503c\u4e5f\u8fdb\u884c\u4e86\u7edf\u4e00\u5904\u7406&#xff1a;\u5982\u679c\u51fa\u73b0\u9519\u8bef&#xff0c;\u5219\u4f1a\u8bb0\u5f55\u76f8\u5e94\u7684\u65e5\u5fd7\u5e76\u7ec8\u6b62\u7a0b\u5e8f\u6267\u884c\u3002<\/p>\n<p>\u6b64\u5916&#xff0c;\u8be5\u5c01\u88c5\u8fd8\u5e94\u7528\u4e86 RAII&#xff08;Resource Acquisition Is Initialization&#xff09;\u601d\u60f3&#xff0c;\u5373\u5c06\u5957\u63a5\u5b57\u8d44\u6e90\u7684\u751f\u547d\u5468\u671f\u4ea4\u7531\u5bf9\u8c61\u81ea\u52a8\u7ba1\u7406\u3002\u5f53 sock \u5bf9\u8c61\u88ab\u9500\u6bc1\u65f6&#xff0c;\u5176\u6790\u6784\u51fd\u6570\u4f1a\u81ea\u52a8\u8c03\u7528 close \u91ca\u653e\u5957\u63a5\u5b57\u8d44\u6e90&#xff0c;\u4ece\u800c\u907f\u514d\u8d44\u6e90\u6cc4\u6f0f\u3002\u56e0\u6b64&#xff0c;Poll_Server \u7c7b\u4f1a\u5305\u542b\u4e00\u4e2a sock \u7c7b\u578b\u7684\u5bf9\u8c61&#xff0c;\u8be5\u5bf9\u8c61\u7528\u4e8e\u8868\u793a\u76d1\u542c\u5957\u63a5\u5b57\u3002\u540c\u65f6&#xff0c;Poll_Server \u7c7b\u4e2d\u8fd8\u4f1a\u5305\u542b\u4e00\u4e2a string \u7c7b\u578b\u7684\u6210\u5458\u53d8\u91cf&#xff0c;\u7528\u4e8e\u8868\u793a IP \u5730\u5740&#xff0c;\u4ee5\u53ca\u4e00\u4e2a uint16_t \u7c7b\u578b\u7684\u6210\u5458\u53d8\u91cf&#xff0c;\u7528\u4e8e\u8868\u793a \u7aef\u53e3\u53f7\u3002<\/p>\n<p>Poll_Server \u7c7b\u7684\u6784\u9020\u51fd\u6570\u4e3b\u8981\u7528\u4e8e\u521d\u59cb\u5316\u76d1\u542c\u5957\u63a5\u5b57\u7ed1\u5b9a\u7684 IP \u5730\u5740\u548c \u7aef\u53e3\u53f7\u3002\u8be5\u6784\u9020\u51fd\u6570\u63a5\u6536\u4e24\u4e2a\u53c2\u6570&#xff0c;\u5206\u522b\u7528\u4e8e\u521d\u59cb\u5316 string \u7c7b\u578b\u7684 IP \u5730\u5740\u4ee5\u53ca\u7aef\u53e3\u53f7&#xff0c;\u5e76\u4e14\u8fd9\u4e24\u4e2a\u53c2\u6570\u90fd\u8bbe\u7f6e\u4e86 \u7f3a\u7701\u503c\u3002\u5176\u4e2d IP \u5730\u5740\u7684\u7f3a\u7701\u503c\u4e3a &#034;0.0.0.0&#034;&#xff0c;\u8868\u793a\u76d1\u542c\u672c\u673a\u6240\u6709\u7f51\u7edc\u63a5\u53e3\u53d1\u9001\u5230\u8be5\u7aef\u53e3\u53f7\u7684\u6570\u636e\u62a5\u3002<\/p>\n<p>\u63a5\u4e0b\u6765\u662f init \u51fd\u6570\u3002init \u51fd\u6570\u7684\u4e3b\u8981\u804c\u8d23\u662f\u5b8c\u6210\u670d\u52a1\u5668\u542f\u52a8\u524d\u7684\u521d\u59cb\u5316\u5de5\u4f5c\u3002\u9996\u5148\u4f1a\u521b\u5efa\u4e00\u4e2a\u76d1\u542c\u5957\u63a5\u5b57&#xff0c;\u5373\u8c03\u7528 sock \u5bf9\u8c61\u7684 socket \u63a5\u53e3\u3002\u6210\u529f\u521b\u5efa\u76d1\u542c\u5957\u63a5\u5b57\u4e4b\u540e&#xff0c;\u63a5\u4e0b\u6765\u4f1a\u8c03\u7528 bind \u51fd\u6570&#xff0c;\u4f7f\u8be5\u76d1\u542c\u5957\u63a5\u5b57\u7ed1\u5b9a\u6307\u5b9a\u7684 IP \u5730\u5740\u548c\u7aef\u53e3\u53f7\u3002<\/p>\n<p>\u9664\u6b64\u4e4b\u5916&#xff0c;\u8fd9\u91cc\u8fd8\u4f1a\u8fdb\u884c\u4e00\u4e2a\u989d\u5916\u7684\u914d\u7f6e&#xff1a;\u5c06\u76d1\u542c\u5957\u63a5\u5b57\u7684\u9ed8\u8ba4\u884c\u4e3a\u8bbe\u7f6e\u4e3a \u975e\u963b\u585e\u6a21\u5f0f\u3002\u81f3\u4e8e\u4e3a\u4ec0\u4e48\u9700\u8981\u5c06\u5176\u8bbe\u7f6e\u4e3a\u975e\u963b\u585e&#xff0c;\u8fd9\u4e00\u70b9\u5c06\u5728\u540e\u6587\u8fdb\u884c\u8be6\u7ec6\u89e3\u91ca&#xff0c;\u8fd9\u91cc\u5148\u6682\u65f6\u57cb\u4e0b\u4e00\u4e2a\u4f0f\u7b14\u3002\u56e0\u6b64&#xff0c;init \u51fd\u6570\u5b8c\u6210\u7684\u4e3b\u8981\u5de5\u4f5c\u5c31\u662f&#xff1a;<\/p>\n<li>\u521b\u5efa\u76d1\u542c\u5957\u63a5\u5b57<\/li>\n<li>\u7ed1\u5b9a IP \u5730\u5740\u4e0e\u7aef\u53e3\u53f7<\/li>\n<li>\u5c06\u76d1\u542c\u5957\u63a5\u5b57\u8bbe\u7f6e\u4e3a\u975e\u963b\u585e\u6a21\u5f0f<\/li>\n<p>\u5982\u679c\u4ee5\u4e0a\u64cd\u4f5c\u5168\u90e8\u6210\u529f&#xff0c;\u5219 init \u51fd\u6570\u8fd4\u56de true\u3002<\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">Poll_Server<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">public<\/span><span class=\"token operator\">:<\/span><br \/>\n        <span class=\"token function\">Poll_Server<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">uint16_t<\/span> _port<span class=\"token operator\">&#061;<\/span><span class=\"token number\">8888<\/span><span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string _ip<span class=\"token operator\">&#061;<\/span>_deafault<span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token operator\">:<\/span><span class=\"token function\">port<\/span><span class=\"token punctuation\">(<\/span>_port<span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token punctuation\">,<\/span> <span class=\"token function\">ip<\/span><span class=\"token punctuation\">(<\/span>_ip<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><\/p>\n<p>        <span class=\"token punctuation\">}<\/span><br \/>\n      <span class=\"token keyword\">bool<\/span> <span class=\"token function\">init<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n                listensock<span class=\"token punctuation\">.<\/span><span class=\"token function\">socket<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                listensock<span class=\"token punctuation\">.<\/span><span class=\"token function\">bind<\/span><span class=\"token punctuation\">(<\/span>ip<span class=\"token punctuation\">,<\/span> port<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                listensock<span class=\"token punctuation\">.<\/span><span class=\"token function\">setnonblock<\/span><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 boolean\">true<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token comment\">\/\/&#8230;<\/span><br \/>\n    <span class=\"token keyword\">private<\/span><span class=\"token operator\">:<\/span><br \/>\n        sock listensock<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">uint16_t<\/span> port<span class=\"token punctuation\">;<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>string ip<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token comment\">\/\/&#8230;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>\u5f53 init \u51fd\u6570\u8c03\u7528\u6210\u529f\u4e4b\u540e&#xff0c;\u63a5\u4e0b\u6765\u4fbf\u4f1a\u8c03\u7528 start \u51fd\u6570\u3002start \u51fd\u6570\u9996\u5148\u4f1a\u5c06\u76d1\u542c\u5957\u63a5\u5b57\u8bbe\u7f6e\u4e3a \u76d1\u542c\u72b6\u6001&#xff0c;\u4e5f\u5c31\u662f\u8c03\u7528 listen \u63a5\u53e3\u3002\u5f53\u76d1\u542c\u5957\u63a5\u5b57\u6210\u529f\u8fdb\u5165 listen \u72b6\u6001\u4e4b\u540e&#xff0c;\u63a5\u4e0b\u6765\u9700\u8981\u5c06\u76d1\u542c\u5957\u63a5\u5b57\u7684fd\u6dfb\u52a0\u8fdb \u8f85\u52a9\u6570\u7ec4\u3002<\/p>\n<h3>pollmanager\u4ee5\u53ca\u8f85\u52a9\u6570\u7ec4\u4ee5\u53ca\u5feb\u7167\u673a\u5236<\/h3>\n<p>\u8fd9\u4e2a\u8f85\u52a9\u6570\u7ec4\u540c\u6837\u662f Poll_Server \u5bf9\u8c61\u4e2d\u7684\u4e00\u4e2a\u6210\u5458\u53d8\u91cf\u3002\u6211\u4eec\u77e5\u9053&#xff0c;\u5bf9\u4e8e poll \u63a5\u53e3\u800c\u8a00&#xff0c;\u5b83\u4e0e select \u4e0d\u540c&#xff1a;poll \u5e76\u4e0d\u5b58\u5728\u7c7b\u4f3c FD_SETSIZE \u7684\u56fa\u5b9a\u6587\u4ef6\u63cf\u8ff0\u7b26\u6570\u91cf\u9650\u5236&#xff0c;\u56e0\u6b64\u8fd9\u91cc\u7528\u4e8e\u7ef4\u62a4\u6587\u4ef6\u63cf\u8ff0\u7b26\u96c6\u5408\u7684\u6570\u636e\u7ed3\u6784\u9009\u62e9\u4f7f\u7528 vector \u6765\u5b9e\u73b0\u3002<\/p>\n<p>\u5177\u4f53\u6765\u8bf4&#xff0c;\u8fd9\u4e2a vector \u6570\u7ec4\u4e2d\u7684\u6bcf\u4e00\u4e2a\u5143\u7d20\u7c7b\u578b\u90fd\u662f pollfd\u3002\u4e4b\u6240\u4ee5\u4e0d\u9009\u62e9\u4f7f\u7528\u9759\u6001\u6570\u7ec4&#xff0c;\u662f\u56e0\u4e3a vector \u5185\u90e8\u7ef4\u62a4\u7684\u662f \u52a8\u6001\u6570\u7ec4\u7ed3\u6784&#xff0c;\u53ef\u4ee5\u5728\u8fd0\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u6269\u5bb9&#xff0c;\u800c\u9759\u6001\u6570\u7ec4\u7684\u957f\u5ea6\u5728\u7f16\u8bd1\u671f\u5df2\u7ecf\u56fa\u5b9a\u3002\u56e0\u6b64&#xff0c;\u4ece\u8bbe\u8ba1\u89d2\u5ea6\u6765\u770b&#xff0c;vector \u66f4\u7b26\u5408 poll \u4e0d\u9650\u5236\u76d1\u63a7\u6587\u4ef6\u63cf\u8ff0\u7b26\u6570\u91cf\u7684\u7279\u70b9\u3002<\/p>\n<p>\u7136\u800c&#xff0c;\u8fd9\u91cc\u53c8\u4f1a\u5f15\u5165\u4e00\u4e2a\u65b0\u7684\u95ee\u9898\u3002\u5728\u4e4b\u524d\u5b9e\u73b0 select \u65f6&#xff0c;\u6211\u4eec\u4f7f\u7528\u7684\u662f \u9759\u6001\u6570\u7ec4 \u6765\u5b9e\u73b0\u8f85\u52a9\u6570\u7ec4\u3002\u7531\u4e8e select \u6700\u591a\u68c0\u6d4b 1024 \u4e2a\u6587\u4ef6\u63cf\u8ff0\u7b26&#xff0c;\u56e0\u6b64\u53ea\u9700\u8981\u5b9a\u4e49\u4e00\u4e2a\u957f\u5ea6\u4e3a 1024 \u7684\u9759\u6001\u6570\u7ec4\u5373\u53ef\u3002\u540c\u65f6&#xff0c;\u6570\u7ec4\u4e0b\u6807\u5929\u7136\u5c31\u53ef\u4ee5\u4e0e \u6587\u4ef6\u63cf\u8ff0\u7b26\u7684\u503c\u4e00\u4e00\u5bf9\u5e94\u3002\u4f8b\u5982&#xff0c;\u5f53\u6211\u4eec\u9700\u8981\u5c06\u67d0\u4e2a\u6587\u4ef6\u63cf\u8ff0\u7b26\u52a0\u5165\u8bfb\u96c6\u5408\u65f6&#xff0c;\u53ea\u9700\u8981\u5c06\u8be5 fd \u4f5c\u4e3a\u6570\u7ec4\u4e0b\u6807&#xff0c;\u7136\u540e\u76f4\u63a5\u8bbf\u95ee\u5bf9\u5e94\u4f4d\u7f6e\u5e76\u8bbe\u7f6e\u4e3a 1 \u5373\u53ef\u3002<\/p>\n<p>\u800c\u73b0\u5728\u8fd9\u91cc\u91c7\u7528\u7684\u662f vector&#xff08;\u52a8\u6001\u6570\u7ec4&#xff09; \u7684\u65b9\u5f0f\u6765\u7ef4\u62a4\u6587\u4ef6\u63cf\u8ff0\u7b26\u96c6\u5408\u3002\u5f53\u9700\u8981\u5c06\u67d0\u4e2a\u6587\u4ef6\u63cf\u8ff0\u7b26\u52a0\u5165\u8bfb\u96c6\u5408\u65f6&#xff0c;\u53ea\u80fd\u901a\u8fc7 \u5c3e\u63d2&#xff08;push_back&#xff09; \u7684\u65b9\u5f0f\u52a0\u5165\u6570\u7ec4\u3002\u8fd9\u5c31\u610f\u5473\u7740 \u6570\u7ec4\u4e0b\u6807\u4e0e\u6587\u4ef6\u63cf\u8ff0\u7b26\u4e4b\u95f4\u4e0d\u518d\u5177\u6709\u5929\u7136\u7684\u6620\u5c04\u5173\u7cfb\u3002<\/p>\n<p>\u8fd9\u79cd\u53d8\u5316\u5e26\u6765\u7684\u4e3b\u8981\u5f71\u54cd\u4f53\u73b0\u5728 \u5220\u9664\u6587\u4ef6\u63cf\u8ff0\u7b26 \u7684\u573a\u666f\u3002\u4f8b\u5982&#xff0c;\u5f53\u5ba2\u6237\u7aef\u4e3b\u52a8\u5173\u95ed\u8fde\u63a5&#xff0c;\u6216\u8005\u8fde\u63a5\u751f\u547d\u5468\u671f\u7ed3\u675f\u65f6&#xff0c;\u670d\u52a1\u5668\u4e5f\u9700\u8981\u5173\u95ed\u5bf9\u5e94\u7684\u5957\u63a5\u5b57\u3002\u4e00\u65e6\u5173\u95ed\u5957\u63a5\u5b57&#xff0c;\u4e0e\u4e4b\u5bf9\u5e94\u7684 file \u7ed3\u6784\u4f53\u4e5f\u4f1a\u88ab\u91ca\u653e&#xff0c;\u6b64\u65f6\u5bf9\u5e94\u7684 \u6587\u4ef6\u63cf\u8ff0\u7b26\u5931\u6548&#xff0c;\u5c31\u5fc5\u987b\u5c06\u5176\u4ece\u8bfb\u96c6\u5408\u5bf9\u5e94\u7684 vector \u6570\u7ec4\u4e2d\u5220\u9664\u3002<\/p>\n<p>\u9700\u8981\u6ce8\u610f\u7684\u662f&#xff0c;\u8fd9\u4e2a vector \u4e2d\u7ef4\u62a4\u7684\u5168\u90e8\u90fd\u662f \u5f53\u524d\u4ecd\u7136\u6709\u6548\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u3002\u56e0\u6b64\u8fd9\u91cc\u7684\u5220\u9664\u64cd\u4f5c\u5e76\u4e0d\u662f\u7b80\u5355\u5730\u5c06\u67d0\u4e2a\u4f4d\u7f6e\u7684\u503c\u8986\u76d6&#xff0c;\u800c\u662f\u9700\u8981\u771f\u6b63\u7f29\u5c0f\u6570\u7ec4\u5927\u5c0f&#xff0c;\u4e5f\u5c31\u662f\u6267\u884c \u5c3e\u5220\u64cd\u4f5c&#xff08;pop_back&#xff09;\u3002<\/p>\n<p>\u4f46\u662f\u7531\u4e8e fd \u4e0e\u6570\u7ec4\u4e0b\u6807\u6ca1\u6709\u76f4\u63a5\u5173\u8054&#xff0c;\u5982\u679c\u9700\u8981\u5220\u9664\u67d0\u4e2a\u6307\u5b9a\u7684 fd&#xff0c;\u5c31\u5fc5\u987b\u5148\u904d\u5386\u6574\u4e2a\u6570\u7ec4\u627e\u5230\u5b83\u7684\u4f4d\u7f6e&#xff0c;\u5176\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(N)\u3002\u800c\u5728 \u9ad8\u5e76\u53d1\u670d\u52a1\u5668 \u7684\u573a\u666f\u4e2d&#xff0c;\u670d\u52a1\u5668\u5728\u4efb\u610f\u65f6\u523b\u90fd\u53ef\u80fd\u63a5\u53d7\u6210\u5343\u4e0a\u4e07\u4e2a\u8fde\u63a5&#xff0c;\u540c\u65f6\u4e5f\u53ef\u80fd\u5173\u95ed\u6210\u5343\u4e0a\u4e07\u4e2a\u8fde\u63a5\u3002\u5982\u679c\u6bcf\u6b21\u5220\u9664\u90fd\u9700\u8981\u8fdb\u884c\u4e00\u6b21 O(N) \u7684\u7ebf\u6027\u904d\u5386&#xff0c;\u90a3\u4e48\u5f00\u9500\u5c06\u4f1a\u975e\u5e38\u5de8\u5927\u3002<\/p>\n<p>\u56e0\u6b64&#xff0c;\u8fd9\u91cc\u4e0d\u80fd\u4ec5\u4ec5\u4f9d\u8d56\u4e00\u4e2a vector \u6570\u7ec4&#xff0c;\u8fd8\u9700\u8981\u989d\u5916\u7ef4\u62a4\u4e00\u4e2a \u54c8\u5e0c\u8868&#xff08;unordered_map&#xff09;\u3002\u8fd9\u4e2a\u54c8\u5e0c\u8868\u7684\u4f5c\u7528\u662f \u5feb\u901f\u5b9a\u4f4d\u67d0\u4e2a fd \u5728 vector \u6570\u7ec4\u4e2d\u7684\u4f4d\u7f6e\u3002\u5176\u4e2d&#xff1a;<\/p>\n<ul>\n<li>\u952e&#xff08;key&#xff09;&#xff1a;\u6587\u4ef6\u63cf\u8ff0\u7b26 fd<\/li>\n<li>\u503c&#xff08;value&#xff09;&#xff1a;\u8be5 fd \u5728 vector \u6570\u7ec4\u4e2d\u7684\u4e0b\u6807<\/li>\n<\/ul>\n<p>\u8fd9\u6837&#xff0c;\u5728\u6267\u884c\u5220\u9664\u64cd\u4f5c\u65f6&#xff0c;\u5c31\u53ef\u4ee5\u901a\u8fc7\u54c8\u5e0c\u8868 O(1) \u5730\u83b7\u53d6\u6570\u7ec4\u4e0b\u6807&#xff0c;\u7136\u540e\u5c06\u5f85\u5220\u9664\u5143\u7d20\u4e0e \u6570\u7ec4\u6700\u540e\u4e00\u4e2a\u5143\u7d20\u4ea4\u6362&#xff0c;\u518d\u6267\u884c pop_back&#xff0c;\u5373\u53ef\u5b8c\u6210\u5220\u9664\u64cd\u4f5c\u3002<\/p>\n<p>\u57fa\u4e8e\u8fd9\u79cd\u8bbe\u8ba1&#xff0c;\u8fd9\u91cc\u5b9a\u4e49\u4e86\u4e00\u4e2a Pollmanager \u5bf9\u8c61\u3002\u8be5\u5bf9\u8c61\u5185\u90e8\u5305\u542b&#xff1a;<\/p>\n<ul>\n<li>\u4e00\u4e2a vector&lt;pollfd&gt; \u6570\u7ec4<\/li>\n<li>\u4e00\u4e2a unordered_map&lt;int,int&gt; \u54c8\u5e0c\u8868<\/li>\n<\/ul>\n<p>\u540c\u65f6\u8fd8\u63d0\u4f9b\u4e86\u4e24\u4e2a\u63a5\u53e3&#xff1a;<\/p>\n<ul>\n<li>add_fd&#xff1a;\u5c06 fd \u6dfb\u52a0\u5230\u8bfb\u96c6\u5408\u6216\u5199\u96c6\u5408<\/li>\n<li>del_fd&#xff1a;\u5c06 fd \u4ece\u8bfb\u96c6\u5408\u6216\u5199\u96c6\u5408\u4e2d\u5220\u9664<\/li>\n<\/ul>\n<p>\u4e0d\u8fc7\u5728\u5b9e\u73b0\u8fd9\u4e24\u4e2a\u63a5\u53e3\u65f6&#xff0c;\u8fd8\u5b58\u5728\u4e00\u4e2a\u975e\u5e38\u91cd\u8981\u7684 \u5e76\u53d1\u95ee\u9898\u3002<\/p>\n<p>\u7531\u4e8e\u670d\u52a1\u5668\u91c7\u7528 \u7ebf\u7a0b\u6c60\u6a21\u578b&#xff0c;\u6bcf\u4e00\u4e2a\u5de5\u4f5c\u7ebf\u7a0b\u90fd\u4f1a\u8d1f\u8d23\u5904\u7406\u4e00\u4e2a\u5ba2\u6237\u7aef\u8fde\u63a5\u3002\u5f53\u67d0\u4e2a\u7ebf\u7a0b\u5904\u7406\u5b8c\u5ba2\u6237\u7aef\u53d1\u9001\u7684\u6700\u540e\u4e00\u4e2a HTTP \u8bf7\u6c42\u62a5\u6587\u4e4b\u540e&#xff0c;\u4f1a\u5b8c\u6210\u8bf7\u6c42\u5904\u7406\u3001\u751f\u6210\u54cd\u5e94\u5e76\u53d1\u9001\u7ed9\u5ba2\u6237\u7aef&#xff0c;\u968f\u540e\u5173\u95ed\u8fde\u63a5&#xff0c;\u5e76\u5c06\u8be5 fd \u4ece\u8bfb\u96c6\u5408\u4e2d\u5220\u9664\u3002<\/p>\n<p>\u7136\u800c\u8fd9\u91cc\u7684 Pollmanager \u5bf9\u8c61\u662f\u4e00\u4e2a \u5168\u5c40\u5171\u4eab\u5bf9\u8c61&#xff0c;\u4f1a\u88ab\u591a\u4e2a\u5de5\u4f5c\u7ebf\u7a0b\u540c\u65f6\u8bbf\u95ee\u3002\u56e0\u6b64&#xff0c;\u5728\u8fd0\u884c\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u4f1a\u51fa\u73b0 \u591a\u4e2a\u7ebf\u7a0b\u540c\u65f6\u8c03\u7528 del_fd \u5220\u9664 fd \u7684\u60c5\u51b5\u3002<\/p>\n<p>\u800c\u5220\u9664\u64cd\u4f5c\u4e0d\u4ec5\u6d89\u53ca vector \u6570\u7ec4\u7684\u4fee\u6539&#xff0c;\u8fd8\u6d89\u53ca \u54c8\u5e0c\u8868\u7684\u4fee\u6539\u3002\u9700\u8981\u6ce8\u610f\u7684\u662f&#xff1a;<\/p>\n<ul>\n<li>vector::pop_back() \u5e76\u4e0d\u662f\u539f\u5b50\u64cd\u4f5c<\/li>\n<li>\u5176\u5185\u90e8\u9700\u8981\u4fee\u6539 vector \u7ef4\u62a4\u7684\u4e09\u4e2a\u6307\u9488&#xff08;start \/ finish \/ end_of_storage&#xff09;\u4e2d\u7684 finish \u6307\u9488<\/li>\n<\/ul>\n<p>\u8fd9\u4e2a\u4fee\u6539\u8fc7\u7a0b\u5b9e\u9645\u4e0a\u5305\u542b\u591a\u6761\u673a\u5668\u6307\u4ee4&#xff0c;\u4f8b\u5982&#xff1a;<\/p>\n<li>\u4ece\u5185\u5b58\u8bfb\u53d6\u5f53\u524d finish \u6307\u9488<\/li>\n<li>\u5728\u5bc4\u5b58\u5668\u4e2d\u6267\u884c\u51cf\u4e00\u64cd\u4f5c<\/li>\n<li>\u5c06\u7ed3\u679c\u5199\u56de\u5185\u5b58<\/li>\n<p>\u5982\u679c\u5728\u6267\u884c\u8fc7\u7a0b\u4e2d\u53d1\u751f \u7ebf\u7a0b\u5207\u6362&#xff0c;\u90a3\u4e48\u5176\u4ed6\u7ebf\u7a0b\u53ef\u80fd\u4f1a\u540c\u65f6\u4fee\u6539\u8be5\u6307\u9488&#xff0c;\u4ece\u800c\u5bfc\u81f4 \u6570\u636e\u4e0d\u4e00\u81f4\u95ee\u9898\u3002<\/p>\n<p>\u540c\u6837\u5730&#xff0c;unordered_map \u4e5f\u4e0d\u662f\u7ebf\u7a0b\u5b89\u5168\u7684\u3002\u5176\u5185\u90e8\u672c\u8d28\u4e0a\u662f\u4e00\u4e2a \u6307\u9488\u6570\u7ec4 &#043; \u94fe\u8868\u7ed3\u6784\u3002\u5f53\u6267\u884c\u63d2\u5165\u64cd\u4f5c\u65f6&#xff0c;\u5982\u679c\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c&#xff0c;\u5219\u53ef\u80fd\u89e6\u53d1 rehash&#xff08;\u6269\u5bb9&#xff09;\u3002\u6269\u5bb9\u8fc7\u7a0b\u4e2d\u4f1a&#xff1a;<\/p>\n<li>\u5206\u914d\u65b0\u7684\u6876\u6570\u7ec4<\/li>\n<li>\u91cd\u65b0\u8ba1\u7b97\u6bcf\u4e2a\u8282\u70b9\u7684\u54c8\u5e0c\u7d22\u5f15<\/li>\n<li>\u5c06\u8282\u70b9\u8fc1\u79fb\u5230\u65b0\u7684\u6876\u4e2d<\/li>\n<li>\u91ca\u653e\u65e7\u7684\u6876\u6570\u7ec4<\/li>\n<p>\u800c\u8fd9\u91cc\u8bbf\u95ee\u54c8\u5e0c\u8868\u4e2d\u7684\u8282\u70b9&#xff0c;\u4f8b\u5982\u8c03\u7528 [] \u8fd0\u7b97\u7b26\u91cd\u8f7d\u51fd\u6570\u65f6&#xff0c;\u5176\u5185\u90e8\u6267\u884c\u6d41\u7a0b\u901a\u5e38\u662f&#xff1a;\u9996\u5148\u6839\u636e\u952e\u503c\u8ba1\u7b97\u5bf9\u5e94\u7684 \u54c8\u5e0c\u7d22\u5f15&#xff0c;\u7136\u540e\u5b9a\u4f4d\u5230\u5bf9\u5e94\u7684\u6876&#xff08;bucket&#xff09;&#xff0c;\u8be5\u6876\u901a\u5e38\u662f\u4e00\u4e2a\u94fe\u8868\u6216\u5176\u4ed6\u51b2\u7a81\u89e3\u51b3\u7ed3\u6784&#xff0c;\u63a5\u7740\u518d\u904d\u5386\u8be5\u94fe\u8868\u4e2d\u7684\u8282\u70b9&#xff0c;\u6700\u7ec8\u8fd4\u56de\u8282\u70b9 val \u503c\u7684\u5f15\u7528\u3002<\/p>\n<p>\u7136\u800c&#xff0c;\u8fd9\u4e00\u6574\u4e2a\u8bbf\u95ee\u8fc7\u7a0b\u540c\u6837 \u4e0d\u662f\u539f\u5b50\u64cd\u4f5c\u3002\u5982\u679c\u5728\u8bbf\u95ee\u8fc7\u7a0b\u4e2d\u53d1\u751f\u7ebf\u7a0b\u5e76\u53d1&#xff0c;\u4f8b\u5982\u67d0\u4e2a\u7ebf\u7a0b\u6b63\u5728\u8bbf\u95ee\u54c8\u5e0c\u8868&#xff0c;\u800c\u53e6\u4e00\u7ebf\u7a0b\u89e6\u53d1\u4e86\u54c8\u5e0c\u8868\u7684 \u6269\u5bb9&#xff08;rehash&#xff09;&#xff0c;\u90a3\u4e48\u95ee\u9898\u5c31\u53ef\u80fd\u51fa\u73b0\u3002<\/p>\n<p>\u5177\u4f53\u6765\u8bf4&#xff0c;\u5728 rehash \u8fc7\u7a0b\u4e2d&#xff0c;\u54c8\u5e0c\u8868\u4f1a\u91cd\u65b0\u7533\u8bf7\u4e00\u5757\u65b0\u7684\u6876\u6570\u7ec4&#xff0c;\u7136\u540e\u5c06\u539f\u6709\u8282\u70b9\u91cd\u65b0\u8ba1\u7b97\u54c8\u5e0c\u7d22\u5f15\u5e76\u8fc1\u79fb\u5230\u65b0\u7684\u6876\u6570\u7ec4\u4e2d&#xff0c;\u968f\u540e \u91ca\u653e\u65e7\u7684\u6876\u6570\u7ec4\u5185\u5b58\u3002\u5982\u679c\u6b64\u65f6\u67d0\u4e2a\u7ebf\u7a0b\u6b63\u5728\u6267\u884c\u67e5\u627e\u64cd\u4f5c&#xff0c;\u4f8b\u5982\u5df2\u7ecf\u6839\u636e\u952e\u503c\u8ba1\u7b97\u51fa\u4e86\u54c8\u5e0c\u7d22\u5f15&#xff0c;\u5e76\u51c6\u5907\u8bbf\u95ee\u65e7\u6876\u6570\u7ec4\u4e2d\u7684\u94fe\u8868\u8282\u70b9&#xff0c;\u4f46\u5728\u8fd9\u4e00\u8fc7\u7a0b\u4e2d\u7ebf\u7a0b\u53d1\u751f\u4e86\u5207\u6362&#xff0c;\u800c\u53e6\u4e00\u7ebf\u7a0b\u5b8c\u6210\u4e86 rehash \u5e76\u91ca\u653e\u4e86\u65e7\u7684\u6876\u6570\u7ec4&#xff0c;\u90a3\u4e48\u5f53\u524d\u7ebf\u7a0b\u6062\u590d\u6267\u884c\u540e\u5c31\u53ef\u80fd\u7ee7\u7eed\u8bbf\u95ee \u5df2\u7ecf\u88ab\u91ca\u653e\u7684\u5185\u5b58\u5730\u5740\u3002<\/p>\n<p>\u8fd9\u79cd\u60c5\u51b5\u4f1a\u76f4\u63a5\u5bfc\u81f4 \u975e\u6cd5\u5185\u5b58\u8bbf\u95ee&#xff08;invalid memory access&#xff09;&#xff0c;\u4ece\u800c\u5f15\u53d1\u7a0b\u5e8f\u5d29\u6e83\u6216\u8005\u672a\u5b9a\u4e49\u884c\u4e3a\u3002\u56e0\u6b64&#xff0c;\u5728\u5e76\u53d1\u73af\u5883\u4e0b&#xff0c;\u5982\u679c\u6ca1\u6709\u8fdb\u884c\u540c\u6b65\u63a7\u5236&#xff0c;\u5bf9\u54c8\u5e0c\u8868\u8fdb\u884c\u8bfb\u5199\u8bbf\u95ee\u540c\u6837\u53ef\u80fd\u5bfc\u81f4 \u6570\u636e\u4e0d\u4e00\u81f4\u95ee\u9898&#xff0c;\u751a\u81f3\u4ea7\u751f\u66f4\u4e25\u91cd\u7684\u5185\u5b58\u5b89\u5168\u95ee\u9898\u3002<\/p>\n<p>\u56e0\u6b64&#xff0c;\u5982\u679c\u4e0d\u8fdb\u884c\u540c\u6b65\u63a7\u5236&#xff0c;vector \u4e0e unordered_map \u5728\u5e76\u53d1\u8bbf\u95ee\u4e0b\u90fd\u53ef\u80fd\u4ea7\u751f \u6570\u636e\u4e0d\u4e00\u81f4\u751a\u81f3\u5d29\u6e83\u7684\u95ee\u9898\u3002<\/p>\n<p>\u4e3a\u4e86\u89e3\u51b3\u8fd9\u4e00\u95ee\u9898&#xff0c;\u8fd9\u91cc\u9700\u8981\u5f15\u5165 \u4e92\u65a5\u9501&#xff08;mutex&#xff09;\u3002\u9501\u7684\u7c92\u5ea6\u8bbe\u8ba1\u4e3a&#xff1a;\u540c\u65f6\u4fdd\u62a4 vector \u4e0e unordered_map \u8fd9\u4e24\u4e2a\u6570\u636e\u7ed3\u6784\u3002\u4e5f\u5c31\u662f\u8bf4&#xff0c;\u5728\u6267\u884c add_fd \u6216 del_fd \u65f6&#xff0c;\u5fc5\u987b\u9996\u5148\u83b7\u53d6\u8fd9\u628a\u9501&#xff0c;\u968f\u540e\u624d\u80fd\u5bf9\u8fd9\u4e24\u4e2a\u6570\u636e\u7ed3\u6784\u8fdb\u884c\u8bbf\u95ee\u548c\u4fee\u6539\u3002<\/p>\n<p>\u8fd9\u6837\u505a\u7684\u76ee\u7684&#xff0c;\u662f\u4fdd\u8bc1\u5728\u8bbf\u95ee\u671f\u95f4&#xff1a;<\/p>\n<ul>\n<li>\u54c8\u5e0c\u8868\u7ed3\u6784\u4e0d\u4f1a\u53d1\u751f\u53d8\u5316<\/li>\n<li>vector \u5185\u90e8\u72b6\u6001\u4fdd\u6301\u4e00\u81f4<\/li>\n<\/ul>\n<p>\u4ece\u800c\u907f\u514d\u5e76\u53d1\u5bfc\u81f4\u7684\u6570\u636e\u7834\u574f\u95ee\u9898\u3002<\/p>\n<p>\u56e0\u6b64&#xff0c;Pollmanager \u5bf9\u8c61\u9664\u4e86 vector \u548c unordered_map \u4e4b\u5916&#xff0c;\u8fd8\u9700\u8981\u7ef4\u62a4\u4e00\u628a \u4e92\u65a5\u9501\u3002<\/p>\n<p>\u63a5\u4e0b\u6765\u5373\u53ef\u5b9e\u73b0 add_fd \u51fd\u6570\u3002\u51fd\u6570\u9996\u5148\u5c1d\u8bd5\u83b7\u53d6\u9501&#xff08;\u52a0\u9501&#xff09;&#xff0c;\u5982\u679c\u52a0\u9501\u6210\u529f&#xff0c;\u5219\u5148\u68c0\u67e5\u8be5 fd \u662f\u5426\u5df2\u7ecf\u5b58\u5728\u4e8e vector \u6570\u7ec4\u4e2d\u3002\u5982\u679c\u5df2\u7ecf\u5b58\u5728&#xff0c;\u8bf4\u660e\u54c8\u5e0c\u8868\u4e2d\u5df2\u7ecf\u6709\u5bf9\u5e94\u6620\u5c04&#xff0c;\u6b64\u65f6\u76f4\u63a5\u8fd4\u56de\u5373\u53ef&#xff0c;\u907f\u514d\u91cd\u590d\u6dfb\u52a0\u3002<\/p>\n<p>\u5982\u679c\u4e0d\u5b58\u5728&#xff0c;\u5219\u521b\u5efa\u4e00\u4e2a pollfd \u5bf9\u8c61\u5e76\u8fdb\u884c\u521d\u59cb\u5316\u3002\u521d\u59cb\u5316\u65f6\u4e0d\u4ec5\u9700\u8981\u8bbe\u7f6e fd \u5b57\u6bb5&#xff0c;\u8fd8\u9700\u8981\u8bbe\u7f6e events \u5b57\u6bb5\u3002\u5728\u5f53\u524d\u670d\u52a1\u5668\u7684\u8bbe\u8ba1\u573a\u666f\u4e0b&#xff0c;\u4e3b\u8981\u6d89\u53ca\u4e24\u7c7b\u4e8b\u4ef6&#xff1a;<\/p>\n<ul>\n<li>\u63a5\u6536\u65b0\u8fde\u63a5\u6216\u63a5\u6536\u5ba2\u6237\u7aef\u8bf7\u6c42 \u2014\u2014 \u8bfb\u4e8b\u4ef6<\/li>\n<li>\u5411\u5ba2\u6237\u7aef\u53d1\u9001\u54cd\u5e94 \u2014\u2014 \u5199\u4e8b\u4ef6<\/li>\n<\/ul>\n<p>\u56e0\u6b64 Pollmanager \u5185\u90e8\u7ef4\u62a4\u4e00\u4e2a _event \u6807\u5fd7\u4f4d&#xff1a;<\/p>\n<ul>\n<li>1 \u8868\u793a\u8bfb\u96c6\u5408<\/li>\n<li>2 \u8868\u793a\u5199\u96c6\u5408<\/li>\n<\/ul>\n<p>\u5728\u521d\u59cb\u5316 events \u5b57\u6bb5\u65f6&#xff0c;\u6839\u636e\u8be5\u6807\u5fd7\u4f4d\u8bbe\u7f6e\u76f8\u5e94\u7684\u4e8b\u4ef6\u5b8f&#xff08;POLLIN \u6216 POLLOUT&#xff09;\u3002<\/p>\n<p>\u5b8c\u6210\u521d\u59cb\u5316\u4e4b\u540e&#xff0c;\u5c06\u8be5 pollfd \u5c3e\u63d2\u5230 vector \u6570\u7ec4\u4e2d&#xff0c;\u5e76\u5728\u54c8\u5e0c\u8868\u4e2d\u5efa\u7acb\u5bf9\u5e94\u7684 fd \u2192 index \u6620\u5c04\u5173\u7cfb\u3002<\/p>\n<p>\u5bf9\u4e8e del_fd \u51fd\u6570&#xff0c;\u540c\u6837\u9996\u5148\u83b7\u53d6\u9501\u3002\u968f\u540e\u5224\u65ad\u8be5 fd \u662f\u5426\u5df2\u7ecf\u88ab\u5220\u9664&#xff0c;\u5373\u67e5\u8be2\u54c8\u5e0c\u8868\u3002\u5982\u679c\u672a\u547d\u4e2d&#xff0c;\u5219\u8bf4\u660e\u5df2\u7ecf\u88ab\u5220\u9664&#xff0c;\u76f4\u63a5\u8fd4\u56de\u3002<\/p>\n<p>\u5982\u679c\u547d\u4e2d&#xff0c;\u5219\u7ee7\u7eed\u6267\u884c\u5220\u9664\u903b\u8f91&#xff1a;<\/p>\n<li>\u8bb0\u5f55\u5f53\u524d fd \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15<\/li>\n<li>\u5224\u65ad\u8be5\u5143\u7d20\u662f\u5426\u4e3a\u6570\u7ec4\u6700\u540e\u4e00\u4e2a\u5143\u7d20<\/li>\n<p>\u5982\u679c\u662f\u6700\u540e\u4e00\u4e2a\u5143\u7d20&#xff0c;\u5219\u76f4\u63a5 pop_back \u5373\u53ef&#xff1b; \u5982\u679c\u4e0d\u662f&#xff0c;\u5219\u9700\u8981&#xff1a;<\/p>\n<li>\u83b7\u53d6\u6570\u7ec4\u6700\u540e\u4e00\u4e2a\u5143\u7d20<\/li>\n<li>\u66f4\u65b0\u8be5\u5143\u7d20\u5728\u54c8\u5e0c\u8868\u4e2d\u7684\u7d22\u5f15<\/li>\n<li>\u5c06\u6700\u540e\u4e00\u4e2a\u5143\u7d20\u8986\u76d6\u5230\u5f85\u5220\u9664\u4f4d\u7f6e<\/li>\n<li>\u6267\u884c pop_back<\/li>\n<p>\u5728\u9501\u7684\u4f7f\u7528\u65b9\u9762&#xff0c;\u8fd9\u91cc\u91c7\u7528\u7684\u662f C&#043;&#043; \u6807\u51c6\u5e93\u4e2d\u7684 std::lock_guard\u3002\u8be5\u7c7b\u540c\u6837\u9075\u5faa RAII \u601d\u60f3&#xff1a;\u5f53 lock_guard \u5bf9\u8c61\u521b\u5efa\u65f6\u81ea\u52a8\u52a0\u9501&#xff0c;\u5f53\u51fd\u6570\u7ed3\u675f\u65f6\u5bf9\u8c61\u6790\u6784&#xff0c;\u81ea\u52a8\u8c03\u7528\u6790\u6784\u51fd\u6570\u5b8c\u6210\u89e3\u9501&#xff0c;\u56e0\u6b64\u65e0\u9700\u624b\u52a8\u91ca\u653e\u9501\u3002<\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">Pollmanager<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">public<\/span><span class=\"token operator\">:<\/span><br \/>\n    <span class=\"token function\">Pollmanager<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> _event<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token operator\">:<\/span><span class=\"token function\">event<\/span><span class=\"token punctuation\">(<\/span>_event<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><\/p>\n<p>    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">void<\/span> <span class=\"token function\">add_fd<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> fd<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n       std<span class=\"token double-colon punctuation\">::<\/span>lock_guard<span class=\"token operator\">&lt;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>mutex<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">lock<\/span><span class=\"token punctuation\">(<\/span>mtx<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n       <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>fd_index_map<span class=\"token punctuation\">.<\/span><span class=\"token function\">find<\/span><span class=\"token punctuation\">(<\/span>fd<span class=\"token punctuation\">)<\/span><span class=\"token operator\">!&#061;<\/span>fd_index_map<span class=\"token punctuation\">.<\/span><span class=\"token function\">end<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n       <span class=\"token punctuation\">{<\/span><br \/>\n             <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><br \/>\n       <span class=\"token punctuation\">}<\/span><br \/>\n       pollfd pfd<span class=\"token punctuation\">;<\/span><br \/>\n       pfd<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>event<span class=\"token operator\">&#061;&#061;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><br \/>\n       <span class=\"token punctuation\">{<\/span><br \/>\n         pfd<span class=\"token punctuation\">.<\/span>events<span class=\"token operator\">&#061;<\/span>POLLIN<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>event<span class=\"token operator\">&#061;&#061;<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><br \/>\n       <span class=\"token punctuation\">{<\/span><br \/>\n        pfd<span class=\"token punctuation\">.<\/span>events<span class=\"token operator\">&#061;<\/span>POLLOUT<span class=\"token punctuation\">;<\/span><br \/>\n       <span class=\"token punctuation\">}<\/span><br \/>\n       pfd<span class=\"token punctuation\">.<\/span>revents<span class=\"token operator\">&#061;<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n       pollfds<span class=\"token punctuation\">.<\/span><span class=\"token function\">push_back<\/span><span class=\"token punctuation\">(<\/span>pfd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n       fd_index_map<span class=\"token punctuation\">[<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token operator\">&#061;<\/span>pollfds<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/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 keyword\">bool<\/span> <span class=\"token function\">del_fd<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> fd<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n       std<span class=\"token double-colon punctuation\">::<\/span>lock_guard<span class=\"token operator\">&lt;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>mutex<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">lock<\/span><span class=\"token punctuation\">(<\/span>mtx<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n       <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>fd_index_map<span class=\"token punctuation\">.<\/span><span class=\"token function\">find<\/span><span class=\"token punctuation\">(<\/span>fd<span class=\"token punctuation\">)<\/span><span class=\"token operator\">&#061;&#061;<\/span>fd_index_map<span class=\"token punctuation\">.<\/span><span class=\"token function\">end<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n       <span class=\"token punctuation\">{<\/span><br \/>\n         <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n       <span class=\"token punctuation\">}<\/span><br \/>\n       <span class=\"token keyword\">int<\/span> index<span class=\"token operator\">&#061;<\/span>fd_index_map<span class=\"token punctuation\">[<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n       <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>index<span class=\"token operator\">&#061;&#061;<\/span>pollfds<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/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           pollfds<span class=\"token punctuation\">.<\/span><span class=\"token function\">pop_back<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n           fd_index_map<span class=\"token punctuation\">.<\/span><span class=\"token function\">erase<\/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 boolean\">true<\/span><span class=\"token punctuation\">;<\/span><br \/>\n       <span class=\"token punctuation\">}<\/span><br \/>\n       <span class=\"token keyword\">int<\/span> last_fd<span class=\"token operator\">&#061;<\/span>pollfds<span class=\"token punctuation\">.<\/span><span class=\"token function\">back<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>fd<span class=\"token punctuation\">;<\/span><br \/>\n       pollfds<span class=\"token punctuation\">[<\/span>index<span class=\"token punctuation\">]<\/span><span class=\"token operator\">&#061;<\/span>pollfds<span class=\"token punctuation\">.<\/span><span class=\"token function\">back<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n       pollfds<span class=\"token punctuation\">.<\/span><span class=\"token function\">pop_back<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n       fd_index_map<span class=\"token punctuation\">[<\/span>last_fd<span class=\"token punctuation\">]<\/span><span class=\"token operator\">&#061;<\/span>index<span class=\"token punctuation\">;<\/span><br \/>\n       fd_index_map<span class=\"token punctuation\">.<\/span><span class=\"token function\">erase<\/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 boolean\">true<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>vector<span class=\"token operator\">&lt;<\/span>pollfd<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">get_snapshot<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>lock_guard<span class=\"token operator\">&lt;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>mutex<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">lock<\/span><span class=\"token punctuation\">(<\/span>mtx<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> pollfds<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">private<\/span><span class=\"token operator\">:<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>mutex mtx<span class=\"token punctuation\">;<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>vector<span class=\"token operator\">&lt;<\/span>pollfd<span class=\"token operator\">&gt;<\/span> pollfds<span class=\"token punctuation\">;<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>unordered_map<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token punctuation\">,<\/span><span class=\"token keyword\">int<\/span><span class=\"token operator\">&gt;<\/span> fd_index_map<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> event<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>\u800c\u8fd9\u91cc\u8fd8\u9700\u8981\u6ce8\u610f\u4e00\u4e2a\u5173\u952e\u95ee\u9898\u3002\u7531\u4e8e\u5f53\u524d\u9501\u7684\u7c92\u5ea6\u662f \u540c\u65f6\u4fdd\u62a4\u6574\u4e2a\u54c8\u5e0c\u8868\u4ee5\u53ca\u6574\u4e2a vector \u6570\u7ec4&#xff0c;\u56e0\u6b64\u65e0\u8bba\u662f\u4e3b\u7ebf\u7a0b\u8fd8\u662f\u7ebf\u7a0b\u6c60\u4e2d\u7684\u5de5\u4f5c\u7ebf\u7a0b&#xff0c;\u5728\u8bbf\u95ee\u8bfb\u96c6\u5408\u65f6\u90fd\u4f1a\u6d89\u53ca\u5e76\u53d1\u8bbf\u95ee\u8fd9\u4e00\u5171\u4eab\u6570\u636e\u7ed3\u6784\u3002<\/p>\n<p>\u5176\u4e2d\u6700\u6838\u5fc3\u7684\u95ee\u9898\u51fa\u73b0\u5728 \u4e3b\u7ebf\u7a0b\u3002\u4e3b\u7ebf\u7a0b\u9700\u8981\u8c03\u7528 poll \u63a5\u53e3&#xff0c;\u800c vector \u6570\u7ec4\u4e2d\u7ef4\u62a4\u7684\u52a8\u6001\u6570\u7ec4\u6b63\u662f\u5f53\u524d \u6709\u6548\u4e14\u9700\u8981\u88ab\u68c0\u6d4b\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u96c6\u5408\u3002\u5728\u8c03\u7528 poll \u65f6&#xff0c;\u9700\u8981\u5c06 vector \u5185\u90e8\u7ef4\u62a4\u7684\u52a8\u6001\u6570\u7ec4\u4f20\u9012\u7ed9 poll \u63a5\u53e3&#xff0c;\u800c\u8fd9\u4e2a\u6570\u7ec4\u5728\u8bed\u4e49\u4e0a\u5c5e\u4e8e \u8f93\u5165\u8f93\u51fa\u578b\u53c2\u6570&#xff1a;\u7528\u6237\u6001\u5c06\u5176\u4f20\u9012\u7ed9\u5185\u6838&#xff0c;\u968f\u540e\u5185\u6838\u4f1a\u904d\u5386\u8be5\u6570\u7ec4\u5e76\u68c0\u67e5\u5bf9\u5e94\u6587\u4ef6\u63cf\u8ff0\u7b26\u7684\u5c31\u7eea\u72b6\u6001&#xff0c;\u5e76\u5728\u8fd4\u56de\u65f6\u4fee\u6539\u5176\u4e2d\u7684 revents \u5b57\u6bb5\u3002<\/p>\n<p>\u7136\u800c\u9700\u8981\u6ce8\u610f\u7684\u662f&#xff0c;\u5176\u4ed6\u5de5\u4f5c\u7ebf\u7a0b\u540c\u6837\u53ef\u80fd\u4f1a\u5e76\u53d1\u8bbf\u95ee\u8be5 vector \u4e2d\u7684\u52a8\u6001\u6570\u7ec4&#xff0c;\u4f8b\u5982\u8c03\u7528 add_fd \u6216 del_fd \u5bf9\u6587\u4ef6\u63cf\u8ff0\u7b26\u96c6\u5408\u8fdb\u884c\u4fee\u6539\u3002\u5982\u679c\u6b64\u65f6\u4e3b\u7ebf\u7a0b\u76f4\u63a5\u5c06 vector \u5185\u90e8\u7684\u52a8\u6001\u6570\u7ec4\u4f20\u9012\u7ed9 poll&#xff0c;\u90a3\u4e48\u4e3a\u4e86\u4fdd\u8bc1\u8be5\u6570\u7ec4\u5728 poll \u963b\u585e\u7b49\u5f85\u671f\u95f4 \u7ed3\u6784\u4fdd\u6301\u4e00\u81f4\u4e14\u4e0d\u88ab\u4fee\u6539&#xff0c;\u5c31\u5fc5\u987b\u4e00\u76f4\u6301\u6709\u9501\u3002<\/p>\n<p>\u6362\u8a00\u4e4b&#xff0c;\u5982\u679c\u4e3b\u7ebf\u7a0b\u5728\u8c03\u7528 poll \u4e4b\u524d\u52a0\u9501&#xff0c;\u5e76\u5728 poll \u963b\u585e\u7b49\u5f85\u671f\u95f4\u4e00\u76f4\u6301\u6709\u8be5\u9501&#xff0c;\u90a3\u4e48\u5728\u6574\u4e2a\u7b49\u5f85\u671f\u95f4&#xff0c;\u53ea\u6709\u5185\u6838\u5728\u8bbf\u95ee\u8fd9\u4e2a\u6570\u7ec4&#xff0c;\u800c\u6240\u6709\u5176\u4ed6\u7ebf\u7a0b\u90fd\u65e0\u6cd5\u83b7\u53d6\u8fd9\u628a\u9501\u3002\u8fd9\u5c31\u4f1a\u5bfc\u81f4\u5de5\u4f5c\u7ebf\u7a0b\u5728\u6267\u884c add_fd \u6216 del_fd \u65f6\u65e0\u6cd5\u83b7\u53d6\u9501&#xff0c;\u4ece\u800c\u957f\u671f\u963b\u585e&#xff0c;\u4e25\u91cd\u60c5\u51b5\u4e0b\u751a\u81f3\u53ef\u80fd\u5bfc\u81f4 \u7ebf\u7a0b\u9965\u997f&#xff08;thread starvation&#xff09;\u3002<\/p>\n<p>\u4e3a\u4e86\u89e3\u51b3\u8fd9\u4e00\u95ee\u9898&#xff0c;\u5c31\u9700\u8981\u5f15\u5165 \u5feb\u7167&#xff08;snapshot&#xff09;\u673a\u5236\u3002\u5177\u4f53\u505a\u6cd5\u662f&#xff1a;\u4e3b\u7ebf\u7a0b\u5728\u8c03\u7528 poll \u4e4b\u524d&#xff0c;\u5148\u77ed\u6682\u5730\u83b7\u53d6\u9501&#xff0c;\u7136\u540e\u83b7\u53d6\u5f53\u524d\u65f6\u523b\u4e0b vector \u6570\u7ec4\u7684\u72b6\u6001&#xff0c;\u5373 \u62f7\u8d1d\u4e00\u4efd vector \u6570\u7ec4\u526f\u672c\u3002\u8fd9\u4e2a\u62f7\u8d1d\u8fc7\u7a0b\u662f\u77ed\u6682\u7684&#xff0c;\u76f8\u6bd4\u4e8e\u4e4b\u524d\u4e3b\u7ebf\u7a0b\u5728\u963b\u585e\u7b49\u5f85\u671f\u95f4\u4e00\u76f4\u6301\u6709\u9501\u7684\u65b9\u5f0f&#xff0c;\u8fd9\u79cd\u505a\u6cd5\u53ea\u5728\u62f7\u8d1d\u9636\u6bb5\u77ed\u65f6\u95f4\u6301\u6709\u9501\u3002<\/p>\n<p>\u5f53\u62f7\u8d1d\u5b8c\u6210\u4e4b\u540e&#xff0c;\u4e3b\u7ebf\u7a0b\u4f1a\u7acb\u5373\u91ca\u653e\u9501&#xff0c;\u800c\u540e\u7eed\u7684 poll \u8c03\u7528\u5219\u57fa\u4e8e\u8fd9\u4efd vector \u526f\u672c \u8fdb\u884c\u68c0\u6d4b\u3002\u8fd9\u6837\u4e00\u6765&#xff0c;\u5373\u4f7f poll \u5728\u5185\u6838\u4e2d\u963b\u585e\u7b49\u5f85&#xff0c;\u4e3b\u7ebf\u7a0b\u4e5f\u4e0d\u4f1a\u518d\u6301\u6709\u9501&#xff0c;\u5176\u4ed6\u5de5\u4f5c\u7ebf\u7a0b\u4ecd\u7136\u53ef\u4ee5\u6b63\u5e38\u7ade\u4e89\u8be5\u9501\u5e76\u5bf9\u539f\u59cb vector \u6570\u7ec4\u8fdb\u884c\u4fee\u6539\u3002\u8fd9\u6b63\u662f get_snapshot \u51fd\u6570\u7684\u6838\u5fc3\u4f5c\u7528\u3002<\/p>\n<p>\u6b64\u65f6\u8bfb\u8005\u53ef\u80fd\u4f1a\u4ea7\u751f\u4e00\u4e2a\u7591\u95ee&#xff1a;\u65e2\u7136\u5de5\u4f5c\u7ebf\u7a0b\u4e5f\u4f1a\u5e76\u53d1\u8c03\u7528 add_fd \u548c del_fd&#xff0c;\u800c\u8fd9\u4e9b\u51fd\u6570\u540c\u6837\u9700\u8981\u7ade\u4e89\u540c\u4e00\u628a\u9501&#xff0c;\u90a3\u4e48\u8fd9\u91cc\u662f\u5426\u4ecd\u7136\u53ef\u80fd\u51fa\u73b0 \u7ebf\u7a0b\u9965\u997f\u95ee\u9898&#xff1f;<\/p>\n<p>\u9700\u8981\u6ce8\u610f\u7684\u662f&#xff0c;\u867d\u7136\u9501\u7684\u7c92\u5ea6\u786e\u5b9e\u662f \u4fdd\u62a4\u6574\u4e2a vector \u4e0e\u54c8\u5e0c\u8868\u7ed3\u6784&#xff0c;\u4f46 add_fd \u548c del_fd \u8fd9\u4e24\u4e2a\u51fd\u6570\u7684\u6267\u884c\u8fc7\u7a0b\u975e\u5e38\u77ed\u6682\u3002\u7ebf\u7a0b\u5728\u83b7\u53d6\u9501\u4e4b\u540e&#xff0c;\u53ea\u4f1a\u8fdb\u884c\u5c11\u91cf\u7684\u6570\u636e\u7ed3\u6784\u64cd\u4f5c&#xff0c;\u4f8b\u5982\u63d2\u5165\u3001\u5220\u9664\u4ee5\u53ca\u66f4\u65b0\u6620\u5c04\u5173\u7cfb&#xff0c;\u56e0\u6b64\u9501\u7684\u6301\u6709\u65f6\u95f4\u975e\u5e38\u77ed\u3002\u7ebf\u7a0b\u5728\u5b8c\u6210\u64cd\u4f5c\u4e4b\u540e\u4f1a\u7acb\u5373\u91ca\u653e\u9501&#xff0c;\u56e0\u6b64\u5373\u4f7f\u5b58\u5728\u9501\u7ade\u4e89&#xff0c;\u4e5f\u53ea\u4f1a\u4ea7\u751f \u77ed\u65f6\u95f4\u7684\u4e34\u754c\u533a\u7b49\u5f85&#xff0c;\u800c\u4e0d\u4f1a\u50cf\u4e3b\u7ebf\u7a0b\u76f4\u63a5\u6301\u9501\u8c03\u7528 poll \u90a3\u6837&#xff0c;\u5728\u963b\u585e\u7b49\u5f85\u671f\u95f4\u957f\u65f6\u95f4\u5360\u7528\u9501\u3002<\/p>\n<p>\u56e0\u6b64&#xff0c;\u5f15\u5165 \u5feb\u7167\u673a\u5236 \u7684\u6838\u5fc3\u76ee\u7684&#xff0c;\u5c31\u662f\u907f\u514d\u4e3b\u7ebf\u7a0b\u5728\u8c03\u7528 poll \u963b\u585e\u7b49\u5f85\u65f6 \u957f\u671f\u6301\u6709\u9501&#xff0c;\u4ece\u800c\u4fdd\u8bc1\u5176\u4ed6\u5de5\u4f5c\u7ebf\u7a0b\u4ecd\u7136\u80fd\u591f\u53ca\u65f6\u83b7\u53d6\u9501\u5e76\u4fee\u6539\u6587\u4ef6\u63cf\u8ff0\u7b26\u96c6\u5408&#xff0c;\u63d0\u9ad8\u6574\u4e2a\u670d\u52a1\u5668\u5728\u5e76\u53d1\u573a\u666f\u4e0b\u7684\u53ef\u4f38\u7f29\u6027\u3002<\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">Poll_Server<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/\/&#8230;<\/span><br \/>\n<span class=\"token keyword\">private<\/span><span class=\"token operator\">:<\/span><br \/>\n  Pollmanager read_pollmanger<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 comment\">\/\/&#8230;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>\u90a3\u4e48\u8fd9\u91cc\u8bfb\u8005\u53ef\u80fd\u4f1a\u4ea7\u751f\u4e00\u4e2a\u7591\u95ee&#xff1a;\u5f15\u5165 \u5feb\u7167&#xff08;snapshot&#xff09;\u673a\u5236 \u4e4b\u540e&#xff0c;\u4e3b\u7ebf\u7a0b\u53ef\u4ee5\u5728\u8c03\u7528 poll \u4e4b\u524d\u77ed\u6682\u6301\u6709\u9501&#xff0c;\u4ece\u800c\u83b7\u53d6\u5f53\u524d\u65f6\u523b vector \u7684\u72b6\u6001&#xff0c;\u7136\u540e\u62f7\u8d1d\u4e00\u4efd vector \u526f\u672c&#xff0c;\u968f\u540e\u7acb\u5373\u91ca\u653e\u9501&#xff0c;\u5e76\u57fa\u4e8e\u8fd9\u4efd\u526f\u672c\u8c03\u7528 poll \u63a5\u53e3\u3002\u63a5\u4e0b\u6765&#xff0c;\u5185\u6838\u4f1a\u57fa\u4e8e\u8be5 vector \u526f\u672c\u8fdb\u884c\u904d\u5386&#xff0c;\u5e76\u68c0\u6d4b\u5176\u4e2d\u5404\u4e2a fd \u7684\u4e8b\u4ef6\u6761\u4ef6\u662f\u5426\u5c31\u7eea\u3002<\/p>\n<p>\u7136\u800c&#xff0c;\u7531\u4e8e\u670d\u52a1\u5668\u4e2d\u7684\u7ebf\u7a0b\u662f \u5e76\u53d1\u6267\u884c \u7684&#xff0c;\u53ef\u80fd\u4f1a\u51fa\u73b0\u8fd9\u6837\u4e00\u79cd\u60c5\u51b5&#xff1a;\u67d0\u4e2a\u5de5\u4f5c\u7ebf\u7a0b\u5728\u5904\u7406\u8bf7\u6c42\u65f6&#xff0c;\u5411\u5ba2\u6237\u7aef\u53d1\u9001\u54cd\u5e94\u62a5\u6587&#xff0c;\u4f46 send \u8c03\u7528\u5931\u8d25&#xff0c;\u4e8e\u662f\u8be5\u7ebf\u7a0b\u5173\u95ed\u4e86\u5bf9\u5e94\u7684\u5957\u63a5\u5b57 fd\u3002\u800c\u5bf9\u4e8e\u5185\u6838\u6765\u8bf4&#xff0c;\u6b64\u65f6 poll \u6240\u6301\u6709\u7684\u4ecd\u7136\u662f \u4e4b\u524d\u65f6\u523b\u83b7\u53d6\u7684\u5feb\u7167\u526f\u672c\u3002\u56e0\u6b64&#xff0c;\u5c31\u4f1a\u51fa\u73b0 \u5feb\u7167\u4e2d\u7684\u72b6\u6001\u4e0e\u5f53\u524d\u771f\u5b9e\u72b6\u6001\u4e0d\u4e00\u81f4 \u7684\u60c5\u51b5\u3002<\/p>\n<p>\u4f8b\u5982&#xff0c;\u5f53\u5185\u6838\u5728\u904d\u5386\u8be5 vector \u526f\u672c\u65f6&#xff0c;\u67d0\u4e2a fd \u5728\u5f53\u524d\u7cfb\u7edf\u72b6\u6001\u4e0b\u5df2\u7ecf\u88ab\u5173\u95ed\u3002\u90a3\u4e48\u8fd9\u91cc\u5c31\u4f1a\u4ea7\u751f\u4e00\u4e2a\u95ee\u9898&#xff1a;\u8fd9\u79cd\u60c5\u51b5\u662f\u5426\u4f1a\u5bfc\u81f4\u7a0b\u5e8f\u5d29\u6e83&#xff0c;\u6216\u8005\u5f15\u53d1\u5176\u4ed6\u5f02\u5e38\u884c\u4e3a&#xff1f;<\/p>\n<p>\u5b9e\u9645\u4e0a\u4e0d\u4f1a\u3002\u8fd9\u91cc\u9700\u8981\u6ce8\u610f\u7684\u662f&#xff0c;\u5f53\u5185\u6838\u5728\u904d\u5386 pollfd \u6570\u7ec4\u65f6&#xff0c;\u5982\u679c\u53d1\u73b0\u67d0\u4e2a fd \u5df2\u7ecf \u4e0d\u518d\u662f\u4e00\u4e2a\u6709\u6548\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26&#xff0c;\u90a3\u4e48\u5185\u6838\u4e0d\u4f1a\u5d29\u6e83&#xff0c;\u800c\u662f\u4f1a\u5728\u8be5 fd \u5bf9\u5e94\u7684 pollfd \u7ed3\u6784\u4f53\u4e2d\u7684 revents \u5b57\u6bb5\u8bbe\u7f6e POLLNVAL \u6807\u5fd7\u4f4d\u3002\u540c\u65f6&#xff0c;poll \u7684\u8fd4\u56de\u503c&#xff08;\u8868\u793a\u5c31\u7eea\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u6570\u91cf&#xff09;\u4e0d\u4f1a\u5c06\u8be5 fd \u8ba1\u5165\u7edf\u8ba1\u7ed3\u679c\u3002<\/p>\n<p>\u56e0\u6b64&#xff0c;\u5f53 poll \u8c03\u7528\u8fd4\u56de\u4e4b\u540e&#xff0c;\u4e3b\u7ebf\u7a0b\u4f1a\u904d\u5386\u8fd9\u4efd vector \u6570\u7ec4&#xff0c;\u5e76\u68c0\u67e5\u6bcf\u4e2a pollfd \u7ed3\u6784\u4f53\u4e2d\u7684 revents \u5b57\u6bb5\u3002\u901a\u5e38\u7684\u505a\u6cd5\u662f\u5c06 revents \u4e0e\u9700\u8981\u5173\u6ce8\u7684\u4e8b\u4ef6\u5b8f\u8fdb\u884c \u6309\u4f4d\u4e0e\u8fd0\u7b97&#xff0c;\u4f8b\u5982&#xff1a;<\/p>\n<ul>\n<li>revents &amp; POLLIN<\/li>\n<li>revents &amp; POLLOUT<\/li>\n<\/ul>\n<p>\u5982\u679c\u7ed3\u679c\u975e\u96f6&#xff0c;\u5219\u8bf4\u660e\u8be5 fd \u5bf9\u5e94\u7684\u4e8b\u4ef6\u5df2\u7ecf\u5c31\u7eea\u3002<\/p>\n<p>\u800c\u5728\u521a\u624d\u63cf\u8ff0\u7684\u573a\u666f\u4e2d&#xff0c;\u7531\u4e8e revents \u4e2d\u88ab\u8bbe\u7f6e\u7684\u662f POLLNVAL \u6807\u5fd7\u4f4d&#xff0c;\u56e0\u6b64\u5728\u6267\u884c\u4e0a\u8ff0\u6309\u4f4d\u4e0e\u8fd0\u7b97\u65f6&#xff0c;\u5e76\u4e0d\u4f1a\u4e0e POLLIN \u6216 POLLOUT \u5339\u914d\u6210\u529f\u3002\u6362\u53e5\u8bdd\u8bf4&#xff0c;\u8fd9\u4e2a pollfd \u7ed3\u6784\u4f53\u5728\u904d\u5386\u8fc7\u7a0b\u4e2d\u4f1a\u88ab \u81ea\u52a8\u5ffd\u7565\u3002<\/p>\n<p>\u56e0\u6b64&#xff0c;\u5373\u4f7f\u51fa\u73b0 \u5feb\u7167\u72b6\u6001\u4e0e\u5f53\u524d\u771f\u5b9e\u72b6\u6001\u4e0d\u4e00\u81f4 \u7684\u60c5\u51b5&#xff0c;\u4e5f\u4e0d\u4f1a\u5bf9\u7a0b\u5e8f\u9020\u6210\u5f71\u54cd\u3002\u5b9e\u9645\u4e0a&#xff0c;\u8fd9\u79cd\u60c5\u51b5\u5728\u5e76\u53d1\u670d\u52a1\u5668\u4e2d\u662f \u5141\u8bb8\u51fa\u73b0\u7684\u6b63\u5e38\u73b0\u8c61&#xff0c;\u5e76\u4e0d\u9700\u8981\u989d\u5916\u7684\u9632\u5fa1\u6027\u5904\u7406\u3002\u539f\u56e0\u5728\u4e8e&#xff1a;<\/p>\n<li>POLLIN \u4e0e POLLOUT \u7684\u4f4d\u63a9\u7801\u4e0e POLLNVAL \u4e92\u4e0d\u91cd\u53e0<\/li>\n<li>\u5728\u4e8b\u4ef6\u68c0\u6d4b\u9636\u6bb5\u901a\u8fc7 \u6309\u4f4d\u4e0e\u8fd0\u7b97 \u4f1a\u81ea\u52a8\u8fc7\u6ee4\u6389\u8fd9\u4e9b\u65e0\u6548\u6216\u5df2\u7ecf\u5173\u95ed\u7684 fd<\/li>\n<p>\u56e0\u6b64&#xff0c;\u5728\u904d\u5386 poll \u7ed3\u679c\u65f6&#xff0c;\u8fd9\u4e9b\u5df2\u7ecf\u5931\u6548\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u4f1a\u88ab\u81ea\u7136\u5730\u5ffd\u7565&#xff0c;\u4e0d\u4f1a\u5f15\u53d1\u5d29\u6e83\u6216\u903b\u8f91\u9519\u8bef&#xff0c;\u4e5f\u65e0\u9700\u989d\u5916\u7684\u7279\u6b8a\u5904\u7406\u3002<\/p>\n<hr \/>\n<h3>start()<\/h3>\n<p>\u90a3\u4e48\u63a5\u4e0b\u6765\u6211\u4eec\u5c31\u53ef\u4ee5\u8fdb\u4e00\u6b65\u5b8c\u5584 start \u51fd\u6570\u7684\u903b\u8f91\u4e86\u3002\u9996\u5148&#xff0c;start \u51fd\u6570\u4f1a\u8c03\u7528 listen \u63a5\u53e3&#xff0c;\u5c06\u76d1\u542c\u5957\u63a5\u5b57\u8bbe\u7f6e\u4e3a \u76d1\u542c\u72b6\u6001\u3002\u968f\u540e&#xff0c;\u4f1a\u5c06\u76d1\u542c\u5957\u63a5\u5b57\u5bf9\u5e94\u7684 fd \u52a0\u5165\u5230 \u8bfb\u96c6\u5408 \u4e2d&#xff0c;\u7528\u4e8e\u68c0\u6d4b\u65b0\u7684\u8fde\u63a5\u4e8b\u4ef6\u3002<\/p>\n<p>\u5b8c\u6210\u4e0a\u8ff0\u521d\u59cb\u5316\u4e4b\u540e&#xff0c;\u7a0b\u5e8f\u4f1a\u8fdb\u5165\u4e00\u4e2a while \u6b7b\u5faa\u73af\u3002\u5728\u8fdb\u5165\u8be5\u5faa\u73af\u4e4b\u524d&#xff0c;\u8fd8\u9700\u8981\u8fdb\u884c\u4e00\u4e2a\u989d\u5916\u7684\u5904\u7406&#xff1a;\u5ffd\u7565 SIGPIPE \u4fe1\u53f7\u3002<\/p>\n<p>\u8fd9\u91cc\u9700\u8981\u89e3\u91ca\u4e00\u4e0b\u539f\u56e0\u3002\u5982\u679c\u5ba2\u6237\u7aef\u6b63\u5e38\u5173\u95ed\u8fde\u63a5&#xff0c;\u4e5f\u5c31\u662f\u8c03\u7528\u4e86 close \u63a5\u53e3&#xff0c;\u90a3\u4e48\u5ba2\u6237\u7aef\u4f1a\u5411\u670d\u52a1\u7aef\u53d1\u9001\u4e00\u4e2a FIN \u62a5\u6587\u3002\u6b64\u65f6\u670d\u52a1\u7aef\u7684 TCP \u72b6\u6001\u673a\u4f1a\u611f\u77e5\u5230\u5bf9\u7aef\u5173\u95ed\u8fde\u63a5\u3002\u5982\u679c\u670d\u52a1\u7aef\u6b64\u65f6\u4ecd\u7136\u5c1d\u8bd5\u5411\u5ba2\u6237\u7aef\u53d1\u9001\u6570\u636e&#xff0c;\u90a3\u4e48\u5728\u7b2c\u4e00\u6b21\u5199\u64cd\u4f5c\u65f6&#xff0c;\u670d\u52a1\u7aef\u4f1a\u6536\u5230\u5bf9\u65b9\u8fd4\u56de\u7684 RST \u62a5\u6587&#xff1b;\u5982\u679c\u6b64\u540e\u518d\u6b21\u5bf9\u8be5\u8fde\u63a5\u6267\u884c\u5199\u64cd\u4f5c&#xff0c;\u5219\u4f1a\u89e6\u53d1 SIGPIPE \u4fe1\u53f7\u3002\u53e6\u5916&#xff0c;\u5982\u679c\u5ba2\u6237\u7aef\u662f \u5f02\u5e38\u9000\u51fa&#xff08;\u4f8b\u5982\u8fdb\u7a0b\u88ab kill \u7ec8\u6b62&#xff09;&#xff0c;\u90a3\u4e48\u64cd\u4f5c\u7cfb\u7edf\u901a\u5e38\u4e5f\u4f1a\u5411\u5bf9\u7aef\u53d1\u9001 RST \u62a5\u6587\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b&#xff0c;\u5982\u679c\u670d\u52a1\u7aef\u7ee7\u7eed\u8c03\u7528 send \u6216 write \u5411\u8be5\u8fde\u63a5\u53d1\u9001\u6570\u636e&#xff0c;\u540c\u6837\u53ef\u80fd\u89e6\u53d1 SIGPIPE \u4fe1\u53f7\u3002<\/p>\n<p>\u4f46\u662f\u8fd9\u91cc\u5b9e\u9645\u4e0a\u5f80\u5f80 \u6765\u4e0d\u53ca\u8fdb\u884c\u7b2c\u4e8c\u6b21\u5199\u64cd\u4f5c\u7684\u68c0\u6d4b\u3002\u56e0\u4e3a\u5728\u5f88\u591a\u60c5\u51b5\u4e0b&#xff0c;\u7b2c\u4e00\u6b21 send \u8c03\u7528\u662f\u4f1a\u6210\u529f\u8fd4\u56de\u7684&#xff0c;\u5e94\u7528\u5c42\u5e76\u4e0d\u4f1a\u7acb\u5373\u611f\u77e5\u5230\u5bf9\u7aef\u5df2\u7ecf\u5173\u95ed\u8fde\u63a5\u3002<\/p>\n<p>\u5176\u5178\u578b\u8fc7\u7a0b\u5982\u4e0b&#xff1a;<\/p>\n<p>\u5bf9\u7aef\u8c03\u7528 close&#xff0c;\u53d1\u9001 FIN<br \/>\n  \u2192 \u672c\u7aef\u6536\u5230 FIN&#xff0c;\u4f46\u672c\u7aef\u5c1a\u672a\u5173\u95ed\u8fde\u63a5&#xff0c;\u6b64\u65f6 TCP \u8fdb\u5165\u534a\u5173\u95ed\u72b6\u6001&#xff08;\u5bf9\u7aef\u5173\u95ed\u5199&#xff0c;\u672c\u7aef\u4ecd\u53ef\u5199&#xff09;<br \/>\n  \u2192 \u672c\u7aef\u7b2c\u4e00\u6b21 send&#xff1a;\u6570\u636e\u6210\u529f\u8fdb\u5165\u53d1\u9001\u7f13\u51b2\u533a&#xff0c;TCP \u5c06\u6570\u636e\u53d1\u9001\u51fa\u53bb<br \/>\n    \u5e94\u7528\u5c42\u5f97\u5230\u6210\u529f\u8fd4\u56de&#xff0c;\u56e0\u6b64\u5b8c\u5168\u611f\u77e5\u4e0d\u5230\u5bf9\u7aef\u5df2\u7ecf\u5173\u95ed<br \/>\n  \u2192 \u5bf9\u7aef\u6536\u5230\u8be5\u6570\u636e&#xff0c;\u4f46\u7531\u4e8e\u5bf9\u7aef\u5df2\u7ecf\u5173\u95ed\u8bfb\u53d6\u65b9\u5411&#xff0c;\u56e0\u6b64\u8fd4\u56de RST<br \/>\n  \u2192 \u672c\u7aef\u6536\u5230 RST&#xff0c;TCP \u5c06\u8be5\u8fde\u63a5\u72b6\u6001\u6807\u8bb0\u4e3a\u5f02\u5e38<br \/>\n  \u2192 \u672c\u7aef\u7b2c\u4e8c\u6b21 send&#xff1a;\u5185\u6838\u68c0\u6d4b\u5230\u8be5\u8fde\u63a5\u5df2\u7ecf\u5904\u4e8e\u5f02\u5e38\u72b6\u6001&#xff0c;\u4ece\u800c\u89e6\u53d1 SIGPIPE<br \/>\n    \u540c\u65f6 send \u8fd4\u56de <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span>&#xff0c;\u5e76\u5c06 errno \u8bbe\u7f6e\u4e3a EPIPE<\/p>\n<p>\u56e0\u6b64&#xff0c;\u4ece\u5e94\u7528\u5c42\u7684\u89d2\u5ea6\u6765\u770b&#xff1a;<\/p>\n<ul>\n<li>\u7b2c\u4e00\u6b21 send \u901a\u5e38\u4f1a\u6210\u529f\u8fd4\u56de&#xff0c;\u56e0\u4e3a\u6570\u636e\u53ea\u662f\u88ab\u5199\u5165\u672c\u7aef\u53d1\u9001\u7f13\u51b2\u533a&#xff1b;<\/li>\n<li>\u53ea\u6709\u5728 \u7b2c\u4e8c\u6b21\u5199\u64cd\u4f5c \u65f6&#xff0c;\u5185\u6838\u624d\u4f1a\u68c0\u6d4b\u5230\u8fde\u63a5\u5df2\u7ecf\u5904\u4e8e\u5f02\u5e38\u72b6\u6001&#xff0c;\u4ece\u800c\u89e6\u53d1 SIGPIPE \u4fe1\u53f7\u3002<\/li>\n<\/ul>\n<p>\u800c SIGPIPE \u7684\u9ed8\u8ba4\u884c\u4e3a\u662f \u7ec8\u6b62\u8fdb\u7a0b\u3002\u56e0\u6b64&#xff0c;\u5982\u679c\u670d\u52a1\u5668\u7a0b\u5e8f\u6ca1\u6709\u663e\u5f0f\u5ffd\u7565\u8be5\u4fe1\u53f7&#xff0c;\u90a3\u4e48\u5728\u5411\u5df2\u7ecf\u5173\u95ed\u7684\u8fde\u63a5\u518d\u6b21\u5199\u5165\u6570\u636e\u65f6&#xff0c;\u8fdb\u7a0b\u5c31\u53ef\u80fd\u88ab\u64cd\u4f5c\u7cfb\u7edf\u76f4\u63a5\u7ec8\u6b62\u3002<\/p>\n<p>\u8fd9\u4e5f\u662f\u4e3a\u4ec0\u4e48\u5728\u670d\u52a1\u5668\u7a0b\u5e8f\u542f\u52a8\u65f6&#xff0c;\u901a\u5e38\u4f1a\u663e\u5f0f \u5ffd\u7565 SIGPIPE \u4fe1\u53f7&#xff0c;\u4ece\u800c\u907f\u514d\u56e0\u4e3a\u5ba2\u6237\u7aef\u5173\u95ed\u8fde\u63a5\u800c\u5bfc\u81f4\u6574\u4e2a\u670d\u52a1\u5668\u8fdb\u7a0b\u5f02\u5e38\u9000\u51fa\u3002<\/p>\n<p>\u9700\u8981\u6ce8\u610f\u7684\u662f&#xff0c;SIGPIPE \u4fe1\u53f7\u7684 \u9ed8\u8ba4\u884c\u4e3a\u662f\u7ec8\u6b62\u8fdb\u7a0b\u3002\u800c\u5bf9\u4e8e\u670d\u52a1\u5668\u7a0b\u5e8f\u6765\u8bf4&#xff0c;\u8fd9\u662f\u5b8c\u5168\u4e0d\u53ef\u63a5\u53d7\u7684\u3002\u670d\u52a1\u5668\u901a\u5e38\u9700\u8981 \u957f\u671f\u7a33\u5b9a\u8fd0\u884c&#xff08;\u4f8b\u5982 24 \u5c0f\u65f6\u6301\u7eed\u63d0\u4f9b\u670d\u52a1&#xff09;&#xff0c;\u4e0d\u53ef\u80fd\u56e0\u4e3a\u67d0\u4e2a\u5ba2\u6237\u7aef\u5173\u95ed\u8fde\u63a5\u6216\u8005\u5f02\u5e38\u9000\u51fa&#xff0c;\u5c31\u5bfc\u81f4\u6574\u4e2a\u670d\u52a1\u5668\u8fdb\u7a0b\u88ab\u7ec8\u6b62\u3002\u6362\u53e5\u8bdd\u8bf4&#xff0c;\u670d\u52a1\u5668\u4e0d\u5e94\u8be5\u56e0\u4e3a\u5ba2\u6237\u7aef\u7684\u9000\u51fa\u800c\u201c\u966a\u846c\u201d\u3002<\/p>\n<p>\u56e0\u6b64&#xff0c;\u5728\u8fdb\u5165\u4e3b\u5faa\u73af\u4e4b\u524d&#xff0c;\u9700\u8981\u663e\u5f0f\u5ffd\u7565 SIGPIPE \u4fe1\u53f7&#xff0c;\u4ee5\u907f\u514d\u670d\u52a1\u5668\u5728\u5199\u5165\u5df2\u7ecf\u5173\u95ed\u7684\u5957\u63a5\u5b57\u65f6\u88ab\u7cfb\u7edf\u7ec8\u6b62\u3002<\/p>\n<p>\u5b8c\u6210\u4fe1\u53f7\u5904\u7406\u4e4b\u540e&#xff0c;\u7a0b\u5e8f\u4fbf\u8fdb\u5165 while \u5faa\u73af\u3002\u5728\u6bcf\u4e00\u6b21\u5faa\u73af\u4e2d&#xff0c;\u9996\u5148\u4f1a\u8c03\u7528\u8bfb\u96c6\u5408\u5bf9\u5e94\u7684 get_snapshot \u51fd\u6570&#xff0c;\u83b7\u53d6\u5f53\u524d\u65f6\u523b vector \u7684\u72b6\u6001\u3002\u8be5\u51fd\u6570\u7684\u6267\u884c\u6d41\u7a0b\u662f&#xff1a;<\/p>\n<li>\u5148\u83b7\u53d6\u9501<\/li>\n<li>\u62f7\u8d1d\u5f53\u524d vector \u6570\u7ec4<\/li>\n<li>\u91ca\u653e\u9501<\/li>\n<p>\u4ece\u800c\u5f97\u5230\u4e00\u4efd \u5f53\u524d\u65f6\u523b\u7684 vector \u526f\u672c\u3002<\/p>\n<p>\u968f\u540e&#xff0c;\u4e3b\u7ebf\u7a0b\u4f1a\u8c03\u7528 poll \u63a5\u53e3&#xff0c;\u5e76\u5c06\u8fd9\u4efd\u526f\u672c\u4f20\u9012\u7ed9 poll&#xff0c;\u540c\u65f6\u8fd8\u4f1a\u4f20\u5165 \u6570\u7ec4\u957f\u5ea6 \u4ee5\u53ca \u8d85\u65f6\u65f6\u95f4\u3002\u6b64\u65f6\u4e3b\u7ebf\u7a0b\u4f1a\u8fdb\u5165\u963b\u585e\u7b49\u5f85\u72b6\u6001&#xff0c;\u76f4\u5230&#xff1a;<\/p>\n<ul>\n<li>\u6709\u6587\u4ef6\u63cf\u8ff0\u7b26\u4e8b\u4ef6\u5c31\u7eea<\/li>\n<li>\u8d85\u65f6\u65f6\u95f4\u5230\u8fbe<\/li>\n<li>\u6216\u8005\u7cfb\u7edf\u8c03\u7528\u88ab\u4e2d\u65ad<\/li>\n<\/ul>\n<p>\u5f53 poll \u8fd4\u56de\u4e4b\u540e&#xff0c;\u4e3b\u7ebf\u7a0b\u9996\u5148\u9700\u8981\u68c0\u67e5\u8fd4\u56de\u503c&#xff1a;<\/p>\n<ul>\n<li>\u5982\u679c \u8fd4\u56de\u503c\u5927\u4e8e 0&#xff0c;\u8bf4\u660e\u5b58\u5728\u4e8b\u4ef6\u5c31\u7eea\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26&#xff1b;<\/li>\n<li>\u5982\u679c \u8fd4\u56de\u503c\u7b49\u4e8e 0&#xff0c;\u8bf4\u660e\u672c\u6b21 poll \u8c03\u7528\u53d1\u751f\u4e86\u8d85\u65f6&#xff1b;<\/li>\n<li>\u5982\u679c \u8fd4\u56de\u503c\u5c0f\u4e8e 0&#xff0c;\u8bf4\u660e poll \u8c03\u7528\u5931\u8d25&#xff0c;\u6b64\u65f6\u9700\u8981\u8bb0\u5f55\u9519\u8bef\u65e5\u5fd7\u5e76\u7ed3\u675f\u7a0b\u5e8f\u3002<\/li>\n<\/ul>\n<p>\u5bf9\u4e8e\u8fd4\u56de\u503c \u5927\u4e8e 0 \u7684\u60c5\u51b5&#xff0c;\u63a5\u4e0b\u6765\u5c31\u4f1a\u8fdb\u5165 \u4e8b\u4ef6\u5206\u53d1\u9636\u6bb5&#xff0c;\u4e5f\u5c31\u662f\u8c03\u7528 handlertask \u51fd\u6570&#xff0c;\u5bf9\u5df2\u7ecf\u5c31\u7eea\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u8fdb\u884c\u8fdb\u4e00\u6b65\u5904\u7406\u3002<\/p>\n<p>clas Poll_Server<br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/&#8230;<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">start<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">bool<\/span> isdaemon<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">false<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token function\">signal<\/span><span class=\"token punctuation\">(<\/span>SIGPIPE<span class=\"token punctuation\">,<\/span> SIG_IGN<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ &#x1f31f; \u5168\u5c40\u5ffd\u7565 SIGPIPE \u4fe1\u53f7<\/span><br \/>\n                  <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>isdaemon<span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token punctuation\">{<\/span><br \/>\n                    Daemon d<span class=\"token punctuation\">;<\/span><br \/>\n                    d<span class=\"token punctuation\">.<\/span><span class=\"token function\">daemon<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><br \/>\n               <span class=\"token comment\">\/\/..<\/span><br \/>\n                listensock<span class=\"token punctuation\">.<\/span><span class=\"token function\">listen<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token comment\">\/\/..<\/span><br \/>\n                <span class=\"token keyword\">int<\/span> listensock_fd <span class=\"token operator\">&#061;<\/span> listensock<span class=\"token punctuation\">.<\/span><span class=\"token function\">fd<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                read_pollmanger<span class=\"token punctuation\">.<\/span><span class=\"token function\">add_fd<\/span><span class=\"token punctuation\">(<\/span>listensock_fd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token punctuation\">{<\/span><br \/>\n                  std<span class=\"token double-colon punctuation\">::<\/span>vector<span class=\"token operator\">&lt;<\/span>pollfd<span class=\"token operator\">&gt;<\/span> poll_fds <span class=\"token operator\">&#061;<\/span>read_pollmanger<span class=\"token punctuation\">.<\/span><span class=\"token function\">get_snapshot<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                   <span class=\"token keyword\">int<\/span> n<span class=\"token operator\">&#061;<\/span><span class=\"token function\">poll<\/span><span class=\"token punctuation\">(<\/span>poll_fds<span class=\"token punctuation\">.<\/span><span class=\"token function\">data<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>poll_fds<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><span class=\"token number\">10<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <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><br \/>\n         <span class=\"token punctuation\">{<\/span><br \/>\n                lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>Fatal<span class=\"token punctuation\">,<\/span><span class=\"token string\">&#034;poll error&#034;<\/span><span class=\"token punctuation\">)<\/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><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><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>info<span class=\"token punctuation\">,<\/span><span class=\"token string\">&#034;poll timeout&#034;<\/span><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 function\">handlertask<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>read_pollmanger<span class=\"token punctuation\">,<\/span>poll_fds<span class=\"token punctuation\">)<\/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 punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u63a5\u4e0b\u6765&#xff0c;start \u51fd\u6570\u8fd8\u63d0\u4f9b\u4e86\u4e00\u4e2a \u53ef\u9009\u7684\u5b88\u62a4\u8fdb\u7a0b\u5316\u529f\u80fd\u3002\u51fd\u6570\u63a5\u6536\u4e00\u4e2a bool \u7c7b\u578b\u7684\u53c2\u6570 isdaemon&#xff0c;\u9ed8\u8ba4\u503c\u4e3a false\u3002\u5982\u679c\u8be5\u53c2\u6570\u88ab\u8bbe\u7f6e\u4e3a true&#xff0c;\u5219\u4f1a\u8c03\u7528 Daemon \u7c7b\u7684 daemon() \u65b9\u6cd5&#xff0c;\u5c06\u5f53\u524d\u670d\u52a1\u5668\u8fdb\u7a0b\u8f6c\u6362\u4e3a \u5b88\u62a4\u8fdb\u7a0b&#xff08;daemon process&#xff09;\u3002<\/p>\n<p>\u5b88\u62a4\u8fdb\u7a0b&#xff08;daemon&#xff09;\u672c\u8d28\u4e0a\u662f\u4e00\u79cd \u957f\u671f\u8fd0\u884c\u7684\u540e\u53f0\u670d\u52a1\u8fdb\u7a0b&#xff0c;\u901a\u5e38\u6ca1\u6709\u63a7\u5236\u7ec8\u7aef&#xff0c;\u5e76\u4e14\u4f1a\u5728\u540e\u53f0\u6301\u7eed\u63d0\u4f9b\u670d\u52a1&#xff0c;\u4f8b\u5982 sshd\u3001httpd \u7b49\u7cfb\u7edf\u670d\u52a1\u3002<\/p>\n<p>\u5728 Linux \u4e2d&#xff0c;\u4e00\u4e2a\u6807\u51c6\u7684\u5b88\u62a4\u8fdb\u7a0b\u5316\u8fc7\u7a0b\u901a\u5e38\u5305\u62ec&#xff1a;<\/p>\n<li>fork() \u521b\u5efa\u5b50\u8fdb\u7a0b\u5e76\u8ba9\u7236\u8fdb\u7a0b\u9000\u51fa<\/li>\n<li>\u8c03\u7528 setsid() \u521b\u5efa\u65b0\u4f1a\u8bdd&#xff0c;\u8131\u79bb\u63a7\u5236\u7ec8\u7aef<\/li>\n<li>\u4fee\u6539\u5de5\u4f5c\u76ee\u5f55&#xff08;\u901a\u5e38\u4e3a \/&#xff09;<\/li>\n<li>\u5173\u95ed\u6216\u91cd\u5b9a\u5411\u6807\u51c6\u6587\u4ef6\u63cf\u8ff0\u7b26<\/li>\n<li>\u8bbe\u7f6e umask \u7b49\u8fd0\u884c\u73af\u5883<\/li>\n<p>\u8fd9\u6837\u8fdb\u7a0b\u5c31\u80fd\u591f\u5b8c\u5168\u8131\u79bb\u7ec8\u7aef&#xff0c;\u5728\u540e\u53f0\u7a33\u5b9a\u8fd0\u884c\u3002<\/p>\n<p>\u8fd9\u79cd\u8fd0\u884c\u65b9\u5f0f\u5728\u5b9e\u9645\u90e8\u7f72\u670d\u52a1\u5668\u7a0b\u5e8f\u65f6\u975e\u5e38\u5e38\u89c1&#xff0c;\u56e0\u4e3a\u670d\u52a1\u5668\u7a0b\u5e8f\u901a\u5e38\u9700\u8981 \u957f\u671f\u540e\u53f0\u8fd0\u884c&#xff0c;\u800c\u4e0d\u4f9d\u8d56\u7ec8\u7aef\u73af\u5883\u3002<\/p>\n<hr \/>\n<p>\u63a5\u4e0b\u6765\u5c31\u662f handlertask \u51fd\u6570\u7684\u5b9e\u73b0\u3002\u5bf9\u4e8e handlertask \u51fd\u6570&#xff0c;\u5176\u63a5\u6536\u4e00\u4e2a\u8bfb\u96c6\u5408\u4ee5\u53ca\u4e00\u4e2a vector \u5bf9\u8c61&#xff0c;\u8fd9\u4e2a vector \u5bf9\u8c61\u5b9e\u9645\u4e0a\u662f\u4f20\u9012\u7ed9 poll \u63a5\u53e3\u4f5c\u4e3a\u8f93\u5165\/\u8f93\u51fa\u578b\u53c2\u6570\u7684\u5feb\u7167\u3002\u968f\u540e\u5728 handlertask \u51fd\u6570\u5185\u90e8\u4f1a\u904d\u5386\u8be5\u5feb\u7167&#xff0c;\u5e76\u68c0\u67e5\u7a76\u7adf\u662f\u54ea\u4e00\u7c7b\u5bf9\u8c61\u7684\u4e8b\u4ef6\u5c31\u7eea\u3002<\/p>\n<p>\u8fd9\u91cc\u7684\u5bf9\u8c61\u5b9e\u9645\u4e0a\u53ef\u4ee5\u5206\u4e3a\u4e24\u7c7b&#xff1a;\u76d1\u542c\u5957\u63a5\u5b57\u4ee5\u53ca\u5df2\u8fde\u63a5\u5957\u63a5\u5b57\u3002\u56e0\u6b64\u5728\u904d\u5386\u65f6&#xff0c;\u9700\u8981\u5224\u65ad\u5f53\u524d\u5c31\u7eea\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u5c5e\u4e8e\u54ea\u4e00\u79cd\u7c7b\u578b\u3002<\/p>\n<ul>\n<li>\u5982\u679c\u662f\u76d1\u542c\u5957\u63a5\u5b57\u5c31\u7eea&#xff0c;\u5219\u8bf4\u660e\u6709\u65b0\u7684\u5ba2\u6237\u7aef\u8fde\u63a5\u5230\u8fbe&#xff0c;\u6b64\u65f6\u9700\u8981\u8fdb\u884c\u5bf9\u5e94\u4e8b\u4ef6\u7684\u5904\u7406&#xff0c;\u5373\u8c03\u7528 Accept \u51fd\u6570\u83b7\u53d6\u65b0\u8fde\u63a5&#xff0c;\u5e76\u83b7\u5f97\u65b0\u7684\u5df2\u8fde\u63a5\u5957\u63a5\u5b57\u3002<\/li>\n<li>\u5982\u679c\u662f\u5df2\u8fde\u63a5\u5957\u63a5\u5b57\u5c31\u7eea&#xff0c;\u5219\u8bf4\u660e\u5ba2\u6237\u7aef\u53d1\u9001\u4e86\u6570\u636e&#xff0c;\u8bf7\u6c42\u5df2\u7ecf\u5230\u8fbe&#xff0c;\u6b64\u65f6\u63a5\u6536\u7f13\u51b2\u533a\u4e0d\u4e3a\u7a7a&#xff0c;\u9700\u8981\u8bfb\u53d6\u6570\u636e\u3002\u56e0\u6b64\u8fd9\u91cc\u4f1a\u8fdb\u5165 Distribute \u51fd\u6570\u3002<\/li>\n<\/ul>\n<p>\u800c Distribute \u51fd\u6570\u7684\u6838\u5fc3\u903b\u8f91\u662f&#xff1a;\u521b\u5efa\u4efb\u52a1\u5bf9\u8c61\u3002\u8be5\u4efb\u52a1\u5bf9\u8c61\u4e2d\u5305\u542b\u5df2\u8fde\u63a5\u5957\u63a5\u5b57\u5bf9\u5e94\u7684 fd&#xff0c;\u968f\u540e\u5c06\u8be5\u4efb\u52a1\u5bf9\u8c61\u653e\u7f6e\u5230\u73af\u5f62\u7f13\u51b2\u533a\u4e2d&#xff0c;\u7b49\u5f85\u7ebf\u7a0b\u6c60\u4e2d\u7684\u5de5\u4f5c\u7ebf\u7a0b\u53d6\u8d70\u5e76\u8fdb\u884c\u5904\u7406\u3002<\/p>\n<hr \/>\n<h3>\u8bfb\u5199\u5206\u79bb<\/h3>\n<p>\u9996\u5148\u6211\u4eec\u5173\u6ce8\u4e00\u4e0b Distribute \u51fd\u6570\u3002<\/p>\n<p>\u5f53\u67d0\u4e2a\u5df2\u8fde\u63a5\u5957\u63a5\u5b57\u7684\u8bfb\u4e8b\u4ef6\u5c31\u7eea\u65f6&#xff0c;\u5bf9\u5e94\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u4f1a\u88ab\u4f20\u9012\u7ed9 Distribute \u51fd\u6570\u3002Distribute \u51fd\u6570\u6240\u505a\u7684\u5de5\u4f5c\u5c31\u662f\u6784\u5efa\u4e00\u4e2a\u4efb\u52a1\u5bf9\u8c61&#xff0c;\u7136\u540e\u5c06\u5176\u653e\u5165\u73af\u5f62\u7f13\u51b2\u533a&#xff0c;\u7b49\u5f85\u7ebf\u7a0b\u6c60\u4e2d\u7684\u7ebf\u7a0b\u53d6\u8d70\u5e76\u6267\u884c\u3002<\/p>\n<p>\u6b64\u65f6\u8bfb\u8005\u53ef\u80fd\u4f1a\u8ba4\u4e3a&#xff1a;\u7ebf\u7a0b\u6c60\u4e2d\u7684\u5de5\u4f5c\u7ebf\u7a0b\u662f\u5426\u5c31\u662f\u8d1f\u8d23\u4e00\u4e2a\u8fde\u63a5\u7684\u5904\u7406\u3002\u4ece\u67d0\u79cd\u89d2\u5ea6\u6765\u8bf4&#xff0c;\u8fd9\u79cd\u7406\u89e3\u5e76\u6ca1\u6709\u95ee\u9898\u3002<\/p>\n<p>\u4f46\u662f\u8fd9\u91cc\u4e0e\u4f20\u7edf\u7ebf\u7a0b\u6c60\u6a21\u578b\u4ecd\u7136\u5b58\u5728\u5dee\u5f02\u3002\u5728\u4f20\u7edf\u6a21\u578b\u4e2d&#xff0c;\u4e00\u4e2a\u5de5\u4f5c\u7ebf\u7a0b\u901a\u5e38\u4f1a\u5b8c\u6574\u8d1f\u8d23\u4e00\u4e2a\u8fde\u63a5\u7684\u6574\u4e2a\u751f\u547d\u5468\u671f&#xff1a; \u5373\u8bfb\u53d6\u8bf7\u6c42 \u2192 \u5904\u7406\u8bf7\u6c42 \u2192 \u6784\u5efa\u54cd\u5e94 \u2192 \u53d1\u9001\u54cd\u5e94 \u2192 \u7ebf\u7a0b\u8fd4\u56de\u7ebf\u7a0b\u6c60\u3002<\/p>\n<p>\u4e5f\u5c31\u662f\u8bf4&#xff0c;\u4e00\u4e2a\u7ebf\u7a0b\u4f1a\u4e00\u6b65\u6267\u884c\u5230\u5e95&#xff1a; \u7ebf\u7a0b\u9996\u5148\u8bfb\u53d6\u5b8c\u6574\u7684 HTTP \u8bf7\u6c42&#xff0c;\u7136\u540e\u5904\u7406\u8be5\u8bf7\u6c42&#xff0c;\u63a5\u7740\u6784\u5efa HTTP \u54cd\u5e94\u62a5\u6587&#xff0c;\u6700\u540e\u518d\u5c06\u54cd\u5e94\u53d1\u9001\u56de\u5ba2\u6237\u7aef\u3002<\/p>\n<p>\u7136\u800c\u5728\u5b66\u4e60\u4e86IO \u591a\u8def\u590d\u7528\u4e4b\u540e&#xff0c;\u6211\u4eec\u77e5\u9053&#xff1a;\u4e00\u4e2a\u7ebf\u7a0b\u5176\u5b9e\u53ef\u4ee5\u540c\u65f6\u68c0\u6d4b\u591a\u4e2a\u6587\u4ef6\u63cf\u8ff0\u7b26\u7684\u8bfb\u5199\u4e8b\u4ef6\u662f\u5426\u5c31\u7eea\u3002\u56e0\u6b64\u5982\u679c\u91cd\u65b0\u5ba1\u89c6\u4f20\u7edf\u505a\u6cd5&#xff0c;\u53ef\u4ee5\u53d1\u73b0\u4e00\u4e2a\u95ee\u9898&#xff1a;\u8ba9\u540c\u4e00\u4e2a\u7ebf\u7a0b\u65e2\u8d1f\u8d23\u8bfb\u4e8b\u4ef6\u53c8\u8d1f\u8d23\u5199\u4e8b\u4ef6&#xff0c;\u5728\u6548\u7387\u4e0a\u5e76\u4e0d\u662f\u6700\u4f18\u7684\u3002<\/p>\n<p>\u539f\u56e0\u5728\u4e8e&#xff0c;\u8bfb\u4e8b\u4ef6\u4e0e\u5199\u4e8b\u4ef6\u901a\u5e38\u4e0d\u4f1a\u8fde\u7eed\u5b8c\u6210&#xff0c;\u4e24\u8005\u4e4b\u95f4\u5f80\u5f80\u5b58\u5728\u65f6\u95f4\u95f4\u9694\u3002\u4f8b\u5982&#xff1a;<\/p>\n<ul>\n<li>\u7ebf\u7a0b\u5b8c\u6210\u8bfb\u53d6\u4e4b\u540e&#xff0c;\u9700\u8981\u7b49\u5f85\u4e1a\u52a1\u5904\u7406<\/li>\n<li>\u5199\u5165\u64cd\u4f5c\u53ef\u80fd\u4f1a\u56e0\u4e3a\u53d1\u9001\u7f13\u51b2\u533a\u5df2\u6ee1\u800c\u963b\u585e<\/li>\n<\/ul>\n<p>\u4e5f\u5c31\u662f\u8bf4&#xff0c;\u5728\u8bfb\u5199\u4e4b\u95f4\u5f80\u5f80\u5b58\u5728\u4e00\u4e2aIO \u7b49\u5f85\u9636\u6bb5\u3002<\/p>\n<p>\u800c\u6211\u4eec\u77e5\u9053&#xff0c;\u8981\u63d0\u9ad8\u670d\u52a1\u7aef\u7684\u5e76\u53d1\u80fd\u529b&#xff0c;\u5c31\u9700\u8981\u5c3d\u53ef\u80fd\u51cf\u5c11\u7ebf\u7a0b\u5728 IO \u7b49\u5f85\u9636\u6bb5\u7684\u65f6\u95f4&#xff0c;\u8ba9\u7ebf\u7a0b\u66f4\u591a\u5730\u8fd0\u884c\u5728 CPU \u4e0a\u6267\u884c\u4efb\u52a1&#xff0c;\u800c\u4e0d\u662f\u9677\u5165\u963b\u585e\u7b49\u5f85\u3002<\/p>\n<p>\u800c\u5982\u679c\u4e00\u4e2a\u7ebf\u7a0b\u65e2\u8d1f\u8d23\u5b8c\u6210\u8bfb\u4e8b\u4ef6\u4e5f\u8d1f\u8d23\u5b8c\u6210\u5199\u4e8b\u4ef6&#xff0c;\u90a3\u4e48\u4e00\u65e6\u5199\u4e8b\u4ef6\u672a\u5c31\u7eea&#xff0c;\u8be5\u7ebf\u7a0b\u5c31\u53ef\u80fd\u56e0\u4e3a\u6267\u884c\u5199\u64cd\u4f5c\u800c\u9677\u5165\u963b\u585e\u3002\u5bf9\u4e8e\u4e00\u4e2a TCP \u957f\u8fde\u63a5\u6765\u8bf4&#xff0c;\u5ba2\u6237\u7aef\u901a\u5e38\u4f1a\u5728\u540c\u4e00\u8fde\u63a5\u4e0a\u8fde\u7eed\u53d1\u9001\u591a\u4e2a HTTP \u8bf7\u6c42\u62a5\u6587\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b&#xff0c;\u5982\u679c\u5de5\u4f5c\u7ebf\u7a0b\u56e0\u4e3a\u5199\u4e8b\u4ef6\u672a\u5c31\u7eea\u800c\u963b\u585e&#xff0c;\u90a3\u4e48\u5373\u4f7f\u540e\u7eed\u8bf7\u6c42\u5df2\u7ecf\u5230\u8fbe\u5e76\u4e14\u63a5\u6536\u7f13\u51b2\u533a\u4e2d\u5df2\u7ecf\u5b58\u5728\u65b0\u7684\u6570\u636e&#xff0c;\u8be5\u7ebf\u7a0b\u4e5f\u65e0\u6cd5\u7ee7\u7eed\u5904\u7406\u8fd9\u4e9b\u8bf7\u6c42\u3002<\/p>\n<p>\u8fd9\u6837\u5c31\u4f1a\u5bfc\u81f4\u4e00\u79cd\u60c5\u51b5&#xff1a;\u7ebf\u7a0b\u88ab\u5199\u4e8b\u4ef6\u963b\u585e&#xff0c;\u4ece\u800c\u5f71\u54cd\u8bfb\u4e8b\u4ef6\u7684\u5904\u7406\u80fd\u529b&#xff0c;\u8fdb\u800c\u964d\u4f4e\u670d\u52a1\u7aef\u7684\u6574\u4f53\u5e76\u53d1\u6027\u80fd\u3002<\/p>\n<p>\u800c\u5b9e\u9645\u4e0a&#xff0c;\u8bfb\u53d6\u5b8c\u6574\u7684 HTTP \u8bf7\u6c42\u3001\u5904\u7406\u8bf7\u6c42\u5e76\u6784\u5efa\u54cd\u5e94\u8fd9\u4e00\u7cfb\u5217\u64cd\u4f5c&#xff0c;\u4e0e\u8c03\u7528 send \u53d1\u9001\u54cd\u5e94\u62a5\u6587\u8fd9\u4e00\u52a8\u4f5c\u5728\u903b\u8f91\u4e0a\u662f\u53ef\u4ee5\u5e76\u53d1\u8fdb\u884c\u7684\u3002\u4e5f\u5c31\u662f\u8bf4&#xff0c;\u8bf7\u6c42\u7684\u8bfb\u53d6\u4e0e\u5904\u7406\u5e76\u4e0d\u9700\u8981\u7b49\u5f85\u54cd\u5e94\u62a5\u6587\u6210\u529f\u53d1\u9001\u4e4b\u540e\u624d\u80fd\u7ee7\u7eed\u6267\u884c\u3002<\/p>\n<p>\u56e0\u6b64&#xff0c;\u901a\u8fc7\u5c06\u8bfb\u4e8b\u4ef6\u4e0e\u5199\u4e8b\u4ef6\u8fdb\u884c\u804c\u8d23\u5206\u79bb&#xff0c;\u53ef\u4ee5\u4f7f\u8bfb\u7ebf\u7a0b\u6c38\u8fdc\u4e0d\u4f1a\u56e0\u4e3a\u5199\u4e8b\u4ef6\u672a\u5c31\u7eea\u800c\u53d1\u751f\u963b\u585e\u3002\u539f\u56e0\u5728\u4e8e&#xff0c;\u8bfb\u7ebf\u7a0b\u672c\u8eab\u5e76\u4e0d\u8d1f\u8d23\u6570\u636e\u53d1\u9001&#xff0c;\u5176\u804c\u8d23\u4ec5\u9650\u4e8e&#xff1a;<\/p>\n<li>\u8bfb\u53d6 HTTP \u8bf7\u6c42\u62a5\u6587<\/li>\n<li>\u89e3\u6790\u5e76\u5904\u7406\u8bf7\u6c42<\/li>\n<li>\u6784\u5efa\u5bf9\u5e94\u7684\u54cd\u5e94\u62a5\u6587<\/li>\n<p>\u5b8c\u6210\u8fd9\u4e9b\u64cd\u4f5c\u540e&#xff0c;\u8bfb\u7ebf\u7a0b\u53ea\u9700\u8981\u5c06\u54cd\u5e94\u6570\u636e\u653e\u5165\u5bf9\u5e94\u8fde\u63a5\u7684\u53d1\u9001\u961f\u5217&#xff0c;\u5e76\u901a\u77e5\u5199\u7ebf\u7a0b\u5373\u53ef\u3002<\/p>\n<p>\u7531\u4e8e\u8bfb\u7ebf\u7a0b\u4e0d\u53c2\u4e0e\u53d1\u9001\u64cd\u4f5c&#xff0c;\u56e0\u6b64\u5373\u4f7f\u67d0\u4e2a\u8fde\u63a5\u56e0\u4e3a\u53d1\u9001\u7f13\u51b2\u533a\u5df2\u6ee1\u800c\u6682\u65f6\u65e0\u6cd5\u5199\u5165\u6570\u636e&#xff0c;\u4e5f\u4e0d\u4f1a\u5f71\u54cd\u8bfb\u7ebf\u7a0b\u7ee7\u7eed\u5904\u7406\u65b0\u7684\u8bf7\u6c42\u3002\u8fd9\u6837\u8bfb\u7ebf\u7a0b\u5c31\u53ef\u4ee5\u6301\u7eed\u3001\u9ad8\u6548\u5730\u5904\u7406\u5ba2\u6237\u7aef\u8bf7\u6c42&#xff0c;\u5176\u5904\u7406\u80fd\u529b\u4e0d\u4f1a\u53d7\u5230\u7f51\u7edc\u53d1\u9001\u901f\u5ea6\u7684\u76f4\u63a5\u9650\u5236&#xff0c;\u4ece\u800c\u663e\u8457\u63d0\u5347\u7cfb\u7edf\u7684\u6574\u4f53\u541e\u5410\u91cf&#xff08;Throughput&#xff09;\u3002<\/p>\n<p>\u57fa\u4e8e\u8fd9\u4e00\u8003\u8651&#xff0c;\u8fd9\u91cc\u5bf9\u8bfb\u5199\u4efb\u52a1\u8fdb\u884c\u4e86\u804c\u8d23\u5206\u79bb\u3002\u6240\u8c13\u5206\u79bb&#xff0c;\u662f\u6307&#xff1a;<\/p>\n<p>\u4e0d\u518d\u8ba9\u4e00\u4e2a\u7ebf\u7a0b\u540c\u65f6\u5b8c\u6210\u8bfb\u4e8b\u4ef6\u4e0e\u5199\u4e8b\u4ef6&#xff0c;\u800c\u662f\u8ba9\u7ebf\u7a0b\u53ea\u8d1f\u8d23\u5176\u4e2d\u4e00\u79cd\u7c7b\u578b\u7684\u4e8b\u4ef6\u3002<\/p>\n<hr \/>\n<p>\u56e0\u6b64&#xff0c;\u5bf9\u4e8e\u7ebf\u7a0b\u6c60\u4e2d\u7684\u5de5\u4f5c\u7ebf\u7a0b&#xff0c;\u6211\u66f4\u503e\u5411\u4e8e\u5c06\u5176\u79f0\u4e3a\u8bfb\u7ebf\u7a0b\u3002\u56e0\u4e3a\u7ebf\u7a0b\u6c60\u4e2d\u7684\u7ebf\u7a0b\u4ec5\u8d1f\u8d23\u5b8c\u6210\u8bfb\u4e8b\u4ef6\u5904\u7406&#xff1a;\u5373\u8bfb\u53d6 HTTP \u8bf7\u6c42\u3001\u89e3\u6790\u8bf7\u6c42\u5e76\u6784\u5efa\u54cd\u5e94\u62a5\u6587\u3002<\/p>\n<p>\u800c\u5199\u4e8b\u4ef6\u5219\u4ea4\u7531\u4e13\u95e8\u7684\u5199\u7ebf\u7a0b\u6765\u5b8c\u6210&#xff0c;\u5176\u804c\u8d23\u662f\u5c06\u6784\u5efa\u597d\u7684\u54cd\u5e94\u62a5\u6587\u53d1\u9001\u7ed9\u5ba2\u6237\u7aef\u3002\u56e0\u6b64&#xff0c;\u5728\u8c03\u7528 poll \u5f00\u59cb\u68c0\u6d4b\u4e8b\u4ef6\u4e4b\u524d&#xff0c;\u4f1a\u9884\u5148\u521b\u5efa\u4e00\u6279\u5199\u7ebf\u7a0b\u3002<\/p>\n<hr \/>\n<p>\u4f46\u8fd9\u91cc\u4f1a\u5f15\u51fa\u4e00\u4e2a\u65b0\u7684\u95ee\u9898\u3002<\/p>\n<p>\u7531\u4e8e\u7ebf\u7a0b\u4e4b\u95f4\u662f\u76f8\u4e92\u72ec\u7acb\u3001\u4e92\u4e0d\u5e72\u6270\u7684\u6267\u884c\u5355\u5143&#xff0c;\u8bfb\u7ebf\u7a0b\u8d1f\u8d23\u8bfb\u4e8b\u4ef6&#xff0c;\u5199\u7ebf\u7a0b\u8d1f\u8d23\u5199\u4e8b\u4ef6\u3002\u7136\u800c\u5bf9\u4e8e TCP \u8fde\u63a5\u6765\u8bf4&#xff0c;\u8bfb\u4e0e\u5199\u5728\u903b\u8f91\u4e0a\u5176\u5b9e\u662f\u5b58\u5728\u4e25\u683c\u65f6\u5e8f\u5173\u7cfb\u7684\u3002<\/p>\n<p>\u5177\u4f53\u6765\u8bf4&#xff1a;<\/p>\n<li>\u670d\u52a1\u7aef\u5fc5\u987b\u5148\u8bfb\u53d6\u5ba2\u6237\u7aef\u53d1\u9001\u7684 HTTP \u8bf7\u6c42\u62a5\u6587<\/li>\n<li>\u7136\u540e\u5904\u7406\u8bf7\u6c42\u5e76\u6784\u5efa\u54cd\u5e94\u62a5\u6587<\/li>\n<li>\u6700\u540e\u624d\u80fd\u5c06\u54cd\u5e94\u62a5\u6587\u53d1\u9001\u7ed9\u5ba2\u6237\u7aef<\/li>\n<p>\u7136\u800c\u8bfb\u7ebf\u7a0b\u4e0e\u5199\u7ebf\u7a0b\u7684CPU \u8c03\u5ea6\u987a\u5e8f\u662f\u4e0d\u53ef\u9884\u77e5\u7684\u3002\u5982\u679c\u5199\u7ebf\u7a0b\u5148\u88ab CPU \u8c03\u5ea6&#xff0c;\u800c\u6b64\u65f6\u8bfb\u7ebf\u7a0b\u5c1a\u672a\u8bfb\u53d6\u5b8c HTTP \u8bf7\u6c42\u3001\u4e5f\u5c1a\u672a\u6784\u5efa\u54cd\u5e94\u62a5\u6587&#xff0c;\u90a3\u4e48\u5199\u7ebf\u7a0b\u5b9e\u9645\u4e0a\u662f\u65e0\u6cd5\u6267\u884c\u53d1\u9001\u4efb\u52a1\u7684\u3002<\/p>\n<p>\u56e0\u6b64\u53ef\u4ee5\u770b\u5230&#xff0c;\u8bfb\u7ebf\u7a0b\u4e0e\u5199\u7ebf\u7a0b\u867d\u7136\u5728\u804c\u8d23\u4e0a\u662f\u5206\u79bb\u7684&#xff0c;\u4f46\u5728\u903b\u8f91\u4e0a\u4ecd\u7136\u5b58\u5728\u534f\u4f5c\u5173\u7cfb\u3002<\/p>\n<p>\u8fd9\u79cd\u534f\u4f5c\u5173\u7cfb\u7684\u6838\u5fc3\u5c31\u5728\u4e8e\u5199\u96c6\u5408\u3002\u5199\u96c6\u5408\u7528\u4e8e\u7ef4\u62a4\u4e00\u7ec4\u9700\u8981\u68c0\u6d4b\u5199\u4e8b\u4ef6\u662f\u5426\u5c31\u7eea\u7684\u6709\u6548\u6587\u4ef6\u63cf\u8ff0\u7b26\u3002<\/p>\n<p>\u5bf9\u4e8e\u8bfb\u7ebf\u7a0b\u6765\u8bf4&#xff0c;\u5f53\u5176&#xff1a;<\/p>\n<li>\u6210\u529f\u8bfb\u53d6\u5b8c\u6574\u7684 HTTP \u8bf7\u6c42\u62a5\u6587<\/li>\n<li>\u5904\u7406\u8bf7\u6c42\u5e76\u6784\u5efa\u54cd\u5e94\u62a5\u6587<\/li>\n<p>\u4e4b\u540e&#xff0c;\u5c31\u9700\u8981\u901a\u77e5\u5199\u7ebf\u7a0b\u53ef\u4ee5\u5f00\u59cb\u53d1\u9001\u54cd\u5e94\u3002<\/p>\n<p>\u8fd9\u91cc\u6240\u8c13\u7684\u201c\u901a\u77e5\u201d&#xff0c;\u5b9e\u9645\u4e0a\u5c31\u662f\u5c06\u5bf9\u5e94\u7684 fd \u6dfb\u52a0\u5230\u5199\u96c6\u5408\u4e2d&#xff0c;\u4ece\u800c\u8ba9\u5199\u7ebf\u7a0b\u540e\u7eed\u901a\u8fc7 poll \u68c0\u6d4b\u8be5 fd \u7684\u5199\u4e8b\u4ef6\u662f\u5426\u5c31\u7eea\u3002<\/p>\n<hr \/>\n<p>\u6839\u636e\u4e0a\u6587\u53ef\u77e5&#xff0c;\u8fd9\u91cc\u5b9a\u4e49\u4e86\u4e00\u4e2a pollmanager \u5bf9\u8c61\u3002\u8be5\u5bf9\u8c61\u5185\u90e8\u5305\u542b&#xff1a;<\/p>\n<ul>\n<li>\u4e00\u4e2a vector \u6570\u7ec4&#xff08;\u7528\u4e8e\u7ef4\u62a4 pollfd \u96c6\u5408&#xff09;<\/li>\n<li>\u4e00\u4e2a\u54c8\u5e0c\u8868&#xff08;\u7528\u4e8e\u8bb0\u5f55 fd \u4e0e vector \u6570\u7ec4\u4e0b\u6807\u7684\u6620\u5c04\u5173\u7cfb&#xff09;<\/li>\n<li>\u4e00\u628a\u7528\u4e8e\u4fdd\u62a4 vector \u4e0e\u54c8\u5e0c\u8868\u7684\u4e92\u65a5\u9501<\/li>\n<\/ul>\n<p>\u5bf9\u4e8e\u5199\u7ebf\u7a0b\u6765\u8bf4&#xff0c;\u5b83\u5e76\u4e0d\u662f\u53ea\u8d1f\u8d23\u4e00\u4e2a\u8fde\u63a5\u7684\u6570\u636e\u53d1\u9001\u3002\u5982\u679c\u6bcf\u4e2a\u5199\u7ebf\u7a0b\u53ea\u8d1f\u8d23\u68c0\u6d4b\u4e00\u4e2a fd \u7684\u5199\u4e8b\u4ef6&#xff0c;\u90a3\u4e48\u4e3b\u7ebf\u7a0b\u5c31\u5fc5\u987b\u521b\u5efa\u5927\u91cf\u5199\u7ebf\u7a0b\u3002<\/p>\n<p>\u800c\u7ebf\u7a0b\u6570\u91cf\u8fc7\u591a\u4f1a\u5e26\u6765\u660e\u663e\u7684\u7cfb\u7edf\u5f00\u9500&#xff0c;\u4f8b\u5982&#xff1a;<\/p>\n<ul>\n<li>\u9891\u7e41\u7684\u4e0a\u4e0b\u6587\u5207\u6362<\/li>\n<li>\u8f83\u5927\u7684\u5185\u5b58\u5360\u7528<\/li>\n<\/ul>\n<p>\u56e0\u6b64\u8fd9\u91cc\u7684\u8bbe\u8ba1\u662f&#xff1a;\u6bcf\u4e2a\u5199\u7ebf\u7a0b\u540c\u6837\u4f7f\u7528 poll \u6765\u68c0\u6d4b\u591a\u4e2a fd \u7684\u5199\u4e8b\u4ef6\u662f\u5426\u5c31\u7eea\u3002\u5f53\u68c0\u6d4b\u5230\u67d0\u4e2a fd \u5199\u4e8b\u4ef6\u5c31\u7eea\u65f6&#xff0c;\u5c31\u53ef\u4ee5\u76f4\u63a5\u53d1\u9001\u5bf9\u5e94\u7684\u54cd\u5e94\u6570\u636e\u3002<\/p>\n<p>\u6362\u53e5\u8bdd\u8bf4&#xff0c;\u5199\u7ebf\u7a0b\u7684\u804c\u8d23\u662f&#xff1a;<\/p>\n<ul>\n<li>\u540c\u65f6\u68c0\u6d4b\u591a\u4e2a fd \u7684\u5199\u4e8b\u4ef6<\/li>\n<li>\u5bf9\u5199\u5c31\u7eea\u7684 fd \u6267\u884c\u54cd\u5e94\u62a5\u6587\u53d1\u9001<\/li>\n<\/ul>\n<hr \/>\n<p>\u4f46\u6b64\u65f6\u4ecd\u7136\u5b58\u5728\u4e00\u4e2a\u5173\u952e\u95ee\u9898\u3002<\/p>\n<p>\u5199\u7ebf\u7a0b\u867d\u7136\u8d1f\u8d23\u53d1\u9001\u54cd\u5e94\u62a5\u6587&#xff0c;\u4f46\u5176\u524d\u63d0\u662f&#xff1a;\u5fc5\u987b\u80fd\u591f\u83b7\u53d6\u5bf9\u5e94\u7684\u54cd\u5e94\u62a5\u6587\u6570\u636e\u3002\u800c\u54cd\u5e94\u62a5\u6587\u7684\u6784\u5efa\u662f\u7531\u8bfb\u7ebf\u7a0b\u5b8c\u6210\u7684\u3002<\/p>\n<p>\u7136\u800c\u7ebf\u7a0b\u4e4b\u95f4\u7684\u7ebf\u7a0b\u6808\u662f\u76f8\u4e92\u72ec\u7acb\u7684&#xff0c;\u56e0\u6b64\u5fc5\u987b\u8bbe\u8ba1\u4e00\u4e2a\u5168\u5c40\u5171\u4eab\u7684\u6570\u636e\u7ed3\u6784&#xff0c;\u7528\u4e8e\u5728\u8bfb\u7ebf\u7a0b\u4e0e\u5199\u7ebf\u7a0b\u4e4b\u95f4\u8fdb\u884c\u6570\u636e\u4ea4\u6362\u3002<\/p>\n<p>\u8fd9\u91cc\u6211\u8bbe\u8ba1\u4e86\u4e00\u4e2a\u54c8\u5e0c\u8868\u7ed3\u6784\u3002\u8be5\u54c8\u5e0c\u8868\u7684\u6bcf\u4e00\u4e2a\u8282\u70b9\u90fd\u4e0e\u4e00\u4e2a\u5df2\u8fde\u63a5\u5957\u63a5\u5b57\u76f8\u5173\u8054&#xff1a;<\/p>\n<ul>\n<li>\u952e&#xff08;Key&#xff09;&#xff1a;\u6587\u4ef6\u63cf\u8ff0\u7b26 fd<\/li>\n<li>\u503c&#xff08;Value&#xff09;&#xff1a;Connection \u7ed3\u6784\u4f53<\/li>\n<\/ul>\n<p>Connection \u7ed3\u6784\u4f53\u4e2d\u5305\u542b\u4e00\u4e2a\u91cd\u8981\u5b57\u6bb5&#xff1a;\u53d1\u9001\u961f\u5217&#xff08;send queue&#xff09;\u3002<\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">Connection<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n   <span class=\"token keyword\">public<\/span><span class=\"token operator\">:<\/span><br \/>\n  <span class=\"token comment\">\/\/&#8230;<\/span><br \/>\n   std<span class=\"token double-colon punctuation\">::<\/span>queue<span class=\"token operator\">&lt;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&gt;<\/span> out_buffer<span class=\"token punctuation\">;<\/span><br \/>\n   <span class=\"token comment\">\/\/&#8230;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>\u8be5\u53d1\u9001\u961f\u5217\u4e2d\u7684\u6bcf\u4e00\u4e2a\u8282\u70b9\u90fd\u5bf9\u5e94\u4e00\u4e2a\u54cd\u5e94\u62a5\u6587\u5bf9\u8c61\u3002<\/p>\n<p>\u56e0\u6b64\u5bf9\u4e8e\u8bfb\u7ebf\u7a0b\u6765\u8bf4&#xff0c;\u5176\u64cd\u4f5c\u6d41\u7a0b\u4e3a&#xff1a;<\/p>\n<li>\u6839\u636e fd \u5728\u54c8\u5e0c\u8868\u4e2d\u67e5\u627e\u5bf9\u5e94\u7684 Connection \u5bf9\u8c61<\/li>\n<li>\u5b9a\u4f4d\u5230\u8be5\u8fde\u63a5\u7684\u53d1\u9001\u961f\u5217<\/li>\n<li>\u5c06\u6784\u5efa\u597d\u7684\u54cd\u5e94\u62a5\u6587 push \u5230\u53d1\u9001\u961f\u5217\u4e2d<\/li>\n<p>\u4e4b\u6240\u4ee5\u5c06\u8be5\u7ed3\u6784\u8bbe\u8ba1\u4e3a\u53d1\u9001\u961f\u5217&#xff0c;\u662f\u56e0\u4e3a\u961f\u5217\u5929\u7136\u5177\u5907**\u5148\u8fdb\u5148\u51fa&#xff08;FIFO&#xff09;**\u7684\u7279\u6027\u3002<\/p>\n<p>\u5728 HTTP \u573a\u666f\u4e0b&#xff0c;\u5ba2\u6237\u7aef\u53ef\u80fd\u4f1a\u8fde\u7eed\u53d1\u9001\u591a\u4e2a\u8bf7\u6c42\u3002\u4f8b\u5982\u5ba2\u6237\u7aef\u5148\u53d1\u9001\u8bf7\u6c42 A&#xff0c;\u968f\u540e\u53d1\u9001\u8bf7\u6c42 B\u3002\u90a3\u4e48\u670d\u52a1\u7aef\u5728\u8bed\u4e49\u4e0a\u5c31\u5e94\u5f53\u6309\u7167\u987a\u5e8f\u8fd4\u56de&#xff1a;<\/p>\n<ul>\n<li>\u54cd\u5e94 A<\/li>\n<li>\u7136\u540e\u518d\u8fd4\u56de\u54cd\u5e94 B<\/li>\n<\/ul>\n<p>\u56e0\u6b64\u4f7f\u7528\u961f\u5217\u7ed3\u6784\u53ef\u4ee5\u5f88\u597d\u5730\u4fdd\u8bc1\u54cd\u5e94\u62a5\u6587\u7684\u53d1\u9001\u987a\u5e8f\u4e0e\u8bf7\u6c42\u987a\u5e8f\u4fdd\u6301\u4e00\u81f4\u3002<\/p>\n<hr \/>\n<p>\u800c\u8fd9\u91cc\u9700\u8981\u6ce8\u610f\u7684\u662f&#xff1a;\u5bf9\u4e8e\u6bcf\u4e00\u4e2a\u5199\u7ebf\u7a0b\u6765\u8bf4&#xff0c;\u5176\u90fd\u62e5\u6709\u5404\u81ea\u72ec\u7acb\u7684\u5199\u96c6\u5408&#xff0c;\u5373\u5404\u81ea\u5bf9\u5e94\u4e00\u4e2a pollmanager \u5bf9\u8c61\u3002pollmanager \u5bf9\u8c61\u5185\u90e8\u5305\u542b\u4e00\u4e2a vector \u52a8\u6001\u6570\u7ec4&#xff0c;\u7528\u4e8e\u7ef4\u62a4\u9700\u8981\u88ab poll \u76d1\u6d4b\u7684 fd \u96c6\u5408\u3002\u8fd9\u610f\u5473\u7740\u5199\u7ebf\u7a0b\u53ef\u4ee5\u540c\u65f6\u68c0\u6d4b\u591a\u4e2a\u6587\u4ef6\u63cf\u8ff0\u7b26\u7684\u5199\u4e8b\u4ef6\u662f\u5426\u5c31\u7eea\u3002<\/p>\n<p>\u7531\u4e8e vector \u662f\u52a8\u6001\u6269\u5c55\u7684\u6570\u636e\u7ed3\u6784&#xff0c;\u56e0\u6b64\u4ece\u7ed3\u6784\u4e0a\u6765\u8bf4&#xff0c;\u5199\u7ebf\u7a0b\u6240\u80fd\u591f\u76d1\u6d4b\u7684 fd \u6570\u91cf\u5e76\u4e0d\u5b58\u5728\u56fa\u5b9a\u4e0a\u9650&#xff08;\u4ec5\u53d7\u7cfb\u7edf\u8d44\u6e90\u9650\u5236&#xff09;\u3002<\/p>\n<p>\u6839\u636e\u4e0a\u6587\u53ef\u77e5&#xff0c;\u8fd9\u91cc\u4e3a\u6bcf\u4e00\u4e2a\u8fde\u63a5\u8bbe\u8ba1\u4e86\u53d1\u9001\u961f\u5217\u3002\u5bf9\u4e8e\u8bfb\u7ebf\u7a0b\u6765\u8bf4&#xff0c;\u5f53\u5176\u8bfb\u53d6\u5b8c\u6574\u7684 HTTP \u8bf7\u6c42\u62a5\u6587\u5e76\u89e3\u6790\u8bf7\u6c42\u4e4b\u540e&#xff0c;\u5c31\u4f1a\u6784\u5efa\u5bf9\u5e94\u7684\u54cd\u5e94\u62a5\u6587&#xff0c;\u7136\u540e\u5c06\u8be5\u54cd\u5e94\u62a5\u6587\u653e\u7f6e\u5230\u8be5\u8fde\u63a5\u5bf9\u5e94\u7684\u53d1\u9001\u961f\u5217\u4e2d&#xff0c;\u968f\u540e\u9700\u8981\u901a\u77e5\u5199\u7ebf\u7a0b\u8fdb\u884c\u53d1\u9001\u64cd\u4f5c\u3002<\/p>\n<p>\u800c\u5bf9\u4e8e\u5199\u7ebf\u7a0b\u6765\u8bf4&#xff0c;\u5176\u6838\u5fc3\u903b\u8f91\u5219\u975e\u5e38\u7b80\u5355&#xff1a; \u4ece\u5bf9\u5e94\u8fde\u63a5\u7684\u53d1\u9001\u961f\u5217\u961f\u9996\u53d6\u51fa\u54cd\u5e94\u62a5\u6587&#xff0c;\u7136\u540e\u8c03\u7528 send \u6216 write \u63a5\u53e3&#xff0c;\u5c06\u8be5\u54cd\u5e94\u62a5\u6587\u53d1\u9001\u7ed9\u5ba2\u6237\u7aef\u3002<\/p>\n<p>\u9700\u8981\u6ce8\u610f\u7684\u662f&#xff0c;\u5bf9\u4e8e\u5199\u7ebf\u7a0b\u800c\u8a00&#xff0c;\u5176\u5e76\u4e0d\u5173\u5fc3\u5177\u4f53\u662f\u54ea\u4e2a fd \u7684\u5199\u4e8b\u4ef6\u5c31\u7eea\u3002\u5199\u7ebf\u7a0b\u53ea\u8d1f\u8d23&#xff1a;<\/p>\n<li>\u68c0\u6d4b\u5199\u4e8b\u4ef6\u662f\u5426\u5c31\u7eea<\/li>\n<li>\u6839\u636e\u5c31\u7eea\u7684 fd \u5b9a\u4f4d\u5230\u5bf9\u5e94\u7684\u8fde\u63a5\u5bf9\u8c61<\/li>\n<li>\u627e\u5230\u8be5\u8fde\u63a5\u7684\u53d1\u9001\u961f\u5217<\/li>\n<li>\u53d6\u51fa\u961f\u9996\u8282\u70b9<\/li>\n<li>\u8c03\u7528 send \u63a5\u53e3\u5b8c\u6210\u53d1\u9001<\/li>\n<p>\u56e0\u6b64&#xff0c;\u5bf9\u4e8e\u8bfb\u7ebf\u7a0b\u6765\u8bf4&#xff0c;\u5176\u53ea\u9700\u8981\u5728\u6784\u5efa\u597d\u54cd\u5e94\u62a5\u6587\u4e4b\u540e&#xff0c;\u5c06\u8be5\u54cd\u5e94\u62a5\u6587\u4ea4\u7ed9\u5176\u4e2d\u4e00\u4e2a\u5199\u7ebf\u7a0b\u8d1f\u8d23\u53d1\u9001\u5373\u53ef\u3002<\/p>\n<hr \/>\n<p>\u800c\u5bf9\u4e8e\u4e3b\u7ebf\u7a0b\u6765\u8bf4&#xff0c;\u7531\u4e8e\u6bcf\u4e00\u4e2a\u5199\u7ebf\u7a0b\u90fd\u80fd\u591f\u68c0\u6d4b\u4e00\u7ec4\u6587\u4ef6\u63cf\u8ff0\u7b26\u96c6\u5408&#xff0c;\u56e0\u6b64\u4e3b\u7ebf\u7a0b\u53ea\u9700\u8981\u521b\u5efa\u56fa\u5b9a\u6570\u91cf\u7684\u5199\u7ebf\u7a0b\u5373\u53ef\u3002\u56e0\u4e3a\u4e00\u4e2a\u5199\u7ebf\u7a0b\u5df2\u7ecf\u53ef\u4ee5\u540c\u65f6\u68c0\u6d4b\u591a\u4e2a fd&#xff0c;\u5982\u679c\u521b\u5efa\u8fc7\u591a\u5199\u7ebf\u7a0b&#xff0c;\u53cd\u800c\u4f1a\u5e26\u6765\u989d\u5916\u7684\u7cfb\u7edf\u5f00\u9500&#xff0c;\u4f8b\u5982&#xff1a;<\/p>\n<ul>\n<li>\u7ebf\u7a0b\u4e0a\u4e0b\u6587\u5207\u6362\u6210\u672c\u589e\u52a0<\/li>\n<li>\u7ebf\u7a0b\u6808\u7a7a\u95f4\u5bfc\u81f4\u7684\u989d\u5916\u5185\u5b58\u5360\u7528<\/li>\n<\/ul>\n<p>\u56e0\u6b64\u8fd9\u91cc\u7684\u8bbe\u8ba1\u662f&#xff1a;\u4e3b\u7ebf\u7a0b\u53ea\u521b\u5efa\u56fa\u5b9a\u6570\u91cf\u7684\u5199\u7ebf\u7a0b\u3002<\/p>\n<p>\u540c\u65f6\u9700\u8981\u6ce8\u610f\u7684\u662f&#xff0c;\u8fd9\u91cc\u7684\u5199\u7ebf\u7a0b\u4e0e\u8bfb\u7ebf\u7a0b\u6c60\u4e2d\u7684\u7ebf\u7a0b\u6a21\u578b\u662f\u4e0d\u540c\u7684\u3002\u8bfb\u7ebf\u7a0b\u6c60\u4e2d\u7684\u7ebf\u7a0b\u4f1a\u5e76\u53d1\u8bbf\u95ee\u540c\u4e00\u4e2a\u5171\u4eab\u8d44\u6e90\u2014\u2014\u5373\u73af\u5f62\u7f13\u51b2\u533a&#xff0c;\u7528\u4e8e\u4ece\u4e2d\u53d6\u8d70\u4efb\u52a1\u5bf9\u8c61\u3002\u800c\u5199\u7ebf\u7a0b\u5219\u4e0d\u540c&#xff0c;\u6bcf\u4e2a\u5199\u7ebf\u7a0b\u90fd\u62e5\u6709\u5404\u81ea\u72ec\u7acb\u7684 pollmanager \u5bf9\u8c61&#xff0c;\u56e0\u6b64\u4e0d\u4f1a\u51fa\u73b0\u591a\u4e2a\u7ebf\u7a0b\u5e76\u53d1\u8bbf\u95ee\u540c\u4e00\u4e2a vector \u52a8\u6001\u6570\u7ec4\u7684\u95ee\u9898\u3002<\/p>\n<p>\u56e0\u6b64\u5199\u7ebf\u7a0b\u5728\u8c03\u7528 poll \u65f6\u4e0d\u9700\u8981\u50cf\u4e3b\u7ebf\u7a0b\u90a3\u6837\u5bf9\u96c6\u5408\u8fdb\u884c\u5feb\u7167\u5904\u7406\u3002<\/p>\n<p>\u63a5\u4e0b\u6765&#xff0c;\u5bf9\u4e8e\u8bfb\u7ebf\u7a0b\u6765\u8bf4&#xff0c;\u8fd8\u9700\u8981\u89e3\u51b3\u4e00\u4e2a\u95ee\u9898&#xff1a;\u5c06\u6784\u5efa\u597d\u7684\u54cd\u5e94\u4ea4\u7ed9\u54ea\u4e00\u4e2a\u5199\u7ebf\u7a0b\u8fdb\u884c\u53d1\u9001\u3002<\/p>\n<p>\u7531\u4e8e\u5199\u7ebf\u7a0b\u6570\u91cf\u662f\u56fa\u5b9a\u7684&#xff0c;\u56e0\u6b64\u53ef\u4ee5\u91c7\u7528\u4e00\u79cd\u7b80\u5355\u800c\u9ad8\u6548\u7684\u8d1f\u8f7d\u5206\u914d\u7b56\u7565&#xff1a;\u901a\u8fc7\u6a21\u8fd0\u7b97\u6765\u786e\u5b9a\u5199\u7ebf\u7a0b\u7f16\u53f7\u3002\u4f8b\u5982&#xff1a;<\/p>\n<p>fd <span class=\"token operator\">%<\/span> write_thread_num<\/p>\n<p>\u901a\u8fc7\u8be5\u8ba1\u7b97\u5373\u53ef\u786e\u5b9a\u8be5 fd \u5e94\u8be5\u7531\u54ea\u4e2a\u5199\u7ebf\u7a0b\u8d1f\u8d23\u53d1\u9001\u3002<\/p>\n<p>\u56e0\u6b64&#xff0c;poll_server \u5bf9\u8c61\u5185\u90e8\u4f1a\u7ef4\u62a4\u4e00\u4e2a pollmanager \u6570\u7ec4&#xff0c;\u6bcf\u4e00\u4e2a\u5143\u7d20\u90fd\u5bf9\u5e94\u4e00\u4e2a\u5199\u7ebf\u7a0b\u6240\u7ef4\u62a4\u7684 fd \u96c6\u5408\u3002\u5728\u4e3b\u7ebf\u7a0b\u521b\u5efa\u5199\u7ebf\u7a0b\u4e4b\u524d&#xff0c;\u4f1a\u5148\u521b\u5efa\u5bf9\u5e94\u7684 pollmanager \u5bf9\u8c61&#xff0c;\u5e76\u5c06\u5176\u5c3e\u63d2\u5230\u6570\u7ec4\u4e2d&#xff0c;\u7136\u540e\u518d\u5c06\u8be5 pollmanager \u5bf9\u8c61\u4f5c\u4e3a\u53c2\u6570\u4f20\u9012\u7ed9\u5bf9\u5e94\u7684\u5199\u7ebf\u7a0b\u3002<\/p>\n<p><span class=\"token keyword\">const<\/span> <span class=\"token keyword\">int<\/span> write_thread_num <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">16<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">Poll_Server<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n     <span class=\"token function\">Poll_Server<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">uint16_t<\/span> _port<span class=\"token operator\">&#061;<\/span><span class=\"token number\">8888<\/span><span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string _ip<span class=\"token operator\">&#061;<\/span>_deafault<span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token operator\">:<\/span><span class=\"token function\">port<\/span><span class=\"token punctuation\">(<\/span>_port<span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token punctuation\">,<\/span> <span class=\"token function\">ip<\/span><span class=\"token punctuation\">(<\/span>_ip<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">,<\/span><span class=\"token function\">read_tp<\/span><span class=\"token punctuation\">(<\/span>threadpool<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">getinstance<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/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 comment\">\/\/..<\/span><br \/>\n     <span class=\"token keyword\">void<\/span> <span class=\"token function\">start<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">bool<\/span> isdaemon<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">false<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n         <span class=\"token comment\">\/\/&#8230;<\/span><br \/>\n           <span class=\"token keyword\">for<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/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>write_thread_num<span class=\"token punctuation\">;<\/span>i<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            write_pollmangers<span class=\"token punctuation\">.<\/span><span class=\"token function\">push_back<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">new<\/span> <span class=\"token function\">Pollmanager<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">thread<\/span><span class=\"token punctuation\">(<\/span>write_thread_func<span class=\"token punctuation\">,<\/span>write_pollmangers<span class=\"token punctuation\">.<\/span><span class=\"token function\">back<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><span class=\"token operator\">&amp;<\/span>read_pollmanger<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">detach<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n       <span class=\"token comment\">\/\/&#8230;.  <\/span><br \/>\n     <span class=\"token punctuation\">}<\/span><br \/>\n  <span class=\"token keyword\">private<\/span><span class=\"token operator\">:<\/span><br \/>\n        sock listensock<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">uint16_t<\/span> port<span class=\"token punctuation\">;<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>string ip<span class=\"token punctuation\">;<\/span><br \/>\n        Pollmanager read_pollmanger<span class=\"token punctuation\">{<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>vector<span class=\"token operator\">&lt;<\/span>Pollmanager<span class=\"token operator\">*<\/span><span class=\"token operator\">&gt;<\/span> write_pollmangers<span class=\"token punctuation\">;<\/span><br \/>\n        threadpool<span class=\"token operator\">&amp;<\/span> read_tp<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u5176\u4e2d&#xff0c;Poll_Server \u5185\u90e8\u8fd8\u5305\u542b\u4e00\u4e2a\u8bfb\u7ebf\u7a0b\u6c60\u5bf9\u8c61\u3002\u8be5\u8bfb\u7ebf\u7a0b\u6c60\u91c7\u7528\u5355\u4f8b\u6a21\u5f0f\u5b9e\u73b0&#xff0c;\u56e0\u6b64\u4e3b\u7ebf\u7a0b\u5728\u521b\u5efa\u5199\u7ebf\u7a0b\u4e4b\u524d&#xff0c;\u4f1a\u9996\u5148\u8c03\u7528\u7ebf\u7a0b\u6c60\u7684 start \u51fd\u6570\u5b8c\u6210\u521d\u59cb\u5316&#xff0c;\u5373\u521b\u5efa\u4e00\u6279\u8bfb\u7ebf\u7a0b\u3002<\/p>\n<hr \/>\n<p>\u63a5\u4e0b\u6765\u6765\u770b Distribute \u51fd\u6570\u3002<\/p>\n<p>Distribute \u51fd\u6570\u63a5\u6536\u4e00\u4e2a fd \u4ee5\u53ca\u8bfb\u96c6\u5408\u6307\u9488\u3002\u5728\u51fd\u6570\u5185\u90e8\u4f1a\u521b\u5efa\u4e00\u4e2a\u4efb\u52a1\u5bf9\u8c61&#xff0c;\u7136\u540e\u5c06\u8be5\u4efb\u52a1\u5bf9\u8c61 push \u5230\u73af\u5f62\u7f13\u51b2\u533a\u4e2d\u3002<\/p>\n<p>\u9700\u8981\u6ce8\u610f\u7684\u662f&#xff0c;\u8fd9\u91cc\u7684\u4efb\u52a1\u5bf9\u8c61\u4e0d\u4ec5\u4ec5\u5305\u542b\u4e00\u4e2a fd&#xff0c;\u540c\u65f6\u8fd8\u5305\u542b&#xff1a;<\/p>\n<ul>\n<li>\u5bf9\u5e94\u7684\u8bfb\u96c6\u5408<\/li>\n<li>\u5bf9\u5e94\u5199\u7ebf\u7a0b\u7684\u5199\u96c6\u5408<\/li>\n<\/ul>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">Task<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">public<\/span><span class=\"token operator\">:<\/span><br \/>\n    <span class=\"token function\">Task<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token operator\">:<\/span><span class=\"token function\">socketfd<\/span><span class=\"token punctuation\">(<\/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 function\">read_manager<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span><span class=\"token function\">write_manager<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><\/p>\n<p>    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token comment\">\/\/&#8230;<\/span><br \/>\n    <span class=\"token keyword\">private<\/span><span class=\"token operator\">:<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> socketfd<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">static<\/span> std<span class=\"token double-colon punctuation\">::<\/span>unordered_map<span class=\"token operator\">&lt;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&gt;<\/span> map<span class=\"token punctuation\">;<\/span><br \/>\n    Pollmanager<span class=\"token operator\">*<\/span> read_manager<span class=\"token punctuation\">;<\/span><br \/>\n    Pollmanager<span class=\"token operator\">*<\/span> write_manager<span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token comment\">\/\/&#8230;  <\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>unordered_map<span class=\"token operator\">&lt;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&gt;<\/span> Task<span class=\"token double-colon punctuation\">::<\/span>map <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;.html&#034;<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string\">&#034;text\/html&#034;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;.css&#034;<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string\">&#034;text\/css&#034;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;.png&#034;<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string\">&#034;image\/png&#034;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;.jpg&#034;<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string\">&#034;image\/jpeg&#034;<\/span><span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>\u5f53\u8bfb\u7ebf\u7a0b\u4ece\u73af\u5f62\u7f13\u51b2\u533a\u4e2d\u53d6\u8d70\u8be5\u4efb\u52a1\u5bf9\u8c61\u5e76\u5b8c\u6210\u54cd\u5e94\u6784\u5efa\u4e4b\u540e&#xff0c;\u53ea\u9700\u8981\u5c06 fd \u6dfb\u52a0\u5230\u5bf9\u5e94\u7684\u5199\u96c6\u5408\u4e2d&#xff0c;\u5373\u53ef\u901a\u77e5\u5bf9\u5e94\u7684\u5199\u7ebf\u7a0b\u3002\u968f\u540e\u5199\u7ebf\u7a0b\u5728\u68c0\u6d4b\u5230\u8be5 fd \u5199\u4e8b\u4ef6\u5c31\u7eea\u65f6&#xff0c;\u5c31\u80fd\u591f\u5b9a\u4f4d\u5230\u5bf9\u5e94\u8fde\u63a5\u7684\u53d1\u9001\u961f\u5217&#xff0c;\u5e76\u53d6\u51fa\u54cd\u5e94\u62a5\u6587\u8fdb\u884c\u53d1\u9001\u3002<\/p>\n<p> <span class=\"token keyword\">void<\/span> <span class=\"token function\">Distribute<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> fd<span class=\"token punctuation\">,<\/span>Pollmanager<span class=\"token operator\">*<\/span> read_arg<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n                   read_arg<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">del_fd<\/span><span class=\"token punctuation\">(<\/span>fd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                   Task <span class=\"token function\">t<\/span><span class=\"token punctuation\">(<\/span>fd<span class=\"token punctuation\">,<\/span>read_arg<span class=\"token punctuation\">,<\/span>write_pollmangers<span class=\"token punctuation\">[<\/span>fd<span class=\"token operator\">%<\/span>write_thread_num<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span>last_active_time<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                   read_tp<span class=\"token punctuation\">.<\/span><span class=\"token function\">push<\/span><span class=\"token punctuation\">(<\/span>t<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>\u8fd9\u91cc\u9700\u8981\u7279\u522b\u6ce8\u610f&#xff1a;\u5728 Distribute \u51fd\u6570\u5185\u90e8&#xff0c;\u5728\u5c06\u4efb\u52a1\u5bf9\u8c61 push \u5230\u73af\u5f62\u7f13\u51b2\u533a\u4e4b\u524d&#xff0c;\u9996\u5148\u4ece\u8bfb\u96c6\u5408\u4e2d\u5220\u9664\u4e86\u8be5 fd\u3002<\/p>\n<p>\u4e4b\u6240\u4ee5\u8981\u8fd9\u6837\u8bbe\u8ba1&#xff0c;\u662f\u56e0\u4e3a\u5728\u5f53\u524d\u7684\u67b6\u6784\u4e2d&#xff0c;\u8bfb\u7ebf\u7a0b\u7684\u804c\u8d23\u662f&#xff1a;\u53ea\u5904\u7406\u4e00\u4e2a\u5b8c\u6574\u7684 HTTP \u8bf7\u6c42\u3002\u4e5f\u5c31\u662f\u8bf4&#xff0c;\u4e00\u4e2a\u8bfb\u7ebf\u7a0b\u4f1a\u6267\u884c\u5982\u4e0b\u6d41\u7a0b&#xff1a;<\/p>\n<li>\u8bfb\u53d6\u5b8c\u6574\u7684 HTTP \u8bf7\u6c42<\/li>\n<li>\u89e3\u6790 HTTP \u8bf7\u6c42<\/li>\n<li>\u6784\u5efa\u54cd\u5e94\u62a5\u6587<\/li>\n<li>\u5c06\u54cd\u5e94\u62a5\u6587\u653e\u5165\u53d1\u9001\u961f\u5217<\/li>\n<li>\u901a\u77e5\u5199\u7ebf\u7a0b\u53d1\u9001<\/li>\n<li>\u7ebf\u7a0b\u56de\u5230\u7ebf\u7a0b\u6c60<\/li>\n<p>\u9700\u8981\u6ce8\u610f\u7684\u662f&#xff0c;\u6240\u8c13\u8bfb\u4e8b\u4ef6\u5c31\u7eea&#xff0c;\u672c\u8d28\u4e0a\u53ea\u662f\u8868\u793a\u63a5\u6536\u7f13\u51b2\u533a\u4e0d\u4e3a\u7a7a\u3002\u4f46\u5bf9\u4e8e TCP \u8fde\u63a5\u6765\u8bf4&#xff0c;\u7531\u4e8e TCP \u662f\u9762\u5411\u5b57\u8282\u6d41&#xff08;byte stream&#xff09;\u7684\u534f\u8bae&#xff0c;\u5bf9\u65b9\u4e00\u6b21\u53d1\u9001\u7684\u6570\u636e\\\\\u53ef\u80fd\u53ea\u662f\u4e00\u4e2a\u4e0d\u5b8c\u6574\u7684 HTTP \u8bf7\u6c42\u62a5\u6587\u3002<\/p>\n<p>\u800c\u8bfb\u7ebf\u7a0b\u5fc5\u987b\u5728\u8bfb\u53d6\u5230\u5b8c\u6574\u7684 HTTP \u8bf7\u6c42\u62a5\u6587\u4e4b\u540e&#xff0c;\u624d\u80fd\u7ee7\u7eed\u6267\u884c\u540e\u7eed\u6d41\u7a0b&#xff0c;\u4f8b\u5982\u89e3\u6790\u8bf7\u6c42\u5e76\u6784\u5efa\u54cd\u5e94\u3002<\/p>\n<p>\u56e0\u6b64\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b&#xff0c;\u8bfb\u7ebf\u7a0b\u53ef\u80fd\u9700\u8981\u7b49\u5f85\u5ba2\u6237\u7aef\u7ee7\u7eed\u53d1\u9001\u5269\u4f59\u7684\u6570\u636e\u3002<\/p>\n<p>\u5982\u679c\u6b64\u65f6\u4e0d\u5c06 fd \u4ece\u8bfb\u96c6\u5408\u4e2d\u5220\u9664&#xff0c;\u90a3\u4e48\u5f53\u5ba2\u6237\u7aef\u53d1\u9001\u5269\u4f59\u6570\u636e\u3001\u5185\u6838\u5c06\u5176\u5199\u5165\u63a5\u6536\u7f13\u51b2\u533a\u540e&#xff0c;\u5982\u679c\u4e3b\u7ebf\u7a0b\u518d\u6b21\u88ab CPU \u8c03\u5ea6\u5e76\u68c0\u6d4b\u5230\u8be5 fd \u7684\u8bfb\u4e8b\u4ef6\u5c31\u7eea&#xff0c;\u90a3\u4e48\u4e3b\u7ebf\u7a0b\u53ef\u80fd\u4f1a\u518d\u6b21\u5206\u914d\u4e00\u4e2a\u65b0\u7684\u8bfb\u7ebf\u7a0b\u6765\u5904\u7406\u8be5 fd\u3002<\/p>\n<p>\u867d\u7136 TCP \u662f\u5168\u53cc\u5de5\u901a\u4fe1&#xff0c;\u8bfb\u548c\u5199\u786e\u5b9e\u53ef\u4ee5\u5e76\u53d1\u6267\u884c&#xff08;\u56e0\u4e3a\u5b83\u4eec\u5206\u522b\u8bbf\u95ee\u4e0d\u540c\u7684\u7f13\u51b2\u533a&#xff09;&#xff0c;\u4f46\u5728\u5f53\u524d\u573a\u666f\u4e0b&#xff0c;\u5982\u679c\u591a\u4e2a\u8bfb\u7ebf\u7a0b\u540c\u65f6\u8bfb\u53d6\u540c\u4e00\u4e2a\u8fde\u63a5\u7684\u63a5\u6536\u7f13\u51b2\u533a&#xff0c;\u5c31\u4f1a\u51fa\u73b0\u95ee\u9898&#xff1a;<\/p>\n<ul>\n<li>\u65b0\u5206\u914d\u7684\u8bfb\u7ebf\u7a0b\u53ef\u80fd\u4f1a\u5148\u8bfb\u53d6\u90e8\u5206\u6570\u636e<\/li>\n<li>\u539f\u6765\u7684\u8bfb\u7ebf\u7a0b\u5c31\u65e0\u6cd5\u518d\u62fc\u63a5\u51fa\u5b8c\u6574\u7684 HTTP \u8bf7\u6c42\u62a5\u6587<\/li>\n<\/ul>\n<p>\u4ece\u800c\u5bfc\u81f4\u6570\u636e\u89e3\u6790\u9519\u8bef&#xff0c;\u751a\u81f3\u51fa\u73b0\u534f\u8bae\u5c42\u9762\u7684\u4e0d\u4e00\u81f4\u3002<\/p>\n<p>\u56e0\u6b64&#xff0c;\u4e3a\u4e86\u907f\u514d\u8fd9\u79cd\u6570\u636e\u7ade\u4e89\u95ee\u9898&#xff0c;\u9700\u8981\u4fdd\u8bc1&#xff1a;\u4e00\u4e2a\u8fde\u63a5\u7684\u8bfb\u7f13\u51b2\u533a\u5728\u540c\u4e00\u65f6\u523b\u53ea\u80fd\u88ab\u4e00\u4e2a\u8bfb\u7ebf\u7a0b\u8bbf\u95ee\u3002<\/p>\n<p>\u4e5f\u6b63\u56e0\u4e3a\u5982\u6b64&#xff0c;\u5f53\u4e3b\u7ebf\u7a0b\u5c06\u67d0\u4e2a fd \u7684\u8bfb\u4e8b\u4ef6\u5206\u914d\u7ed9\u4e00\u4e2a\u8bfb\u7ebf\u7a0b\u4e4b\u540e&#xff0c;\u5c31\u5fc5\u987b\u6682\u65f6\u4ece\u8bfb\u96c6\u5408\u4e2d\u5220\u9664\u8be5 fd&#xff0c;\u4f7f\u4e3b\u7ebf\u7a0b\u4e0d\u518d\u7ee7\u7eed\u68c0\u6d4b\u8be5 fd \u7684\u8bfb\u4e8b\u4ef6\u3002<\/p>\n<p>\u5f53\u8bfb\u7ebf\u7a0b\u5b8c\u6210\u5904\u7406\u5e76\u51c6\u5907\u56de\u5230\u7ebf\u7a0b\u6c60\u4e4b\u524d&#xff0c;\u5982\u679c\u8fde\u63a5\u4ecd\u7136\u5904\u4e8e\u6d3b\u8dc3\u72b6\u6001&#xff0c;\u5219\u4f1a\u91cd\u65b0\u5c06\u8be5 fd \u52a0\u56de\u8bfb\u96c6\u5408\u3002\u8fd9\u6837\u5f53\u5ba2\u6237\u7aef\u540e\u7eed\u7ee7\u7eed\u53d1\u9001\u8bf7\u6c42\u6570\u636e\u65f6&#xff0c;\u4e3b\u7ebf\u7a0b\u4ecd\u7136\u53ef\u4ee5\u68c0\u6d4b\u5230\u65b0\u7684\u8bfb\u4e8b\u4ef6\u3002<\/p>\n<p>\u5f53\u7136&#xff0c;\u8fd9\u91cc\u91cd\u65b0\u52a0\u5165\u8bfb\u96c6\u5408\u7684\u6761\u4ef6\u8fdc\u4e0d\u6b62\u5982\u6b64\u7b80\u5355\u3002\u5728\u540e\u7eed\u7684\u5b9e\u73b0\u4e2d&#xff0c;\u8fd8\u9700\u8981\u6839\u636e\u4e0d\u540c\u7684\u8fde\u63a5\u72b6\u6001\u548c\u591a\u79cd\u590d\u6742\u573a\u666f\u6765\u51b3\u5b9a\u662f\u5426\u5c06\u8be5 fd \u91cd\u65b0\u52a0\u5165\u8bfb\u96c6\u5408&#xff0c;\u8fd9\u4e9b\u5185\u5bb9\u5c06\u5728\u540e\u6587\u8fdb\u4e00\u6b65\u8fdb\u884c\u8be6\u7ec6\u5206\u6790\u3002<\/p>\n<h3>\u53d1\u9001\u961f\u5217\u7684\u7ebf\u7a0b\u5b89\u5168<\/h3>\n<p>\u6240\u4ee5\u6839\u636e\u4e0a\u6587\u53ef\u77e5&#xff0c;\u8fd9\u91cc\u9700\u8981\u521b\u5efa\u4e00\u4e2a\u5168\u5c40\u54c8\u5e0c\u8868\u3002\u8be5\u54c8\u5e0c\u8868\u4e2d\u7684\u6bcf\u4e00\u4e2a\u8282\u70b9\u5bf9\u5e94\u4e00\u4e2a Connection \u5bf9\u8c61&#xff0c;\u800c\u6bcf\u4e00\u4e2a fd \u90fd\u5bf9\u5e94\u4e00\u4e2a Connection \u5bf9\u8c61\u3002Connection \u5bf9\u8c61\u5185\u90e8\u5305\u542b\u4e00\u4e2a\u53d1\u9001\u961f\u5217\u3002<\/p>\n<p>\u56e0\u6b64&#xff0c;\u5bf9\u4e8e\u7ebf\u7a0b\u6c60\u4e2d\u7684\u8bfb\u7ebf\u7a0b\u6765\u8bf4&#xff0c;\u5176\u4e3b\u8981\u6267\u884c\u6d41\u7a0b\u5982\u4e0b&#xff1a;<\/p>\n<li>\u4ece TCP \u5957\u63a5\u5b57\u7684\u63a5\u6536\u7f13\u51b2\u533a\u4e2d\u8bfb\u53d6\u5b8c\u6574\u7684 HTTP \u8bf7\u6c42\u62a5\u6587<\/li>\n<li>\u89e3\u6790 HTTP \u8bf7\u6c42<\/li>\n<li>\u6784\u5efa\u5bf9\u5e94\u7684 HTTP \u54cd\u5e94\u62a5\u6587<\/li>\n<li>\u5c06\u54cd\u5e94\u62a5\u6587 push \u5230\u8be5\u8fde\u63a5\u5bf9\u5e94\u7684\u53d1\u9001\u961f\u5217\u4e2d<\/li>\n<p>\u5177\u4f53\u5b9e\u73b0\u4e0a&#xff0c;\u5c31\u662f\u6839\u636e fd \u67e5\u8be2\u54c8\u5e0c\u8868\u5b9a\u4f4d\u5230\u5bf9\u5e94\u7684 Connection \u5bf9\u8c61&#xff0c;\u7136\u540e\u8bbf\u95ee Connection \u5bf9\u8c61\u4e2d\u7684\u53d1\u9001\u961f\u5217\u5b57\u6bb5&#xff0c;\u5c06\u6784\u5efa\u597d\u7684\u54cd\u5e94\u62a5\u6587\u52a0\u5165\u961f\u5217\u3002<\/p>\n<p>\u800c\u5bf9\u4e8e\u5199\u7ebf\u7a0b\u6765\u8bf4&#xff0c;\u5f53\u5176\u901a\u8fc7 poll \u68c0\u6d4b\u5230\u67d0\u4e2a fd \u7684\u5199\u4e8b\u4ef6\u5c31\u7eea\u4e4b\u540e&#xff0c;\u4f1a\u6839\u636e\u8be5 fd \u5b9a\u4f4d\u5230\u5bf9\u5e94\u7684 Connection \u5bf9\u8c61&#xff0c;\u7136\u540e\u8bbf\u95ee\u8be5\u5bf9\u8c61\u4e2d\u7684\u53d1\u9001\u961f\u5217\u3002\u5199\u7ebf\u7a0b\u7684\u64cd\u4f5c\u662f\u4ece\u961f\u5217\u4e2d pop&#xff08;\u5f39\u51fa&#xff09;\u961f\u9996\u5143\u7d20&#xff0c;\u968f\u540e\u8c03\u7528 send \u63a5\u53e3\u5c06\u54cd\u5e94\u62a5\u6587\u53d1\u9001\u7ed9\u5ba2\u6237\u7aef\u3002<\/p>\n<p>\u6211\u4eec\u77e5\u9053&#xff0c;\u8bfb\u7ebf\u7a0b\u4e0e\u5199\u7ebf\u7a0b\u662f\u72ec\u7acb\u8fd0\u884c\u7684\u6267\u884c\u5355\u5143\u3002\u4ece\u903b\u8f91\u4e0a\u6765\u8bf4&#xff1a;<\/p>\n<ul>\n<li>\u8bfb\u7ebf\u7a0b\u8d1f\u8d23\u8bfb\u53d6 HTTP \u8bf7\u6c42\u3001\u89e3\u6790\u8bf7\u6c42\u5e76\u6784\u5efa\u54cd\u5e94<\/li>\n<li>\u5199\u7ebf\u7a0b\u8d1f\u8d23\u4ece\u53d1\u9001\u961f\u5217\u4e2d\u53d6\u51fa\u54cd\u5e94\u5e76\u8c03\u7528 send \u53d1\u9001<\/li>\n<\/ul>\n<p>\u8fd9\u4e24\u4e2a\u884c\u4e3a\u662f\u53ef\u4ee5\u5e76\u53d1\u6267\u884c\u7684\u3002\u539f\u56e0\u5728\u4e8e TCP \u662f\u5168\u53cc\u5de5\u901a\u4fe1\u534f\u8bae&#xff0c;\u8bfb\u7ebf\u7a0b\u4e0e\u5199\u7ebf\u7a0b\u8bbf\u95ee\u7684\u662f TCP \u5957\u63a5\u5b57\u7684\u4e0d\u540c\u7f13\u51b2\u533a&#xff1a;<\/p>\n<ul>\n<li>\u8bfb\u7ebf\u7a0b\u8bbf\u95ee \u63a5\u6536\u7f13\u51b2\u533a&#xff08;receive buffer&#xff09;<\/li>\n<li>\u5199\u7ebf\u7a0b\u8bbf\u95ee \u53d1\u9001\u7f13\u51b2\u533a&#xff08;send buffer&#xff09;<\/li>\n<\/ul>\n<p>\u56e0\u6b64\u5728 TCP \u5c42\u9762&#xff0c;\u8bfb\u4e0e\u5199\u4e4b\u95f4\u5e76\u4e0d\u4f1a\u4ea7\u751f\u51b2\u7a81\u3002<\/p>\n<p>\u4f46\u662f\u9700\u8981\u6ce8\u610f\u7684\u662f&#xff0c;\u5bf9\u4e8e\u8fd9\u91cc\u8bbe\u8ba1\u7684\u53d1\u9001\u961f\u5217\u800c\u8a00&#xff0c;\u8bfb\u7ebf\u7a0b\u4e0e\u5199\u7ebf\u7a0b\u4f1a\u5bf9\u5176\u8fdb\u884c\u5e76\u53d1\u8bbf\u95ee&#xff1a;<\/p>\n<ul>\n<li>\u8bfb\u7ebf\u7a0b\u4f1a\u6267\u884c push \u64cd\u4f5c<\/li>\n<li>\u5199\u7ebf\u7a0b\u4f1a\u6267\u884c pop \u64cd\u4f5c<\/li>\n<\/ul>\n<p>\u5982\u679c\u53d1\u9001\u961f\u5217\u7684\u5e95\u5c42\u5b9e\u73b0\u662f\u4e00\u4e2a\u53cc\u5411\u94fe\u8868&#xff0c;\u90a3\u4e48\u5728\u5e76\u53d1\u73af\u5883\u4e0b\u5c31\u53ef\u80fd\u51fa\u73b0\u6570\u636e\u4e0d\u4e00\u81f4\u7684\u95ee\u9898\u3002<\/p>\n<p>\u4f8b\u5982&#xff0c;\u5047\u8bbe\u5f53\u524d\u961f\u5217\u4e2d\u53ea\u6709\u4e00\u4e2a\u8282\u70b9&#xff0c;\u8bfb\u7ebf\u7a0b\u51c6\u5907\u6267\u884c push \u64cd\u4f5c\u3002\u6b64\u65f6 push \u7684\u8fc7\u7a0b\u901a\u5e38\u9700\u8981\u4fee\u6539\u591a\u4e2a\u6307\u9488&#xff0c;\u4f8b\u5982&#xff1a;<\/p>\n<ul>\n<li>\u4fee\u6539**\u54e8\u5175\u8282\u70b9&#xff08;sentinel node&#xff09;**\u7684\u524d\u9a71\u6307\u9488<\/li>\n<li>\u4fee\u6539\u539f\u5934\u8282\u70b9\u7684\u540e\u7ee7\u6307\u9488<\/li>\n<li>\u5c06\u65b0\u8282\u70b9\u63d2\u5165\u94fe\u8868<\/li>\n<\/ul>\n<p>\u7136\u800c\u8fd9\u4e9b\u6307\u9488\u4fee\u6539\u64cd\u4f5c\u5e76\u4e0d\u662f\u539f\u5b50\u7684\u3002<\/p>\n<p>\u5047\u8bbe\u8bfb\u7ebf\u7a0b\u5728\u6267\u884c push \u65f6&#xff0c;\u5df2\u7ecf\u5b8c\u6210\u4e86\u54e8\u5175\u8282\u70b9\u524d\u9a71\u6307\u9488\u7684\u4fee\u6539&#xff0c;\u4f46\u8fd8\u6ca1\u6709\u5b8c\u6210\u540e\u7eed\u64cd\u4f5c\u65f6&#xff0c;\u7ebf\u7a0b\u53d1\u751f\u4e86\u4e0a\u4e0b\u6587\u5207\u6362&#xff0c;CPU \u5207\u6362\u5230\u5199\u7ebf\u7a0b\u6267\u884c\u3002<\/p>\n<p>\u6b64\u65f6\u5199\u7ebf\u7a0b\u6267\u884c pop \u64cd\u4f5c&#xff0c;\u5e76\u4fee\u6539\u4e86\u54e8\u5175\u8282\u70b9\u7684\u540e\u7ee7\u6307\u9488&#xff0c;\u4ece\u800c\u5220\u9664\u5f53\u524d\u5934\u8282\u70b9\u3002\u5199\u7ebf\u7a0b\u6267\u884c\u5b8c\u6bd5\u540e\u518d\u6b21\u5207\u6362\u56de\u8bfb\u7ebf\u7a0b&#xff0c;\u800c\u8bfb\u7ebf\u7a0b\u7ee7\u7eed\u6267\u884c\u4e4b\u524d\u672a\u5b8c\u6210\u7684\u6307\u9488\u4fee\u6539\u64cd\u4f5c&#xff0c;\u4f8b\u5982\u4fee\u6539\u5934\u8282\u70b9\u7684\u540e\u7ee7\u6307\u9488\u3002<\/p>\n<p>\u4f46\u6b64\u65f6\u8be5\u5934\u8282\u70b9\u5df2\u7ecf\u88ab\u5199\u7ebf\u7a0b\u5220\u9664&#xff0c;\u8bfb\u7ebf\u7a0b\u7ee7\u7eed\u8bbf\u95ee\u8be5\u8282\u70b9\u5c31\u53ef\u80fd\u5bfc\u81f4\u975e\u6cd5\u5185\u5b58\u8bbf\u95ee&#xff08;use-after-free&#xff09;&#xff0c;\u4ece\u800c\u5f15\u53d1\u4e25\u91cd\u7684\u5185\u5b58\u9519\u8bef\u3002<\/p>\n<p>\u56e0\u6b64\u53ef\u4ee5\u770b\u5230&#xff0c;\u5f53\u8bfb\u7ebf\u7a0b\u4e0e\u5199\u7ebf\u7a0b\u5e76\u53d1\u8bbf\u95ee\u53d1\u9001\u961f\u5217\u65f6&#xff0c;\u5982\u679c\u7f3a\u4e4f\u540c\u6b65\u673a\u5236&#xff0c;\u5c31\u4f1a\u4ea7\u751f**\u6570\u636e\u7ade\u4e89&#xff08;data race&#xff09;**\u4ee5\u53ca\u6570\u636e\u7ed3\u6784\u7684\u4e0d\u4e00\u81f4\u95ee\u9898\u3002<\/p>\n<p>\u89e3\u51b3\u8fd9\u4e00\u95ee\u9898\u7684\u65b9\u5f0f\u4e5f\u5f88\u76f4\u63a5&#xff1a;\u5fc5\u987b\u5bf9\u53d1\u9001\u961f\u5217\u7684\u8bbf\u95ee\u8fdb\u884c\u540c\u6b65\u4fdd\u62a4&#xff0c;\u6700\u7b80\u5355\u53ef\u9760\u7684\u65b9\u6cd5\u5c31\u662f\u52a0\u9501\u3002<\/p>\n<p>\u8fd9\u91cc\u9501\u7684\u7c92\u5ea6\u5c31\u662f\u4fdd\u62a4\u53d1\u9001\u961f\u5217\u672c\u8eab\u3002\u56e0\u6b64&#xff0c;\u5728 Connection \u5bf9\u8c61\u4e2d\u9664\u4e86\u5305\u542b\u53d1\u9001\u961f\u5217\u4e4b\u5916&#xff0c;\u8fd8\u9700\u8981\u5305\u542b\u4e00\u628a\u4e92\u65a5\u9501&#xff0c;\u7528\u4e8e\u4fdd\u62a4\u53d1\u9001\u961f\u5217\u7684\u5e76\u53d1\u8bbf\u95ee\u3002<\/p>\n<p>\u4e5f\u5c31\u662f\u8bf4&#xff0c;\u8bfb\u7ebf\u7a0b\u4e0e\u5199\u7ebf\u7a0b\u5728\u6267\u884c push \u6216 pop \u64cd\u4f5c\u4e4b\u524d&#xff0c;\u90fd\u9700\u8981\u5148\u7ade\u4e89\u8be5\u4e92\u65a5\u9501\u3002\u53ea\u6709\u5728\u6210\u529f\u83b7\u53d6\u9501\u4e4b\u540e&#xff0c;\u624d\u80fd\u5bf9\u53d1\u9001\u961f\u5217\u8fdb\u884c\u4fee\u6539\u64cd\u4f5c\u3002<\/p>\n<p>\u793a\u4f8b\u7ed3\u6784\u5982\u4e0b&#xff1a;<\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">Connection<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n <span class=\"token keyword\">public<\/span><span class=\"token operator\">:<\/span><br \/>\n <span class=\"token comment\">\/\/&#8230;<\/span><br \/>\n std<span class=\"token double-colon punctuation\">::<\/span>queue<span class=\"token operator\">&lt;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&gt;<\/span> out_buffer<span class=\"token punctuation\">;<\/span><br \/>\n std<span class=\"token double-colon punctuation\">::<\/span>mutex mtx<span class=\"token punctuation\">;<\/span><br \/>\n <span class=\"token comment\">\/\/&#8230;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>\u5728\u8fd9\u79cd\u8bbe\u8ba1\u4e0b&#xff1a;<\/p>\n<ul>\n<li>\u8bfb\u7ebf\u7a0b\u5728 push \u54cd\u5e94\u62a5\u6587\u4e4b\u524d\u9700\u8981\u5148\u52a0\u9501<\/li>\n<li>\u5199\u7ebf\u7a0b\u5728 pop \u54cd\u5e94\u62a5\u6587\u4e4b\u524d\u540c\u6837\u9700\u8981\u5148\u52a0\u9501<\/li>\n<\/ul>\n<p>\u4ece\u800c\u4fdd\u8bc1\u53d1\u9001\u961f\u5217\u5728\u4efb\u4f55\u65f6\u523b\u53ea\u4f1a\u88ab\u4e00\u4e2a\u7ebf\u7a0b\u4fee\u6539&#xff0c;\u907f\u514d\u5e76\u53d1\u8bbf\u95ee\u5e26\u6765\u7684\u6570\u636e\u4e0d\u4e00\u81f4\u95ee\u9898\u3002<\/p>\n<h3>\u8bfb\u7ebf\u7a0b\u6574\u4f53\u67b6\u6784<\/h3>\n<p>\u8ba4\u8bc6\u5230\u8bfb\u5199\u5206\u79bb\u4e4b\u540e&#xff0c;\u63a5\u4e0b\u6765\u6211\u4eec\u5c31\u91cd\u70b9\u5173\u6ce8\u8bfb\u7ebf\u7a0b\u7684\u8bbe\u8ba1\u3002\u8bfb\u7ebf\u7a0b\u5b9e\u9645\u4e0a\u5c31\u662f\u7ebf\u7a0b\u6c60\u4e2d\u7684\u5de5\u4f5c\u7ebf\u7a0b\u3002\u5f53\u8bfb\u7ebf\u7a0b\u4ece\u73af\u5f62\u7f13\u51b2\u533a\u4e2d\u83b7\u53d6\u5230 Task \u4efb\u52a1\u5bf9\u8c61\u4e4b\u540e&#xff0c;\u4f1a\u8c03\u7528 Task \u7684 run \u51fd\u6570\u6267\u884c\u76f8\u5e94\u7684\u4e1a\u52a1\u903b\u8f91&#xff0c;\u4f8b\u5982&#xff1a;\u8bfb\u53d6 HTTP \u8bf7\u6c42\u3001\u89e3\u6790 HTTP \u8bf7\u6c42\u4ee5\u53ca\u6784\u5efa\u54cd\u5e94\u62a5\u6587\u7b49\u3002<\/p>\n<p>\u9996\u5148\u9700\u8981\u8bf4\u660e\u7684\u4e00\u70b9\u662f&#xff0c;\u5728\u8bbe\u8ba1\u8bfb\u7ebf\u7a0b\u6a21\u578b\u65f6&#xff0c;\u5f88\u591a\u8bfb\u8005\u53ef\u80fd\u4f1a\u4ea7\u751f\u8fd9\u6837\u4e00\u79cd\u76f4\u89c9&#xff1a;\u65e2\u7136\u5df2\u7ecf\u5b9e\u73b0\u4e86\u8bfb\u5199\u5206\u79bb&#xff0c;\u90a3\u4e48\u5bf9\u4e8e\u8bfb\u7ebf\u7a0b\u6765\u8bf4&#xff0c;\u5176\u4efb\u52a1\u4f3c\u4e4e\u5e94\u8be5\u662f\u8bfb\u53d6\u4e00\u4e2a\u8fde\u63a5\u4e0a\u7684\u6240\u6709 HTTP \u8bf7\u6c42\u62a5\u6587&#xff0c;\u7136\u540e\u4f9d\u6b21\u89e3\u6790\u8fd9\u4e9b\u8bf7\u6c42&#xff0c;\u5e76\u5c06\u6784\u5efa\u597d\u7684\u54cd\u5e94\u62a5\u6587\u4f9d\u6b21 push \u5230\u53d1\u9001\u961f\u5217\u4e2d\u3002<\/p>\n<p>\u4ece\u529f\u80fd\u6b63\u786e\u6027\u7684\u89d2\u5ea6\u6765\u770b&#xff0c;\u8fd9\u79cd\u8bbe\u8ba1\u786e\u5b9e\u662f\u53ef\u884c\u7684\u3002\u7279\u522b\u662f\u5728 TCP \u957f\u8fde\u63a5&#xff08;Keep-Alive&#xff09; \u573a\u666f\u4e0b&#xff0c;\u5ba2\u6237\u7aef\u53ef\u80fd\u4f1a\u5728\u540c\u4e00\u6761\u8fde\u63a5\u4e0a\u8fde\u7eed\u53d1\u9001\u591a\u4e2a HTTP \u8bf7\u6c42\u62a5\u6587&#xff0c;\u56e0\u6b64\u8bfb\u7ebf\u7a0b\u4f3c\u4e4e\u7406\u5e94\u8d1f\u8d23\u4f9d\u6b21\u8bfb\u53d6\u5e76\u5904\u7406\u6240\u6709\u8bf7\u6c42\u3002<\/p>\n<p>\u7136\u800c&#xff0c;\u5728\u9ad8\u5e76\u53d1\u670d\u52a1\u5668\u7684\u8bbe\u8ba1\u573a\u666f\u4e2d&#xff0c;\u6211\u4eec\u9700\u8981\u8fdb\u4e00\u6b65\u5173\u6ce8\u8fd9\u79cd\u8bbe\u8ba1\u5728\u6548\u7387\u5c42\u9762\u6240\u5e26\u6765\u7684\u95ee\u9898\u3002<\/p>\n<p>\u6309\u7167\u4e0a\u8ff0\u8bbe\u8ba1&#xff0c;\u4e5f\u5c31\u662f\u7531\u4e00\u4e2a\u8bfb\u7ebf\u7a0b\u8d1f\u8d23\u8bfb\u53d6\u5e76\u5904\u7406\u4e00\u4e2a\u8fde\u63a5\u4e0a\u7684\u6240\u6709\u8bf7\u6c42\u62a5\u6587\u3002\u4f46\u9700\u8981\u6ce8\u610f\u7684\u662f&#xff0c;\u5bf9\u4e8e\u5ba2\u6237\u7aef\u6765\u8bf4&#xff0c;\u5176\u5e76\u4e0d\u4e00\u5b9a\u4f1a\u4e00\u6b21\u6027\u5c06\u6240\u6709\u8bf7\u6c42\u62a5\u6587\u8fde\u7eed\u53d1\u9001\u7ed9\u670d\u52a1\u5668\u3002\u6362\u53e5\u8bdd\u8bf4&#xff0c;\u8bfb\u7ebf\u7a0b\u5e76\u4e0d\u4e00\u5b9a\u4f1a\u9047\u5230\u4e00\u79cd\u201c\u7406\u60f3\u60c5\u51b5\u201d&#xff1a;\u5373 TCP \u63a5\u6536\u7f13\u51b2\u533a\u4e2d\u5df2\u7ecf\u5305\u542b\u4e86\u5ba2\u6237\u7aef\u53d1\u9001\u7684\u6240\u6709\u8bf7\u6c42\u62a5\u6587\u6570\u636e\u3002<\/p>\n<p>\u5b9e\u9645\u4e0a&#xff0c;\u66f4\u5e38\u89c1\u7684\u60c5\u51b5\u662f&#xff1a;\u5ba2\u6237\u7aef\u5728\u8c03\u7528 send \u53d1\u9001\u8bf7\u6c42\u4e4b\u524d&#xff0c;\u672c\u8eab\u4e5f\u9700\u8981\u6267\u884c\u4e00\u5b9a\u7684\u4e1a\u52a1\u903b\u8f91\u3002\u56e0\u6b64\u5ba2\u6237\u7aef\u5f80\u5f80\u662f\u5206\u6279\u53d1\u9001\u6570\u636e&#xff0c;\u800c\u4e0d\u662f\u4e00\u6b21\u6027\u53d1\u9001\u6240\u6709\u8bf7\u6c42\u62a5\u6587\u3002<\/p>\n<p>\u8fd9\u5c31\u4f1a\u5e26\u6765\u4e00\u4e2a\u95ee\u9898&#xff1a;\u8bfb\u7ebf\u7a0b\u53ef\u80fd\u5df2\u7ecf\u8bfb\u53d6\u5e76\u5904\u7406\u4e86\u5f53\u524d TCP \u63a5\u6536\u7f13\u51b2\u533a\u4e2d\u5305\u542b\u7684\u6240\u6709\u5b8c\u6574\u8bf7\u6c42\u62a5\u6587&#xff0c;\u4f46\u8fde\u63a5\u672c\u8eab\u5e76\u6ca1\u6709\u5173\u95ed&#xff0c;\u4f8b\u5982 HTTP \u5934\u90e8\u4e2d\u7684 Connection: keep-alive \u5b57\u6bb5\u8868\u660e\u8be5\u8fde\u63a5\u4ecd\u7136\u4fdd\u6301\u957f\u8fde\u63a5\u72b6\u6001\u3002\u8fd9\u610f\u5473\u7740\u5ba2\u6237\u7aef\u5728\u672a\u6765\u4ecd\u7136\u53ef\u80fd\u7ee7\u7eed\u53d1\u9001\u65b0\u7684\u8bf7\u6c42\u62a5\u6587\u3002<\/p>\n<p>\u65e2\u7136\u5ba2\u6237\u7aef\u8fd8\u4f1a\u7ee7\u7eed\u53d1\u9001\u8bf7\u6c42&#xff0c;\u90a3\u4e48\u5bf9\u4e8e\u5f53\u524d\u8bfb\u7ebf\u7a0b\u6765\u8bf4&#xff0c;\u5982\u679c\u7ee7\u7eed\u7b49\u5f85\u65b0\u7684\u8bf7\u6c42\u62a5\u6587\u5230\u8fbe&#xff0c;\u5176\u552f\u4e00\u7684\u9009\u62e9\u5c31\u662f\u963b\u585e\u7b49\u5f85\u3002\u56e0\u4e3a\u6b64\u65f6\u65e2\u65e0\u6cd5\u8bfb\u53d6\u5230\u65b0\u7684\u5b8c\u6574 HTTP \u8bf7\u6c42&#xff0c;\u4e5f\u65e0\u6cd5\u7ee7\u7eed\u6267\u884c\u540e\u7eed\u4e1a\u52a1\u903b\u8f91\u3002<\/p>\n<p>\u800c\u6211\u4eec\u77e5\u9053&#xff0c;\u5728\u9ad8\u5e76\u53d1\u670d\u52a1\u5668\u8bbe\u8ba1\u4e2d&#xff0c;\u63d0\u9ad8\u6027\u80fd\u7684\u5173\u952e\u4e4b\u4e00\u5c31\u662f\u51cf\u5c11\u7ebf\u7a0b\u5728 IO \u7b49\u5f85\u9636\u6bb5\u7684\u65f6\u95f4\u3002\u5bfc\u81f4\u8fd9\u4e00\u95ee\u9898\u7684\u6839\u672c\u539f\u56e0\u5728\u4e8e&#xff1a;\u6211\u4eec\u4e60\u60ef\u6027\u5730\u5c06\u8bfb\u7ebf\u7a0b\u7ed1\u5b9a\u5230\u67d0\u4e00\u4e2a\u8fde\u63a5\u7684\u751f\u547d\u5468\u671f\u4e0a\u3002<\/p>\n<p>\u56e0\u6b64&#xff0c;\u5728\u8fd9\u91cc\u7684\u8bbe\u8ba1\u4e2d&#xff0c;\u8bfb\u7ebf\u7a0b\u4e0d\u4f1a\u4f34\u968f\u4e00\u4e2a\u8fde\u63a5\u7684\u6574\u4e2a\u751f\u547d\u5468\u671f&#xff0c;\u800c\u662f\u53ea\u8d1f\u8d23\u5904\u7406\u4e00\u6b21\u5c31\u7eea\u7684\u8bfb\u4e8b\u4ef6\u3002<\/p>\n<p>\u5177\u4f53\u6d41\u7a0b\u5982\u4e0b&#xff1a;<\/p>\n<li>\u4e3b\u7ebf\u7a0b\u901a\u8fc7 poll \u68c0\u6d4b\u5230\u67d0\u4e2a fd \u7684\u8bfb\u4e8b\u4ef6\u5c31\u7eea<\/li>\n<li>\u5c06\u8be5 fd \u5c01\u88c5\u4e3a\u4efb\u52a1\u5bf9\u8c61\u5e76\u653e\u5165\u73af\u5f62\u7f13\u51b2\u533a<\/li>\n<li>\u8bfb\u7ebf\u7a0b\u4ece\u73af\u5f62\u7f13\u51b2\u533a\u4e2d\u83b7\u53d6\u4efb\u52a1\u5bf9\u8c61<\/li>\n<li>\u4ece TCP \u63a5\u6536\u7f13\u51b2\u533a\u4e2d\u8bfb\u53d6\u6570\u636e<\/li>\n<li>\u5c1d\u8bd5\u89e3\u6790\u5b8c\u6574\u7684 HTTP \u8bf7\u6c42<\/li>\n<li>\u6784\u5efa\u54cd\u5e94\u62a5\u6587\u5e76\u653e\u5165\u53d1\u9001\u961f\u5217<\/li>\n<li>\u5c06 fd \u52a0\u5165\u5bf9\u5e94\u5199\u7ebf\u7a0b\u7684\u5199\u96c6\u5408&#xff0c;\u901a\u77e5\u5199\u7ebf\u7a0b\u53d1\u9001\u54cd\u5e94<\/li>\n<p>\u5982\u679c\u8be5\u8fde\u63a5\u662f\u957f\u8fde\u63a5&#xff08;keep-alive&#xff09;&#xff0c;\u610f\u5473\u7740\u5ba2\u6237\u7aef\u672a\u6765\u4ecd\u7136\u53ef\u80fd\u7ee7\u7eed\u53d1\u9001\u8bf7\u6c42\u62a5\u6587\u3002\u90a3\u4e48\u5728\u8bfb\u7ebf\u7a0b\u5b8c\u6210\u5f53\u524d\u8bf7\u6c42\u5904\u7406\u4e4b\u540e&#xff0c;\u5c31\u9700\u8981\u5c06\u8be5 fd \u91cd\u65b0\u52a0\u5165\u8bfb\u96c6\u5408&#xff0c;\u4f7f\u4e3b\u7ebf\u7a0b\u80fd\u591f\u7ee7\u7eed\u68c0\u6d4b\u8be5 fd \u7684\u8bfb\u4e8b\u4ef6\u3002\u5f53\u65b0\u7684\u6570\u636e\u5230\u8fbe\u65f6&#xff0c;\u4e3b\u7ebf\u7a0b\u4f1a\u518d\u6b21\u5206\u914d\u4e00\u4e2a\u65b0\u7684\u8bfb\u7ebf\u7a0b\u6765\u5904\u7406&#xff0c;\u4ece\u800c\u5f62\u6210\u4e00\u79cd\u63a5\u529b\u5f0f\u7684\u8bfb\u4e8b\u4ef6\u5904\u7406\u673a\u5236\u3002<\/p>\n<p>\u5728\u8fd9\u79cd\u8bbe\u8ba1\u4e0b&#xff0c;\u8bfb\u7ebf\u7a0b\u53ea\u8d1f\u8d23\u5904\u7406\u5df2\u7ecf\u5c31\u7eea\u7684\u8bfb\u4e8b\u4ef6\u3002\u8fd9\u610f\u5473\u7740 TCP \u63a5\u6536\u7f13\u51b2\u533a\u6b64\u65f6\u81f3\u5c11\u5305\u542b\u90e8\u5206\u6570\u636e&#xff0c;\u4ece\u800c\u907f\u514d\u8bfb\u7ebf\u7a0b\u56e0\u4e3a\u6ca1\u6709\u6570\u636e\u800c\u9677\u5165\u963b\u585e\u7b49\u5f85\u3002<\/p>\n<hr \/>\n<p>\u7136\u800c\u8fd9\u91cc\u53c8\u4f1a\u5f15\u51fa\u4e00\u4e2a\u65b0\u7684\u95ee\u9898\u3002<\/p>\n<p>\u867d\u7136\u8bfb\u7ebf\u7a0b\u53ea\u8d1f\u8d23\u8bfb\u53d6\u4e00\u4e2a\u5b8c\u6574\u7684 HTTP \u8bf7\u6c42&#xff0c;\u4f46 TCP \u662f**\u9762\u5411\u5b57\u8282\u6d41&#xff08;byte stream&#xff09;*\u7684\u534f\u8bae\u3002\u5bf9\u65b9\u53d1\u9001\u7684\u6570\u636e\u5e76\u4e0d\u4e00\u5b9a\u521a\u597d\u5bf9\u5e94\u4e00\u4e2a\u5b8c\u6574\u7684 HTTP \u8bf7\u6c42\u62a5\u6587&#xff0c;\u5f88\u53ef\u80fd\u53ea\u662f*\u90e8\u5206\u8bf7\u6c42\u6570\u636e\u3002<\/p>\n<p>\u90a3\u4e48\u95ee\u9898\u5c31\u53d8\u6210&#xff1a;\u5982\u679c\u8bfb\u7ebf\u7a0b\u5728\u5f53\u524d\u65f6\u523b\u65e0\u6cd5\u8bfb\u53d6\u5230\u5b8c\u6574\u7684 HTTP \u8bf7\u6c42\u62a5\u6587&#xff0c;\u662f\u5426\u5e94\u8be5\u963b\u585e\u7b49\u5f85\u5ba2\u6237\u7aef\u7ee7\u7eed\u53d1\u9001\u6570\u636e&#xff1f;<\/p>\n<p>\u7b54\u6848\u663e\u7136\u662f\u5426\u5b9a\u7684\u3002\u6b63\u5982\u524d\u6587\u6240\u8ff0&#xff0c;\u8bfb\u7ebf\u7a0b\u4e0d\u518d\u7ed1\u5b9a\u4e8e\u67d0\u4e00\u4e2a\u8fde\u63a5&#xff0c;\u5b83\u53ea\u662f\u4e00\u4e2a\u4e13\u95e8\u8d1f\u8d23\u8bfb\u53d6\u3001\u89e3\u6790\u4ee5\u53ca\u6784\u5efa\u54cd\u5e94\u7684\u6267\u884c\u5355\u5143\u3002\u53ef\u4ee5\u5c06\u5176\u7406\u89e3\u4e3a\u6d41\u6c34\u7ebf\u4e0a\u7684\u5de5\u4eba&#xff1a;\u5f53\u5f53\u524d\u6d41\u6c34\u7ebf\u6682\u65f6\u6ca1\u6709\u8db3\u591f\u7684\u6570\u636e\u65f6&#xff0c;\u8be5\u5de5\u4eba\u5e94\u5f53\u7acb\u523b\u8fd4\u56de\u7ebf\u7a0b\u6c60&#xff0c;\u53bb\u5904\u7406\u5176\u4ed6\u5df2\u7ecf\u5c31\u7eea\u7684\u4efb\u52a1\u3002<\/p>\n<p>\u4f46\u8fd9\u91cc\u7684\u5173\u952e\u5728\u4e8e&#xff1a;\u5f53\u524d\u8bfb\u7ebf\u7a0b\u5df2\u7ecf\u8bfb\u53d6\u4e86\u4e00\u90e8\u5206 HTTP \u8bf7\u6c42\u6570\u636e\u3002\u5373\u4f7f\u8bfb\u7ebf\u7a0b\u5728\u8fd4\u56de\u7ebf\u7a0b\u6c60\u4e4b\u524d\u5c06 fd \u91cd\u65b0\u52a0\u5165\u8bfb\u96c6\u5408&#xff0c;\u7531\u65b0\u7684\u8bfb\u7ebf\u7a0b\u7ee7\u7eed\u63a5\u529b\u8bfb\u53d6&#xff0c;\u65b0\u7684\u8bfb\u7ebf\u7a0b\u4ece TCP \u63a5\u6536\u7f13\u51b2\u533a\u4e2d\u8bfb\u53d6\u5230\u7684\u4ecd\u7136\u53ef\u80fd\u662f\u4e0d\u5b8c\u6574\u7684\u8bf7\u6c42\u6570\u636e\u3002<\/p>\n<p>\u7531\u4e8e\u6bcf\u4e2a\u7ebf\u7a0b\u7684\u7ebf\u7a0b\u6808\u662f\u76f8\u4e92\u72ec\u7acb\u7684&#xff0c;\u56e0\u6b64\u5fc5\u987b\u8bbe\u8ba1\u4e00\u79cd\u5168\u5c40\u5171\u4eab\u7684\u6570\u636e\u7ed3\u6784\u6765\u4fdd\u5b58\u5df2\u7ecf\u8bfb\u53d6\u5230\u4f46\u5c1a\u672a\u89e3\u6790\u5b8c\u6210\u7684\u8bf7\u6c42\u6570\u636e\u3002<\/p>\n<p>\u4e3a\u4e86\u89e3\u51b3\u8fd9\u4e00\u95ee\u9898&#xff0c;\u8fd9\u91cc\u5728 Connection \u5bf9\u8c61\u4e2d\u5f15\u5165\u4e86\u4e00\u4e2a\u63a5\u6536\u7f13\u51b2\u7ed3\u6784 in_buffer\u3002\u5176\u4e2d\u961f\u5217\u4e2d\u7684\u6bcf\u4e00\u4e2a\u8282\u70b9\u8868\u793a\u4e00\u4e2a\u6b63\u5728\u6784\u5efa\u7684 HTTP \u8bf7\u6c42\u6570\u636e\u7247\u6bb5\u3002<\/p>\n<p>\u4e4b\u6240\u4ee5\u9009\u62e9\u961f\u5217\u7ed3\u6784&#xff0c;\u662f\u56e0\u4e3a HTTP \u8bf7\u6c42\u901a\u5e38\u9700\u8981\u6309\u7167\u5230\u8fbe\u987a\u5e8f\u8fdb\u884c\u5904\u7406\u3002\u56e0\u6b64\u961f\u9996\u8282\u70b9\u4ee3\u8868\u6700\u65e9\u63a5\u6536\u5230\u7684\u8bf7\u6c42\u6570\u636e&#xff0c;\u8bfb\u7ebf\u7a0b\u5728\u5904\u7406\u8bf7\u6c42\u65f6&#xff0c;\u53ea\u9700\u8981\u4f18\u5148\u5904\u7406\u961f\u9996\u8282\u70b9\u5373\u53ef\u3002<\/p>\n<p>in_buffer \u4ece\u903b\u8f91\u4e0a\u770b\u867d\u7136\u4f7f\u7528\u7684\u662f queue \u5bb9\u5668&#xff0c;\u4f46\u5176\u5b9e\u9645\u8bed\u4e49\u66f4\u63a5\u8fd1\u4e8e\u4e00\u4e2a\u5355\u8282\u70b9\u7684\u6eda\u52a8\u7f13\u51b2\u533a&#xff08;rolling buffer&#xff09;&#xff0c;\u800c\u4e0d\u662f\u591a\u4e2a\u5e76\u5217\u8282\u70b9\u540c\u65f6\u5b58\u5728\u7684\u666e\u901a\u961f\u5217\u7ed3\u6784\u3002<\/p>\n<p>\u5177\u4f53\u6765\u8bf4&#xff0c;in_buffer \u7684\u961f\u9996\u8282\u70b9\u59cb\u7ec8\u4ee3\u8868\u5f53\u524d\u6b63\u5728\u62fc\u63a5\u7684 HTTP \u8bf7\u6c42\u6570\u636e\u3002\u8bfb\u7ebf\u7a0b\u6bcf\u6b21\u4ece TCP \u63a5\u6536\u7f13\u51b2\u533a\u8bfb\u53d6\u5230\u65b0\u7684\u5b57\u8282\u6d41\u540e&#xff0c;\u90fd\u4f1a\u5c06\u8fd9\u4e9b\u6570\u636e\u8ffd\u52a0\u5230\u961f\u9996\u8282\u70b9\u7684\u672b\u5c3e&#xff0c;\u4ece\u800c\u9010\u6b65\u7d2f\u79ef\u5f62\u6210\u5b8c\u6574\u7684 HTTP \u8bf7\u6c42\u62a5\u6587\u3002<\/p>\n<p>\u53ea\u6709\u5f53\u4e00\u4e2a HTTP \u8bf7\u6c42\u88ab\u6210\u529f\u89e3\u6790\u5e76\u5904\u7406\u5b8c\u6210\u4e4b\u540e&#xff0c;\u624d\u4f1a\u5c06\u8be5\u8bf7\u6c42\u5bf9\u5e94\u7684\u8282\u70b9\u4ece\u961f\u5217\u4e2d pop \u6389&#xff0c;\u6b64\u65f6\u65b0\u7684\u961f\u9996\u8282\u70b9\u624d\u5f00\u59cb\u7528\u4e8e\u7d2f\u79ef\u4e0b\u4e00\u4e2a HTTP \u8bf7\u6c42\u7684\u6570\u636e\u3002<\/p>\n<p>\u56e0\u6b64&#xff0c;\u5728\u7edd\u5927\u591a\u6570\u65f6\u95f4\u91cc&#xff0c;in_buffer \u4e2d\u5b9e\u9645\u4e0a\u53ea\u4f1a\u5b58\u5728\u4e00\u4e2a\u6b63\u5728\u589e\u957f\u7684\u5b57\u7b26\u4e32\u8282\u70b9&#xff0c;\u7528\u4e8e\u6301\u7eed\u62fc\u63a5\u5f53\u524d\u8bf7\u6c42\u7684\u6570\u636e\u3002<\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">Connection<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n <span class=\"token keyword\">public<\/span><span class=\"token operator\">:<\/span><br \/>\n <span class=\"token comment\">\/\/&#8230;<\/span><br \/>\n std<span class=\"token double-colon punctuation\">::<\/span>queue<span class=\"token operator\">&lt;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&gt;<\/span>in_buffer<span class=\"token punctuation\">;<\/span><br \/>\n std<span class=\"token double-colon punctuation\">::<\/span>queue<span class=\"token operator\">&lt;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&gt;<\/span> out_buffer<span class=\"token punctuation\">;<\/span><br \/>\n std<span class=\"token double-colon punctuation\">::<\/span>mutex mtx<span class=\"token punctuation\">;<\/span><br \/>\n <span class=\"token comment\">\/\/&#8230;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>\u56e0\u6b64&#xff0c;\u5bf9\u4e8e\u8bfb\u7ebf\u7a0b\u6765\u8bf4&#xff0c;\u5176\u4f1a\u8c03\u7528 recv \u63a5\u53e3&#xff0c;\u4ece TCP \u63a5\u6536\u7f13\u51b2\u533a\u4e2d\u8bfb\u53d6\u6570\u636e&#xff0c;\u5e76\u5c06\u8bfb\u53d6\u5230\u7684\u5b57\u8282\u6d41\u8ffd\u52a0\u5230 in_buffer \u961f\u9996\u8282\u70b9\u7684\u672b\u5c3e\u3002<\/p>\n<p>\u8fd9\u91cc\u961f\u5217\u4e2d\u7684\u5143\u7d20\u7c7b\u578b\u4f7f\u7528 std::string&#xff0c;\u4e3b\u8981\u539f\u56e0\u5728\u4e8e HTTP \u534f\u8bae\u672c\u8eab\u662f\u4e00\u79cd\u6587\u672c\u534f\u8bae&#xff0c;\u56e0\u6b64\u4f7f\u7528\u5b57\u7b26\u4e32\u7ed3\u6784\u8fdb\u884c\u62fc\u63a5\u4e0e\u89e3\u6790\u4f1a\u66f4\u52a0\u65b9\u4fbf\u3002<\/p>\n<p>\u968f\u540e\u8bfb\u7ebf\u7a0b\u4f1a\u5bf9\u5f53\u524d\u961f\u9996\u7684\u5b57\u7b26\u4e32\u8fdb\u884c\u89e3\u6790\u3002\u7531\u4e8e HTTP \u8bf7\u6c42\u884c\u4ee5\u53ca\u8bf7\u6c42\u5934\u4e2d\u7684\u6bcf\u4e00\u9879\u90fd\u4ee5 CRLF&#xff08;\\\\r\\\\n&#xff09; \u4f5c\u4e3a\u7ed3\u675f\u7b26&#xff0c;\u5e76\u4e14\u8bf7\u6c42\u5934\u4e0e\u8bf7\u6c42\u4f53\u4e4b\u95f4\u5b58\u5728\u4e00\u4e2a\u7a7a\u884c&#xff08;\\\\r\\\\n\\\\r\\\\n&#xff09;&#xff0c;\u56e0\u6b64\u53ef\u4ee5\u901a\u8fc7\u8c03\u7528\u5b57\u7b26\u4e32\u7684 find \u51fd\u6570\u6765\u67e5\u627e\u5f53\u524d\u5b57\u7b26\u4e32\u4e2d\u662f\u5426\u5df2\u7ecf\u51fa\u73b0\u8be5\u7a7a\u884c\u5206\u9694\u7b26\u3002<\/p>\n<p>\u5982\u679c\u627e\u5230\u4e86\u8be5\u7a7a\u884c&#xff0c;\u5219\u8bf4\u660e\u5df2\u7ecf\u6210\u529f\u8bfb\u53d6\u5230\u4e86\u5b8c\u6574\u7684\u8bf7\u6c42\u5934\u3002<\/p>\n<p>\u5728 HTTP \u534f\u8bae\u4e2d&#xff0c;\u8bf7\u6c42\u5927\u81f4\u53ef\u4ee5\u5206\u4e3a\u4e24\u7c7b&#xff1a;<\/p>\n<ul>\n<li>GET \u8bf7\u6c42&#xff1a;\u901a\u5e38\u7528\u4e8e\u83b7\u53d6\u67d0\u79cd\u8d44\u6e90&#xff0c;\u8be5\u8d44\u6e90\u901a\u5e38\u5bf9\u5e94\u670d\u52a1\u5668\u6587\u4ef6\u7cfb\u7edf\u4e2d\u7684\u67d0\u4e2a\u6587\u4ef6\u8def\u5f84&#xff0c;\u5176\u8def\u5f84\u6765\u6e90\u4e8e\u8bf7\u6c42\u884c\u4e2d\u7684 URL\u3002<\/li>\n<li>POST \u8bf7\u6c42&#xff1a;\u901a\u5e38\u7528\u4e8e\u63d0\u4ea4\u6570\u636e\u6216\u8bbf\u95ee\u52a8\u6001\u8d44\u6e90&#xff0c;\u8bf7\u6c42\u4f53\u4e2d\u4f1a\u643a\u5e26\u53c2\u6570&#xff0c;\u800c\u8bf7\u6c42\u884c\u4e2d\u7684 URL \u901a\u5e38\u662f\u4e00\u4e2a\u903b\u8f91\u8def\u5f84&#xff0c;\u5728\u670d\u52a1\u5668\u7aef\u53ef\u80fd\u6620\u5c04\u4e3a\u67d0\u4e2a\u5904\u7406\u51fd\u6570\u6216\u53ef\u6267\u884c\u7a0b\u5e8f\u3002<\/li>\n<\/ul>\n<p>\u5982\u679c\u5f53\u524d\u5b57\u7b26\u4e32\u4e2d\u4ecd\u7136\u6ca1\u6709\u627e\u5230\u7a7a\u884c\u5206\u9694\u7b26&#xff0c;\u5219\u8bf4\u660e\u5f53\u524d\u8bfb\u7ebf\u7a0b\u8bfb\u53d6\u5230\u7684\u6570\u636e&#xff08;\u5305\u62ec\u4e4b\u524d\u8bfb\u7ebf\u7a0b\u8bfb\u53d6\u5230\u7684\u6570\u636e&#xff09;\u4ecd\u7136\u4e0d\u8db3\u4ee5\u6784\u6210\u5b8c\u6574\u7684\u8bf7\u6c42\u5934\u3002\u6b64\u65f6\u8bfb\u7ebf\u7a0b\u4e0d\u4f1a\u7ee7\u7eed\u963b\u585e\u7b49\u5f85&#xff0c;\u800c\u662f\u76f4\u63a5\u8fd4\u56de\u7ebf\u7a0b\u6c60\u3002\u5728\u8fd4\u56de\u4e4b\u524d&#xff0c;\u9700\u8981\u5c06\u8be5 fd \u91cd\u65b0\u52a0\u5165\u8bfb\u96c6\u5408&#xff0c;\u7b49\u5f85\u65b0\u7684\u6570\u636e\u5230\u8fbe\u540e\u7531\u5176\u4ed6\u8bfb\u7ebf\u7a0b\u7ee7\u7eed\u63a5\u529b\u5904\u7406\u3002<\/p>\n<hr \/>\n<p>\u4e3a\u4e86\u5b9e\u73b0\u8fd9\u79cd\u8bfb\u4e8b\u4ef6\u7684\u63a5\u529b\u5904\u7406\u673a\u5236&#xff0c;\u7cfb\u7edf\u5fc5\u987b\u7ef4\u62a4\u4e00\u79cd\u72b6\u6001\u5ef6\u7eed\u673a\u5236\u3002\u56e0\u4e3a\u5f53\u4e00\u4e2a\u8bfb\u7ebf\u7a0b\u5f00\u59cb\u5904\u7406\u67d0\u4e2a fd \u65f6&#xff0c;\u5728\u6b64\u4e4b\u524d\u53ef\u80fd\u5df2\u7ecf\u6709\u5176\u4ed6\u8bfb\u7ebf\u7a0b\u5bf9\u8be5\u8fde\u63a5\u6267\u884c\u8fc7\u90e8\u5206\u8bfb\u53d6\u548c\u89e3\u6790\u64cd\u4f5c\u3002<\/p>\n<p>\u4e5f\u5c31\u662f\u8bf4&#xff0c;\u867d\u7136\u4e0d\u540c\u8bfb\u7ebf\u7a0b\u662f\u72ec\u7acb\u6267\u884c\u7684&#xff0c;\u4f46\u5b83\u4eec\u5904\u7406\u7684\u662f\u540c\u4e00\u4e2a\u8fde\u63a5\u7684\u8fde\u7eed\u72b6\u6001\u3002<\/p>\n<p>\u4f8b\u5982&#xff0c;\u67d0\u4e2a\u8bfb\u7ebf\u7a0b\u5728\u62bd\u5e72 TCP \u63a5\u6536\u7f13\u51b2\u533a\u4e4b\u540e&#xff0c;\u53ef\u80fd\u5df2\u7ecf\u5728 in_buffer \u961f\u9996\u8282\u70b9\u4e2d\u62fc\u63a5\u51fa\u4e86\u5b8c\u6574\u7684\u8bf7\u6c42\u884c\u4e0e\u8bf7\u6c42\u5934\u3002\u6b64\u65f6\u8be5\u8bfb\u7ebf\u7a0b\u4f1a\u5c06\u8bf7\u6c42\u5934\u90e8\u5206\u4ece\u6570\u636e\u6d41\u4e2d\u5206\u79bb\u51fa\u6765&#xff0c;\u5e76\u89e3\u6790\u8bf7\u6c42\u5934\u4e2d\u7684 Content-Length \u5b57\u6bb5&#xff0c;\u4ee5\u786e\u5b9a\u8bf7\u6c42\u4f53\u7684\u957f\u5ea6\u3002<\/p>\n<p>\u968f\u540e\u8bfb\u7ebf\u7a0b\u9700\u8981\u5224\u65ad\u5f53\u524d in_buffer \u4e2d\u662f\u5426\u5df2\u7ecf\u5305\u542b\u4e86\u5b8c\u6574\u7684\u8bf7\u6c42\u4f53\u3002\u5982\u679c\u5f53\u524d\u53ea\u6709\u90e8\u5206\u8bf7\u6c42\u4f53\u6570\u636e&#xff0c;\u5219\u8be5\u8bfb\u7ebf\u7a0b\u540c\u6837\u4e0d\u4f1a\u963b\u585e\u7b49\u5f85&#xff0c;\u800c\u662f\u8fd4\u56de\u7ebf\u7a0b\u6c60&#xff0c;\u5e76\u7b49\u5f85\u4e0b\u4e00\u4e2a\u8bfb\u7ebf\u7a0b\u7ee7\u7eed\u63a5\u529b\u5904\u7406\u3002<\/p>\n<p>\u56e0\u6b64&#xff0c;\u540e\u7eed\u63a5\u529b\u7684\u8bfb\u7ebf\u7a0b\u5fc5\u987b\u80fd\u591f\u611f\u77e5\u5f53\u524d\u89e3\u6790\u72b6\u6001\u3002\u4f8b\u5982&#xff1a;<\/p>\n<ul>\n<li>\u662f\u5426\u5df2\u7ecf\u89e3\u6790\u51fa\u5b8c\u6574\u7684\u8bf7\u6c42\u5934<\/li>\n<li>\u662f\u5426\u5df2\u7ecf\u8fdb\u5165\u8bf7\u6c42\u4f53\u8bfb\u53d6\u9636\u6bb5<\/li>\n<\/ul>\n<p>\u5982\u679c\u8bf7\u6c42\u5934\u5df2\u7ecf\u89e3\u6790\u5b8c\u6210&#xff0c;\u90a3\u4e48\u65b0\u7684\u8bfb\u7ebf\u7a0b\u5c31\u4e0d\u9700\u8981\u91cd\u65b0\u89e3\u6790\u8bf7\u6c42\u5934&#xff0c;\u800c\u662f\u53ef\u4ee5\u76f4\u63a5\u5c1d\u8bd5\u8bfb\u53d6\u5269\u4f59\u7684\u8bf7\u6c42\u4f53\u6570\u636e\u3002<\/p>\n<p>\u4e3a\u4e86\u5b9e\u73b0\u8fd9\u79cd\u72b6\u6001\u5ef6\u7eed\u673a\u5236&#xff0c;\u8fd9\u91cc\u5728 Connection \u5bf9\u8c61\u4e2d\u5f15\u5165\u4e86\u4e00\u4e2a\u89e3\u6790\u72b6\u6001\u5b57\u6bb5&#xff0c;\u7528\u4e8e\u8bb0\u5f55\u5f53\u524d HTTP \u8bf7\u6c42\u89e3\u6790\u7684\u9636\u6bb5\u3002<\/p>\n<p>\u5f53\u524d\u8bbe\u8ba1\u4e2d\u89e3\u6790\u72b6\u6001\u53ef\u4ee5\u5206\u4e3a\u4e24\u4e2a\u9636\u6bb5&#xff1a;<\/p>\n<ul>\n<li>\u89e3\u6790\u8bf7\u6c42\u5934\u9636\u6bb5&#xff08;PARSE_HEADER&#xff09;<\/li>\n<li>\u89e3\u6790\u8bf7\u6c42\u4f53\u9636\u6bb5&#xff08;PARSE_BODY&#xff09;<\/li>\n<\/ul>\n<p>\u6b64\u5916&#xff0c;Connection \u5bf9\u8c61\u8fd8\u4f1a\u7ef4\u62a4\u4ee5\u4e0b\u5b57\u6bb5&#xff1a;<\/p>\n<ul>\n<li>header&#xff1a;\u4fdd\u5b58\u5df2\u7ecf\u89e3\u6790\u51fa\u7684\u5b8c\u6574\u8bf7\u6c42\u5934<\/li>\n<li>header_length&#xff1a;\u8868\u793a\u8bf7\u6c42\u884c\u4e0e\u8bf7\u6c42\u5934\u7684\u603b\u957f\u5ea6<\/li>\n<li>body_length&#xff1a;\u8868\u793a\u8bf7\u6c42\u4f53\u957f\u5ea6<\/li>\n<\/ul>\n<p>\u793a\u4f8b\u7ed3\u6784\u5982\u4e0b&#xff1a;<\/p>\n<p><span class=\"token keyword\">enum<\/span> <span class=\"token class-name\">ParseState<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    PARSE_HEDER<span class=\"token punctuation\">,<\/span><br \/>\n    PARSE_BODY<br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">Connection<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n   <span class=\"token keyword\">public<\/span><span class=\"token operator\">:<\/span><br \/>\n<span class=\"token function\">Connection<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token operator\">:<\/span><span class=\"token function\">parse_state<\/span><span class=\"token punctuation\">(<\/span>PARSE_HEDER<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">,<\/span><span class=\"token function\">header_length<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">,<\/span><span class=\"token function\">body_length<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">,<\/span><span class=\"token function\">header<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n <span class=\"token comment\">\/\/&#8230;.   <\/span><br \/>\n<span class=\"token punctuation\">{<\/span><\/p>\n<p><span class=\"token punctuation\">}<\/span><br \/>\n   std<span class=\"token double-colon punctuation\">::<\/span>queue<span class=\"token operator\">&lt;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&gt;<\/span> in_buffer<span class=\"token punctuation\">;<\/span><br \/>\n   std<span class=\"token double-colon punctuation\">::<\/span>queue<span class=\"token operator\">&lt;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&gt;<\/span> out_buffer<span class=\"token punctuation\">;<\/span><br \/>\n   std<span class=\"token double-colon punctuation\">::<\/span>mutex mtx<span class=\"token punctuation\">;<\/span><br \/>\n   <span class=\"token comment\">\/\/&#8230;<\/span><br \/>\n   ParseState parse_state<span class=\"token punctuation\">;<\/span><br \/>\n   size_t header_length<span class=\"token punctuation\">;<\/span><br \/>\n   size_t body_length<span class=\"token punctuation\">;<\/span><br \/>\n   std<span class=\"token double-colon punctuation\">::<\/span>string header<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>\u901a\u8fc7\u8fd9\u79cd\u8bbe\u8ba1&#xff0c;\u4e0d\u540c\u8bfb\u7ebf\u7a0b\u5728\u5904\u7406\u540c\u4e00\u4e2a\u8fde\u63a5\u65f6&#xff0c;\u5c31\u80fd\u591f\u57fa\u4e8e Connection \u4e2d\u8bb0\u5f55\u7684\u72b6\u6001\u4fe1\u606f\u7ee7\u7eed\u6267\u884c\u89e3\u6790\u6d41\u7a0b&#xff0c;\u4ece\u800c\u5b9e\u73b0\u4e00\u79cd\u8de8\u7ebf\u7a0b\u7684\u8bf7\u6c42\u89e3\u6790\u63a5\u529b\u673a\u5236\u3002<\/p>\n<hr \/>\n<h3>\u5199\u7ebf\u7a0b<\/h3>\n<p>\u90a3\u4e48\u5728\u8bb2\u89e3\u8bfb\u7ebf\u7a0b\u5b9e\u73b0\u7684\u5177\u4f53\u7ec6\u8282\u4e4b\u524d&#xff0c;\u6211\u4eec\u5148\u5c06\u89c6\u89d2\u5207\u6362\u5230\u5199\u7ebf\u7a0b\u3002\u56e0\u4e3a\u8bfb\u7ebf\u7a0b\u7684\u67d0\u4e9b\u5b9e\u73b0\u7ec6\u8282&#xff0c;\u9700\u8981\u7ed3\u5408\u5199\u7ebf\u7a0b\u7684\u8bbe\u8ba1\u4ee5\u53ca\u6574\u4f53\u67b6\u6784\u624d\u80fd\u7406\u89e3\u6e05\u695a\u3002<\/p>\n<p>\u6839\u636e\u4e0a\u6587\u7684\u5206\u6790&#xff0c;\u6211\u4eec\u5df2\u7ecf\u4e86\u89e3\u4e86\u8bfb\u7ebf\u7a0b\u7684\u6574\u4f53\u8bbe\u8ba1\u6846\u67b6&#xff0c;\u63a5\u4e0b\u6765\u5c06\u91cd\u70b9\u5206\u6790\u5199\u7ebf\u7a0b\u7684\u6574\u4f53\u6846\u67b6\u3002<\/p>\n<p>\u5bf9\u4e8e\u5199\u7ebf\u7a0b\u800c\u8a00&#xff0c;\u5176\u6838\u5fc3\u804c\u8d23\u662f\u8d1f\u8d23\u5c06\u5df2\u7ecf\u6784\u5efa\u597d\u7684 HTTP \u54cd\u5e94\u62a5\u6587\u53d1\u9001\u7ed9\u5ba2\u6237\u7aef\u3002\u6839\u636e\u4e4b\u524d\u7684\u8bbe\u8ba1&#xff0c;\u5199\u7ebf\u7a0b\u4f1a\u8c03\u7528 poll \u63a5\u53e3\u68c0\u6d4b\u5199\u4e8b\u4ef6\u96c6\u5408\u4e2d\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u662f\u5426\u5c31\u7eea\u3002\u4e00\u65e6\u67d0\u4e2a fd \u7684\u5199\u4e8b\u4ef6\u5c31\u7eea&#xff0c;\u5219\u8bf4\u660e\u8be5 TCP \u5957\u63a5\u5b57\u7684\u53d1\u9001\u7f13\u51b2\u533a\u5f53\u524d\u672a\u6ee1&#xff0c;\u6b64\u65f6\u5199\u7ebf\u7a0b\u5c31\u53ef\u4ee5\u5c1d\u8bd5\u53d1\u9001\u6570\u636e\u3002<\/p>\n<p>\u56e0\u6b64\u5199\u7ebf\u7a0b\u7684\u5927\u81f4\u6d41\u7a0b\u4e3a&#xff1a;<\/p>\n<li>\u8c03\u7528 poll \u68c0\u6d4b\u5199\u96c6\u5408\u4e2d\u7684 fd<\/li>\n<li>\u627e\u5230\u5199\u4e8b\u4ef6\u5c31\u7eea\u7684 fd<\/li>\n<li>\u6839\u636e fd \u5b9a\u4f4d\u5bf9\u5e94\u7684 Connection \u5bf9\u8c61<\/li>\n<li>\u8bbf\u95ee Connection \u4e2d\u7684\u53d1\u9001\u961f\u5217<\/li>\n<li>\u5f39\u51fa\u961f\u9996\u54cd\u5e94\u62a5\u6587<\/li>\n<li>\u8c03\u7528 send \u53d1\u9001\u6570\u636e<\/li>\n<p>\u4ee5\u4e0a\u4fbf\u662f\u5199\u7ebf\u7a0b\u7684\u6574\u4f53\u6846\u67b6\u3002\u63a5\u4e0b\u6765\u6211\u4eec\u8fdb\u4e00\u6b65\u6df1\u5165\u5199\u7ebf\u7a0b\u7684\u5177\u4f53\u5b9e\u73b0\u7ec6\u8282\u3002<\/p>\n<hr \/>\n<p>\u5199\u7ebf\u7a0b\u7684\u6838\u5fc3\u903b\u8f91\u88ab\u5c01\u88c5\u5728\u4e00\u4e2a while \u6b7b\u5faa\u73af\u4e2d\u3002\u5728\u7ebf\u7a0b\u5faa\u73af\u5f00\u59cb\u65f6&#xff0c;\u9996\u5148\u9700\u8981\u8c03\u7528 poll \u6765\u68c0\u6d4b\u5199\u96c6\u5408\u4e2d\u7684 fd \u662f\u5426\u5c31\u7eea\u3002<\/p>\n<p>\u7136\u800c\u9700\u8981\u6ce8\u610f\u7684\u662f&#xff0c;\u5199\u96c6\u5408\u4f1a\u88ab\u8bfb\u7ebf\u7a0b\u548c\u5199\u7ebf\u7a0b\u5e76\u53d1\u8bbf\u95ee\u3002\u5982\u679c\u5199\u7ebf\u7a0b\u5728\u8c03\u7528 poll \u65f6\u76f4\u63a5\u6301\u6709\u5199\u96c6\u5408\u7684\u9501&#xff0c;\u90a3\u4e48\u4e00\u65e6 poll \u963b\u585e\u7b49\u5f85\u4e8b\u4ef6&#xff0c;\u5c31\u4f1a\u5bfc\u81f4\u8be5\u9501\u88ab\u957f\u65f6\u95f4\u6301\u6709&#xff0c;\u4ece\u800c\u963b\u585e\u8bfb\u7ebf\u7a0b\u5bf9\u5199\u96c6\u5408\u7684\u4fee\u6539\u64cd\u4f5c\u3002\u8fd9\u4f1a\u5bfc\u81f4\u7ebf\u7a0b\u7ade\u4e89\u52a0\u5267&#xff0c;\u751a\u81f3\u53ef\u80fd\u51fa\u73b0\u7ebf\u7a0b\u9965\u997f&#xff0c;\u4ece\u800c\u964d\u4f4e\u6574\u4f53\u7cfb\u7edf\u541e\u5410\u91cf\u3002<\/p>\n<p>\u56e0\u6b64&#xff0c;\u8fd9\u91cc\u91c7\u7528\u4e00\u79cd\u5e38\u89c1\u7684\u5e76\u53d1\u8bbe\u8ba1\u7b56\u7565&#xff1a;\u5feb\u7167&#xff08;snapshot&#xff09;\u673a\u5236\u3002<\/p>\n<p>\u5177\u4f53\u505a\u6cd5\u662f&#xff1a;<\/p>\n<p>\u5199\u7ebf\u7a0b\u9996\u5148\u5728\u77ed\u6682\u52a0\u9501\u7684\u60c5\u51b5\u4e0b&#xff0c;\u83b7\u53d6\u5f53\u524d\u5199\u96c6\u5408 vector&lt;pollfd&gt; \u7684\u526f\u672c&#xff0c;\u968f\u540e\u7acb\u5373\u91ca\u653e\u9501\u3002\u4e4b\u540e\u5199\u7ebf\u7a0b\u5c06\u8fd9\u4e2a\u526f\u672c\u4f5c\u4e3a\u53c2\u6570\u4f20\u9012\u7ed9 poll \u63a5\u53e3\u8fdb\u884c\u4e8b\u4ef6\u68c0\u6d4b\u3002<\/p>\n<p>\u8fd9\u6837\u4e00\u6765&#xff0c;\u5199\u7ebf\u7a0b\u5728 poll \u963b\u585e\u671f\u95f4\u4e0d\u4f1a\u6301\u6709\u9501&#xff0c;\u4ece\u800c\u907f\u514d\u5f71\u54cd\u8bfb\u7ebf\u7a0b\u5bf9\u5199\u96c6\u5408\u7684\u66f4\u65b0\u3002<\/p>\n<p>\u9700\u8981\u989d\u5916\u6ce8\u610f\u7684\u662f&#xff0c;\u5728\u670d\u52a1\u5668\u521a\u542f\u52a8\u65f6&#xff0c;\u4e3b\u7ebf\u7a0b\u901a\u5e38\u4f1a\u5148\u521b\u5efa\u5199\u7ebf\u7a0b&#xff0c;\u7136\u540e\u624d\u5f00\u59cb\u5904\u7406\u65b0\u7684\u8fde\u63a5\u5e76\u68c0\u6d4b\u8bfb\u4e8b\u4ef6\u3002\u56e0\u6b64\u5728\u521d\u59cb\u9636\u6bb5&#xff0c;\u5f88\u53ef\u80fd\u8fd8\u6ca1\u6709\u4efb\u4f55\u8fde\u63a5\u88ab\u52a0\u5165\u5199\u96c6\u5408&#xff0c;\u6b64\u65f6\u5199\u96c6\u5408\u662f\u7a7a\u7684\u3002<\/p>\n<p>\u800c poll \u4e0d\u80fd\u63a5\u6536\u7a7a\u6570\u7ec4&#xff0c;\u5426\u5219\u53ef\u80fd\u5bfc\u81f4\u672a\u5b9a\u4e49\u884c\u4e3a\u3002\u56e0\u6b64\u5728\u8c03\u7528 poll \u4e4b\u524d&#xff0c;\u9700\u8981\u5148\u5224\u65ad\u5f53\u524d vector \u662f\u5426\u4e3a\u7a7a\u3002<\/p>\n<p>\u5982\u679c\u5199\u96c6\u5408\u4e3a\u7a7a&#xff0c;\u5219\u8bf4\u660e\u670d\u52a1\u5668\u521a\u542f\u52a8&#xff0c;\u8fd8\u6ca1\u6709\u9700\u8981\u53d1\u9001\u6570\u636e\u7684\u8fde\u63a5\u3002\u6b64\u65f6\u5199\u7ebf\u7a0b\u65e0\u9700\u5fd9\u7b49&#xff0c;\u53ef\u4ee5\u4e3b\u52a8\u8ba9\u51fa CPU&#xff0c;\u4f8b\u5982\u901a\u8fc7 usleep \u8fdb\u884c\u77ed\u6682\u4f11\u7720&#xff0c;\u4ee5\u907f\u514d\u7ebf\u7a0b\u7a7a\u8f6c\u3002<\/p>\n<p>\u5982\u679c\u5199\u96c6\u5408\u4e0d\u4e3a\u7a7a&#xff0c;\u5219\u53ef\u4ee5\u5c06\u5feb\u7167\u4f20\u9012\u7ed9 poll\u3002<\/p>\n<p>\u53e6\u5916\u8fd8\u9700\u8981\u6ce8\u610f poll \u7684\u8d85\u65f6\u65f6\u95f4\u8bbe\u7f6e\u3002\u7531\u4e8e\u8fd9\u91cc\u4f20\u9012\u7ed9 poll \u7684\u662f\u67d0\u4e00\u65f6\u523b\u7684\u5feb\u7167&#xff0c;\u800c\u4e0d\u662f\u5b9e\u65f6\u7684\u5199\u96c6\u5408\u72b6\u6001&#xff0c;\u56e0\u6b64\u5f53\u524d\u65f6\u523b\u53ef\u80fd\u5df2\u7ecf\u6709\u65b0\u7684\u8fde\u63a5\u52a0\u5165\u5199\u96c6\u5408\u3002\u5982\u679c poll \u7684\u8d85\u65f6\u65f6\u95f4\u8bbe\u7f6e\u8fc7\u957f&#xff0c;\u90a3\u4e48\u5199\u7ebf\u7a0b\u5c06\u65e0\u6cd5\u53ca\u65f6\u68c0\u6d4b\u5230\u65b0\u52a0\u5165\u7684 fd&#xff0c;\u4ece\u800c\u5f71\u54cd\u541e\u5410\u91cf\u3002<\/p>\n<p>\u56e0\u6b64\u901a\u5e38\u5efa\u8bae\u5c06\u8d85\u65f6\u65f6\u95f4\u8bbe\u7f6e\u5f97\u8f83\u77ed&#xff0c;\u4f8b\u5982 10ms&#xff0c;\u8fd9\u6837\u53ef\u4ee5\u5728\u8f83\u77ed\u65f6\u95f4\u5185\u91cd\u65b0\u83b7\u53d6\u65b0\u7684\u5feb\u7167\u5e76\u6269\u5927\u68c0\u6d4b\u8303\u56f4\u3002<\/p>\n<p>\u793a\u4f8b\u4ee3\u7801\u5982\u4e0b&#xff1a;<\/p>\n<p><span class=\"token keyword\">static<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token function\">write_thread_func<\/span><span class=\"token punctuation\">(<\/span>Pollmanager<span class=\"token operator\">*<\/span> write_arg<span class=\"token punctuation\">,<\/span> Pollmanager<span class=\"token operator\">*<\/span> read_arg<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>vector<span class=\"token operator\">&lt;<\/span>pollfd<span class=\"token operator\">&gt;<\/span> poll_fds <span class=\"token operator\">&#061;<\/span> write_arg<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">get_snapshot<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>poll_fds<span class=\"token punctuation\">.<\/span><span class=\"token function\">empty<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token function\">usleep<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">10000<\/span><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 keyword\">int<\/span> n <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">poll<\/span><span class=\"token punctuation\">(<\/span>poll_fds<span class=\"token punctuation\">.<\/span><span class=\"token function\">data<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> poll_fds<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">10<\/span><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><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>Fatal<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;Poll error&#034;<\/span><span class=\"token punctuation\">)<\/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 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><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>info<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;write_thread poll timeout&#034;<\/span><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\">\/\/ &#8230;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<hr \/>\n<p>\u5f53 poll \u8fd4\u56de\u503c\u5927\u4e8e 0 \u65f6&#xff0c;\u8bf4\u660e\u81f3\u5c11\u6709\u4e00\u4e2a fd \u7684\u5199\u4e8b\u4ef6\u5df2\u7ecf\u5c31\u7eea\u3002\u6b64\u65f6\u5199\u7ebf\u7a0b\u9700\u8981\u904d\u5386 poll \u8fd4\u56de\u7684\u6570\u7ec4&#xff0c;\u68c0\u67e5\u54ea\u4e9b fd \u7684\u5199\u4e8b\u4ef6\u89e6\u53d1\u3002<\/p>\n<p>\u9700\u8981\u6ce8\u610f\u7684\u662f&#xff0c;\u5199\u4e8b\u4ef6\u5c31\u7eea\u4ec5\u8868\u793a TCP \u53d1\u9001\u7f13\u51b2\u533a\u5f53\u524d\u672a\u6ee1&#xff0c;\u5e76\u4e0d\u4ee3\u8868\u6b64\u65f6\u4e00\u5b9a\u6709\u6570\u636e\u53ef\u4ee5\u53d1\u9001\u3002\u4f8b\u5982\u8bfb\u7ebf\u7a0b\u4ecd\u5728\u5904\u7406 HTTP \u8bf7\u6c42\u6216\u8005\u5bf9\u65b9\u5c1a\u672a\u53d1\u9001\u65b0\u7684 HTTP \u8bf7\u6c42\u5bfc\u81f4\u53d1\u9001\u961f\u5217\u5f53\u524d\u4e3a\u7a7a<\/p>\n<p>\u56e0\u6b64&#xff0c;\u5373\u4f7f\u67d0\u4e2a fd \u5199\u4e8b\u4ef6\u5c31\u7eea&#xff0c;\u4e5f\u5fc5\u987b\u8fdb\u4e00\u6b65\u68c0\u67e5\u8be5 Connection \u5bf9\u8c61\u4e2d\u7684\u53d1\u9001\u961f\u5217\u662f\u5426\u4e3a\u7a7a\u3002<\/p>\n<p>\u800c\u53d1\u9001\u961f\u5217\u4f1a\u88ab\u8bfb\u7ebf\u7a0b\u548c\u5199\u7ebf\u7a0b\u5e76\u53d1\u8bbf\u95ee&#xff0c;\u56e0\u6b64\u5728\u8bbf\u95ee\u53d1\u9001\u961f\u5217\u4e4b\u524d\u5fc5\u987b\u8fdb\u884c\u52a0\u9501&#xff0c;\u4ee5\u4fdd\u8bc1\u961f\u5217\u7ed3\u6784\u7684\u4e00\u81f4\u6027\u3002<\/p>\n<p>\u5199\u7ebf\u7a0b\u52a0\u9501\u4e4b\u540e&#xff1a;<\/p>\n<ul>\n<li>\u5982\u679c\u53d1\u9001\u961f\u5217\u4e3a\u7a7a&#xff0c;\u5219\u76f4\u63a5\u89e3\u9501\u5e76\u8df3\u8fc7\u8be5 fd<\/li>\n<li>\u5982\u679c\u53d1\u9001\u961f\u5217\u4e0d\u4e3a\u7a7a&#xff0c;\u5219\u7ee7\u7eed\u5904\u7406\u53d1\u9001\u903b\u8f91<\/li>\n<\/ul>\n<hr \/>\n<p>\u63a5\u4e0b\u6765\u5199\u7ebf\u7a0b\u4f1a\u5c1d\u8bd5\u6e05\u7a7a\u53d1\u9001\u961f\u5217\u3002\u961f\u9996\u8282\u70b9\u901a\u5e38\u5bf9\u5e94\u4e00\u4e2a\u5b8c\u6574\u7684 HTTP \u54cd\u5e94\u62a5\u6587\u3002<\/p>\n<p>\u6211\u4e4b\u6240\u4ee5\u8bf4\u201c\u5c1d\u8bd5\u201d&#xff0c;\u662f\u56e0\u4e3a\u5bf9\u4e8e\u5199\u7ebf\u7a0b\u6765\u8bf4&#xff0c;\u5176\u5e76\u4e0d\u4e00\u5b9a\u80fd\u591f\u5c06\u53d1\u9001\u961f\u5217\u4e2d\u7684\u6240\u6709\u6570\u636e\u4e00\u6b21\u6027\u5168\u90e8 send \u51fa\u53bb\u3002\u867d\u7136\u6b64\u65f6\u8be5 fd \u7684\u5199\u4e8b\u4ef6\u5df2\u7ecf\u5c31\u7eea&#xff0c;\u8fd9\u610f\u5473\u7740\u5f53\u524d TCP \u53d1\u9001\u7f13\u51b2\u533a\u5c1a\u672a\u5199\u6ee1&#xff0c;\u4f46\u8fd9\u5e76\u4e0d\u4ee3\u8868\u5199\u7ebf\u7a0b\u80fd\u591f\u7acb\u5373\u6e05\u7a7a\u6574\u4e2a\u53d1\u9001\u961f\u5217\u3002<\/p>\n<p>\u5f53\u5199\u7ebf\u7a0b\u68c0\u6d4b\u5230\u53d1\u9001\u961f\u5217\u4e0d\u4e3a\u7a7a\u65f6&#xff0c;\u5176\u76ee\u6807\u662f\u5c3d\u53ef\u80fd\u6e05\u7a7a\u53d1\u9001\u961f\u5217&#xff0c;\u5373\u4f9d\u6b21\u5c06\u53d1\u9001\u961f\u5217\u4e2d\u7684\u6240\u6709\u8282\u70b9\u53d1\u9001\u7ed9\u5ba2\u6237\u7aef\u3002<\/p>\n<p>\u5bf9\u4e8e\u7b2c\u4e00\u6b21 send \u8c03\u7528&#xff0c;\u4e00\u822c\u90fd\u4f1a\u6210\u529f\u8fd4\u56de\u3002\u8fd9\u91cc\u6240\u8c13\u7684\u201c\u6210\u529f\u201d&#xff0c;\u6307\u7684\u662f send \u8c03\u7528\u80fd\u591f\u7acb\u5373\u8fd4\u56de&#xff0c;\u5e76\u6210\u529f\u5199\u5165\u4e00\u5b9a\u6570\u91cf\u7684\u5b57\u8282\u5230 TCP \u53d1\u9001\u7f13\u51b2\u533a\u3002\u4f46\u9700\u8981\u6ce8\u610f\u7684\u662f&#xff0c;send \u8fd4\u56de\u6210\u529f\u5e76\u4e0d\u610f\u5473\u7740\u8fd9\u4e9b\u6570\u636e\u5df2\u7ecf\u771f\u6b63\u901a\u8fc7\u7f51\u7edc\u53d1\u9001\u5230\u5bf9\u7aef\u4e3b\u673a\u3002<\/p>\n<p>\u8fd9\u662f\u56e0\u4e3a send \u7684\u8bed\u4e49\u4ec5\u4ec5\u662f\u5c06\u7528\u6237\u6001\u7f13\u51b2\u533a\u7684\u6570\u636e\u62f7\u8d1d\u5230\u5185\u6838\u4e2d\u7684 TCP \u53d1\u9001\u7f13\u51b2\u533a\u3002\u81f3\u4e8e\u8fd9\u4e9b\u6570\u636e\u4f55\u65f6\u771f\u6b63\u53d1\u9001\u5230\u7f51\u7edc\u4e2d&#xff0c;\u5219\u7531 TCP \u534f\u8bae\u6808\u7684\u53d1\u9001\u7b56\u7565\u51b3\u5b9a&#xff0c;\u4f8b\u5982&#xff1a;<\/p>\n<ul>\n<li>\u6ed1\u52a8\u7a97\u53e3&#xff08;Sliding Window&#xff09;<\/li>\n<li>Nagle \u7b97\u6cd5<\/li>\n<li>\u62e5\u585e\u63a7\u5236\u7b49\u673a\u5236<\/li>\n<\/ul>\n<p>\u56e0\u6b64&#xff0c;\u901a\u8fc7 send \u5199\u5165\u7684\u6570\u636e\u901a\u5e38\u4f1a\u6682\u5b58\u5728 TCP \u7684\u53d1\u9001\u7f13\u51b2\u533a\u4e2d\u7b49\u5f85\u540e\u7eed\u53d1\u9001\u3002\u5f53\u5199\u7ebf\u7a0b\u7ee7\u7eed\u8c03\u7528 send \u53d1\u9001\u66f4\u591a\u6570\u636e\u65f6&#xff0c;\u65b0\u5199\u5165\u7684\u6570\u636e\u4f1a\u7ee7\u7eed\u5360\u7528 TCP \u53d1\u9001\u7f13\u51b2\u533a\u7684\u7a7a\u95f4\u3002<\/p>\n<p>\u4e00\u65e6 TCP \u53d1\u9001\u7f13\u51b2\u533a\u88ab\u586b\u6ee1&#xff0c;\u90a3\u4e48\u540e\u7eed\u7684 send \u8c03\u7528\u5728\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u5c31\u4f1a\u8fdb\u5165\u963b\u585e\u7b49\u5f85\u72b6\u6001&#xff0c;\u5373\u7b49\u5f85\u5185\u6838\u817e\u51fa\u65b0\u7684\u7f13\u51b2\u533a\u7a7a\u95f4\u4e4b\u540e\u518d\u7ee7\u7eed\u5199\u5165\u6570\u636e\u3002<\/p>\n<p>\u5982\u679c\u5199\u7ebf\u7a0b\u5728\u6b64\u5904\u53d1\u751f\u963b\u585e&#xff0c;\u90a3\u4e48\u8be5\u5199\u7ebf\u7a0b\u5c31\u4f1a\u88ab\u52a8\u6302\u8d77\u5e76\u8fdb\u5165 IO \u7b49\u5f85\u9636\u6bb5\u3002\u800c\u6839\u636e\u4e0a\u6587\u7684\u8bbe\u8ba1\u76ee\u6807&#xff0c;\u6211\u4eec\u5e0c\u671b\u5c3d\u53ef\u80fd\u51cf\u5c11\u7ebf\u7a0b\u5728 IO \u4e0a\u7684\u7b49\u5f85\u65f6\u95f4&#xff0c;\u4ee5\u63d0\u9ad8\u670d\u52a1\u5668\u6574\u4f53\u7684\u5e76\u53d1\u5904\u7406\u80fd\u529b\u548c\u541e\u5410\u91cf\u3002<\/p>\n<p>\u56e0\u6b64&#xff0c;\u8fd9\u91cc\u9700\u8981\u5c06 send \u8bbe\u7f6e\u4e3a\u975e\u963b\u585e\u8c03\u7528&#xff0c;\u800c\u4e0d\u662f\u4f7f\u7528\u9ed8\u8ba4\u7684\u963b\u585e\u884c\u4e3a\u3002\u4e00\u79cd\u5e38\u89c1\u7684\u505a\u6cd5\u662f\u5728\u8c03\u7528 send \u65f6\u6dfb\u52a0 MSG_DONTWAIT \u6807\u5fd7\u4f4d&#xff0c;\u4f7f send \u5728\u6761\u4ef6\u4e0d\u6ee1\u8db3\u65f6\u4e0d\u4f1a\u963b\u585e\u7ebf\u7a0b\u3002<\/p>\n<p>\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b&#xff0c;\u5f53 TCP \u53d1\u9001\u7f13\u51b2\u533a\u5df2\u6ee1\u65f6&#xff0c;send \u4f1a\u7acb\u5373\u8fd4\u56de -1&#xff0c;\u5e76\u5c06 errno \u8bbe\u7f6e\u4e3a EAGAIN \u6216 EWOULDBLOCK\u3002\u6b64\u65f6\u5199\u7ebf\u7a0b\u4fbf\u53ef\u4ee5\u505c\u6b62\u5f53\u524d\u8fde\u63a5\u7684\u53d1\u9001\u64cd\u4f5c&#xff0c;\u8f6c\u800c\u53bb\u5904\u7406\u5176\u4ed6\u5df2\u7ecf\u5199\u4e8b\u4ef6\u5c31\u7eea\u7684 fd&#xff0c;\u4ece\u800c\u907f\u514d\u5199\u7ebf\u7a0b\u56e0\u5355\u4e2a\u8fde\u63a5\u800c\u957f\u65f6\u95f4\u963b\u585e\u3002<\/p>\n<p>\u56e0\u6b64\u5199\u7ebf\u7a0b\u901a\u5e38\u91c7\u7528 \u201cwrite until EAGAIN\u201d \u7684\u7b56\u7565&#xff1a;\u53ea\u8981 send \u8fd8\u80fd\u7ee7\u7eed\u5199\u5165\u6570\u636e&#xff0c;\u5c31\u6301\u7eed\u53d1\u9001&#xff1b;\u4e00\u65e6 send \u8fd4\u56de EAGAIN&#xff0c;\u5219\u7acb\u5373\u505c\u6b62\u5f53\u524d\u8fde\u63a5\u7684\u53d1\u9001&#xff0c;\u5e76\u7b49\u5f85\u4e0b\u4e00\u6b21\u5199\u4e8b\u4ef6\u518d\u6b21\u89e6\u53d1\u3002<\/p>\n<hr \/>\n<p>\u8fd9\u91cc\u8fd8\u9700\u8981\u6ce8\u610f\u4e00\u4e2a\u91cd\u8981\u95ee\u9898\u3002TCP \u662f\u4e00\u79cd**\u9762\u5411\u5b57\u8282\u6d41&#xff08;Byte Stream&#xff09;**\u7684\u4f20\u8f93\u534f\u8bae&#xff0c;\u8fd9\u610f\u5473\u7740\u6bcf\u4e00\u6b21\u8c03\u7528 send \u63a5\u53e3\u65f6&#xff0c;\u5e76\u4e0d\u4e00\u5b9a\u80fd\u591f\u53d1\u9001\u5b8c\u6574\u7684 HTTP \u54cd\u5e94\u62a5\u6587\u3002<\/p>\n<p>\u6839\u636e\u4e0a\u6587\u7684\u8bbe\u8ba1&#xff0c;\u8fd9\u91cc\u7684 send \u662f\u975e\u963b\u585e\u8c03\u7528\u3002\u4e00\u65e6 TCP \u53d1\u9001\u7f13\u51b2\u533a\u88ab\u5199\u6ee1&#xff0c;send \u5c31\u4f1a\u7acb\u5373\u8fd4\u56de EAGAIN&#xff0c;\u6b64\u65f6\u5199\u7ebf\u7a0b\u4e0d\u4f1a\u7ee7\u7eed\u5904\u7406\u5f53\u524d fd&#xff0c;\u800c\u662f\u7b49\u5f85\u4e0b\u4e00\u8f6e\u5199\u4e8b\u4ef6\u518d\u6b21\u89e6\u53d1\u540e\u518d\u7ee7\u7eed\u53d1\u9001\u3002<\/p>\n<p>\u8fd9\u5c31\u610f\u5473\u7740\u5728\u5f53\u524d\u8fd9\u4e00\u8f6e\u53d1\u9001\u8fc7\u7a0b\u4e2d&#xff0c;\u53d1\u9001\u961f\u5217\u5f88\u53ef\u80fd\u6ca1\u6709\u88ab\u5b8c\u5168\u6e05\u7a7a\u3002\u6362\u53e5\u8bdd\u8bf4&#xff0c;\u4e00\u4e2a HTTP \u54cd\u5e94\u62a5\u6587\u53ef\u80fd\u53ea\u53d1\u9001\u4e86\u4e00\u90e8\u5206\u6570\u636e&#xff0c;\u5269\u4f59\u7684\u6570\u636e\u4ecd\u7136\u4fdd\u7559\u5728\u53d1\u9001\u961f\u5217\u7684\u961f\u9996\u8282\u70b9\u4e2d\u3002<\/p>\n<p>\u56e0\u6b64&#xff0c;\u8fd9\u91cc\u5c31\u9700\u8981\u4e00\u79cd\u53d1\u9001\u72b6\u6001\u5ef6\u7eed\u673a\u5236\u3002\u4e5f\u5c31\u662f\u8bf4&#xff0c;\u5f53\u4e0b\u4e00\u6b21\u5199\u7ebf\u7a0b\u518d\u6b21\u5904\u7406\u540c\u4e00\u4e2a fd \u7684\u5199\u4e8b\u4ef6\u65f6&#xff0c;\u5fc5\u987b\u80fd\u591f\u77e5\u9053\u4e0a\u4e00\u6b21\u5df2\u7ecf\u53d1\u9001\u5230\u4e86\u54cd\u5e94\u62a5\u6587\u7684\u54ea\u4e2a\u4f4d\u7f6e&#xff0c;\u4ece\u800c\u907f\u514d\u91cd\u590d\u53d1\u9001\u5df2\u7ecf\u53d1\u9001\u8fc7\u7684\u6570\u636e\u3002<\/p>\n<p>\u4e3a\u4e86\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898&#xff0c;Connection \u5bf9\u8c61\u4e2d\u9700\u8981\u7ef4\u62a4\u4e00\u4e2a\u5199\u504f\u79fb\u91cf&#xff08;write_offset&#xff09;&#xff0c;\u7528\u4e8e\u8bb0\u5f55\u5f53\u524d\u53d1\u9001\u961f\u5217\u961f\u9996\u8282\u70b9\u5df2\u7ecf\u53d1\u9001\u7684\u5b57\u8282\u6570\u3002<\/p>\n<p>\u5f53\u5199\u7ebf\u7a0b\u8c03\u7528 send \u6210\u529f\u53d1\u9001 n \u4e2a\u5b57\u8282\u540e&#xff0c;\u5c31\u9700\u8981\u5c06 write_offset \u589e\u52a0 n&#xff0c;\u8868\u793a\u5f53\u524d\u54cd\u5e94\u62a5\u6587\u5df2\u7ecf\u5411\u524d\u63a8\u8fdb\u4e86 n \u4e2a\u5b57\u8282\u3002<\/p>\n<p>\u5f53 write_offset \u589e\u957f\u5230\u961f\u9996\u8282\u70b9\u6570\u636e\u957f\u5ea6\u65f6&#xff0c;\u5c31\u8bf4\u660e\u8be5 HTTP \u54cd\u5e94\u62a5\u6587\u5df2\u7ecf\u5168\u90e8\u53d1\u9001\u5b8c\u6210\u3002\u6b64\u65f6\u4fbf\u53ef\u4ee5\u5c06\u8be5\u8282\u70b9\u4ece\u53d1\u9001\u961f\u5217\u4e2d pop \u6389&#xff0c;\u7136\u540e\u7ee7\u7eed\u5904\u7406\u53d1\u9001\u961f\u5217\u4e2d\u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\u3002<\/p>\n<p>\u5982\u679c write_offset \u5c1a\u672a\u8fbe\u5230\u961f\u9996\u8282\u70b9\u7684\u672b\u5c3e&#xff0c;\u5219\u8bf4\u660e\u5f53\u524d\u54cd\u5e94\u62a5\u6587\u8fd8\u672a\u5b8c\u5168\u53d1\u9001\u5b8c\u6210&#xff0c;\u90a3\u4e48\u8be5\u8282\u70b9\u9700\u8981\u7ee7\u7eed\u4fdd\u7559\u5728\u961f\u9996\u4f4d\u7f6e\u3002\u7b49\u5230\u4e0b\u4e00\u8f6e\u5199\u4e8b\u4ef6\u518d\u6b21\u89e6\u53d1\u65f6&#xff0c;\u5199\u7ebf\u7a0b\u5c06\u4f1a\u4ece write_offset \u6240\u6307\u793a\u7684\u4f4d\u7f6e\u7ee7\u7eed\u53d1\u9001\u5269\u4f59\u7684\u6570\u636e\u3002<\/p>\n<p>\u56e0\u6b64&#xff0c;\u5728 Connection \u5bf9\u8c61\u4e2d\u9700\u8981\u7ef4\u62a4\u5982\u4e0b\u72b6\u6001\u4fe1\u606f&#xff1a;<\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">Connection<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">public<\/span><span class=\"token operator\">:<\/span><br \/>\n    <span class=\"token function\">Connection<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token operator\">:<\/span> <span class=\"token function\">write_offset<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n         <span class=\"token comment\">\/\/&#8230;.<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><\/p>\n<p>    std<span class=\"token double-colon punctuation\">::<\/span>queue<span class=\"token operator\">&lt;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&gt;<\/span> out_buffer<span class=\"token punctuation\">;<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>mutex mtx<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/&#8230;<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> write_offset<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>\u6b64\u5916&#xff0c;\u5f53\u53d1\u9001\u961f\u5217\u7684\u961f\u9996\u8282\u70b9\u88ab\u5f39\u51fa\u4e4b\u540e&#xff0c;\u9700\u8981\u5c06 write_offset \u91cd\u65b0\u91cd\u7f6e\u4e3a 0&#xff0c;\u4ee5\u4fbf\u4e3a\u4e0b\u4e00\u6761 HTTP \u54cd\u5e94\u62a5\u6587\u91cd\u65b0\u8bb0\u5f55\u53d1\u9001\u8fdb\u5ea6\u3002<\/p>\n<p>\u901a\u8fc7\u8fd9\u79cd\u65b9\u5f0f&#xff0c;\u5373\u4f7f\u4e00\u6b21 send \u65e0\u6cd5\u53d1\u9001\u5b8c\u6574\u4e2a\u54cd\u5e94\u62a5\u6587&#xff0c;\u5199\u7ebf\u7a0b\u4e5f\u53ef\u4ee5\u5728\u540e\u7eed\u7684\u5199\u4e8b\u4ef6\u4e2d\u4ece\u4e0a\u4e00\u6b21\u53d1\u9001\u7684\u4f4d\u7f6e\u7ee7\u7eed\u53d1\u9001\u5269\u4f59\u6570\u636e&#xff0c;\u4ece\u800c\u4fdd\u8bc1\u54cd\u5e94\u62a5\u6587\u80fd\u591f\u88ab\u5b8c\u6574\u4e14\u6b63\u786e\u5730\u53d1\u9001\u5230\u5ba2\u6237\u7aef\u3002<\/p>\n<hr \/>\n<p>\u6839\u636e\u4e0a\u6587\u5206\u6790&#xff0c;\u6211\u4eec\u5df2\u7ecf\u77e5\u9053 send \u8c03\u7528\u5931\u8d25\u6709\u4e00\u79cd\u5e38\u89c1\u60c5\u51b5\u662f\u7531\u4e8e\u975e\u963b\u585e\u53d1\u9001\u5bfc\u81f4\u7684\u6761\u4ef6\u672a\u5c31\u7eea&#xff0c;\u5373 TCP \u53d1\u9001\u7f13\u51b2\u533a\u5df2\u7ecf\u88ab\u5199\u6ee1&#xff0c;\u6b64\u65f6 send \u4f1a\u8fd4\u56de -1&#xff0c;\u5e76\u5c06 errno \u8bbe\u7f6e\u4e3a EAGAIN \u6216 EWOULDBLOCK\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b&#xff0c;\u5199\u7ebf\u7a0b\u53ea\u9700\u8981\u505c\u6b62\u5f53\u524d\u53d1\u9001\u64cd\u4f5c&#xff0c;\u5e76\u7b49\u5f85\u4e0b\u4e00\u6b21\u5199\u4e8b\u4ef6\u518d\u6b21\u89e6\u53d1\u5373\u53ef\u3002<\/p>\n<p>\u7136\u800c&#xff0c;send \u8c03\u7528\u5931\u8d25\u5e76\u4e0d\u4e00\u5b9a\u90fd\u662f\u7531\u4e8e\u53d1\u9001\u7f13\u51b2\u533a\u5df2\u6ee1\u9020\u6210\u7684\u3002\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b&#xff0c;send \u53ef\u80fd\u662f\u7531\u4e8e\u771f\u6b63\u7684\u5199\u5165\u9519\u8bef\u800c\u5931\u8d25\u3002\u4f8b\u5982&#xff0c;\u5f53\u5bf9\u7aef\u5df2\u7ecf\u5173\u95ed\u8fde\u63a5&#xff0c;\u800c\u5199\u7ebf\u7a0b\u4ecd\u7136\u5c1d\u8bd5\u5411\u8be5\u8fde\u63a5\u5199\u5165\u6570\u636e\u65f6&#xff0c;send \u5c31\u4f1a\u8fd4\u56de\u9519\u8bef\u3002<\/p>\n<p>\u5bf9\u4e8e\u8fd9\u79cd\u60c5\u51b5&#xff0c;\u5199\u7ebf\u7a0b\u663e\u7136\u6ca1\u6709\u5fc5\u8981\u7ee7\u7eed\u5c1d\u8bd5\u6e05\u7a7a\u53d1\u9001\u961f\u5217&#xff0c;\u800c\u5e94\u8be5\u76f4\u63a5\u5173\u95ed\u8be5\u8fde\u63a5&#xff0c;\u5e76\u91ca\u653e\u4e0e\u8be5\u8fde\u63a5\u76f8\u5173\u7684\u8d44\u6e90\u3002\u5177\u4f53\u800c\u8a00&#xff0c;\u9700\u8981\u6267\u884c\u4ee5\u4e0b\u64cd\u4f5c&#xff1a;<\/p>\n<ul>\n<li>\u91ca\u653e Connection \u5bf9\u8c61<\/li>\n<li>\u4ece\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u5bf9\u5e94\u8282\u70b9<\/li>\n<li>\u5173\u95ed\u8be5\u8fde\u63a5\u5bf9\u5e94\u7684\u5957\u63a5\u5b57<\/li>\n<\/ul>\n<p>\u7136\u800c&#xff0c;\u8fd9\u91cc\u4f1a\u5f15\u5165\u4e00\u4e2a\u5173\u952e\u7684\u5e76\u53d1\u95ee\u9898\u3002<\/p>\n<p>\u6839\u636e\u524d\u6587\u7684\u8bbe\u8ba1&#xff0c;\u8bfb\u7ebf\u7a0b\u548c\u5199\u7ebf\u7a0b\u662f\u5e76\u53d1\u6267\u884c\u7684\u3002\u5176\u4e2d&#xff1a;<\/p>\n<ul>\n<li>\u8bfb\u7ebf\u7a0b\u8d1f\u8d23\u8bfb\u53d6\u5b8c\u6574\u7684 HTTP \u8bf7\u6c42\u3001\u89e3\u6790\u8bf7\u6c42\u5e76\u6784\u5efa\u54cd\u5e94<\/li>\n<li>\u5199\u7ebf\u7a0b\u8d1f\u8d23\u4ece\u53d1\u9001\u961f\u5217\u4e2d\u53d6\u51fa\u54cd\u5e94\u5e76\u8c03\u7528 send \u53d1\u9001<\/li>\n<\/ul>\n<p>\u5f53\u8bfb\u7ebf\u7a0b\u6784\u5efa\u597d HTTP \u54cd\u5e94\u62a5\u6587\u4e4b\u540e&#xff0c;\u4f1a\u5c06\u8be5\u54cd\u5e94\u62a5\u6587\u52a0\u5165\u5bf9\u5e94 Connection \u5bf9\u8c61\u7684\u53d1\u9001\u961f\u5217\u3002\u8fd9\u4e2a\u8fc7\u7a0b\u5b9e\u9645\u4e0a\u5305\u542b\u4e24\u4e2a\u6b65\u9aa4&#xff1a;<\/p>\n<li>\u901a\u8fc7 fd \u4f5c\u4e3a\u952e\u503c&#xff0c;\u5728\u54c8\u5e0c\u8868\u4e2d\u5b9a\u4f4d\u5bf9\u5e94\u7684 Connection \u5bf9\u8c61&#xff08;\u4f8b\u5982\u4f7f\u7528 [] \u64cd\u4f5c&#xff09;<\/li>\n<li>\u8c03\u7528\u8be5 Connection \u5bf9\u8c61\u4e2d\u7684\u53d1\u9001\u961f\u5217 push \u51fd\u6570&#xff0c;\u5c06\u54cd\u5e94\u62a5\u6587\u52a0\u5165\u961f\u5217<\/li>\n<p>\u5047\u8bbe\u53d1\u751f\u5982\u4e0b\u6267\u884c\u5e8f\u5217&#xff1a;<\/p>\n<li>\u8bfb\u7ebf\u7a0b\u5df2\u7ecf\u5b8c\u6210\u7b2c\u4e00\u4e2a\u6b65\u9aa4&#xff0c;\u5373\u901a\u8fc7 fd \u5728\u54c8\u5e0c\u8868\u4e2d\u83b7\u53d6\u5230\u4e86\u5bf9\u5e94\u7684 Connection \u6307\u9488<\/li>\n<li>\u6b64\u65f6\u7ebf\u7a0b\u53d1\u751f\u4e0a\u4e0b\u6587\u5207\u6362<\/li>\n<li>\u5199\u7ebf\u7a0b\u5f00\u59cb\u6267\u884c&#xff0c;\u5e76\u68c0\u6d4b\u5230\u540c\u4e00\u4e2a fd \u7684\u5199\u4e8b\u4ef6\u5c31\u7eea<\/li>\n<li>\u5199\u7ebf\u7a0b\u8c03\u7528 send \u53d1\u9001\u6570\u636e&#xff0c;\u4f46\u4e0d\u5e78\u7684\u662f send \u8c03\u7528\u5931\u8d25&#xff08;\u4f8b\u5982\u5bf9\u7aef\u5173\u95ed\u8fde\u63a5&#xff09;<\/li>\n<li>\u5199\u7ebf\u7a0b\u51b3\u5b9a\u5173\u95ed\u8be5\u8fde\u63a5&#xff0c;\u4e8e\u662f\u91ca\u653e Connection \u5bf9\u8c61&#xff0c;\u5e76\u4ece\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u5bf9\u5e94\u8282\u70b9<\/li>\n<li>\u968f\u540e\u7ebf\u7a0b\u518d\u6b21\u5207\u6362\u56de\u8bfb\u7ebf\u7a0b<\/li>\n<li>\u8bfb\u7ebf\u7a0b\u7ee7\u7eed\u6267\u884c\u7b2c\u4e8c\u4e2a\u6b65\u9aa4&#xff0c;\u5373\u5411 Connection \u7684\u53d1\u9001\u961f\u5217\u4e2d push \u6570\u636e<\/li>\n<p>\u7136\u800c\u6b64\u65f6 Connection \u5bf9\u8c61\u5df2\u7ecf\u88ab\u5199\u7ebf\u7a0b\u91ca\u653e&#xff0c;\u8bfb\u7ebf\u7a0b\u4ecd\u7136\u6301\u6709\u4e00\u4e2a\u5df2\u7ecf\u5931\u6548\u7684\u6307\u9488&#xff0c;\u56e0\u6b64\u4f1a\u5bfc\u81f4\u975e\u6cd5\u5185\u5b58\u8bbf\u95ee&#xff08;Use-After-Free&#xff09;\u3002<\/p>\n<p>\u9664\u6b64\u4e4b\u5916&#xff0c;\u8fd8\u5b58\u5728\u53e6\u4e00\u79cd\u6f5c\u5728\u7684\u5e76\u53d1\u95ee\u9898\u3002<\/p>\n<p>\u6211\u4eec\u77e5\u9053&#xff0c;\u5f53\u4e3b\u7ebf\u7a0b\u68c0\u6d4b\u5230\u76d1\u542c\u5957\u63a5\u5b57\u7684\u8bfb\u4e8b\u4ef6\u5c31\u7eea\u540e&#xff0c;\u4f1a\u8c03\u7528 accept \u83b7\u53d6\u65b0\u7684\u8fde\u63a5&#xff0c;\u5e76\u4e3a\u8be5\u8fde\u63a5\u521b\u5efa\u4e00\u4e2a\u65b0\u7684 Connection \u5bf9\u8c61&#xff0c;\u540c\u65f6\u5c06\u5176\u63d2\u5165\u5230\u54c8\u5e0c\u8868\u4e2d\u3002<\/p>\n<p>\u800c std::unordered_map \u5728\u63d2\u5165\u8282\u70b9\u65f6&#xff0c;\u5982\u679c\u5f53\u524d\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c&#xff0c;\u53ef\u80fd\u4f1a\u89e6\u53d1\u54c8\u5e0c\u8868\u6269\u5bb9&#xff08;rehash&#xff09;\u3002\u6269\u5bb9\u7684\u8fc7\u7a0b\u901a\u5e38\u5305\u62ec&#xff1a;<\/p>\n<li>\u521b\u5efa\u65b0\u7684\u6876\u6570\u7ec4<\/li>\n<li>\u5c06\u539f\u6709\u8282\u70b9\u91cd\u65b0\u5206\u5e03\u5230\u65b0\u7684\u6876\u4e2d<\/li>\n<li>\u91ca\u653e\u65e7\u7684\u6876\u6570\u7ec4<\/li>\n<p>\u5047\u8bbe\u53d1\u751f\u5982\u4e0b\u60c5\u51b5&#xff1a;<\/p>\n<li>\u5199\u7ebf\u7a0b\u6b63\u5728\u6267\u884c\u5220\u9664\u64cd\u4f5c&#xff0c;\u5df2\u7ecf\u6839\u636e fd \u8ba1\u7b97\u51fa\u4e86\u5bf9\u5e94\u7684\u54c8\u5e0c\u7d22\u5f15<\/li>\n<li>\u5728\u5176\u7ee7\u7eed\u904d\u5386\u94fe\u8868\u4e4b\u524d\u53d1\u751f\u7ebf\u7a0b\u5207\u6362<\/li>\n<li>\u4e3b\u7ebf\u7a0b\u63a5\u53d7\u65b0\u8fde\u63a5\u5e76\u63d2\u5165\u65b0\u7684\u8282\u70b9<\/li>\n<li>\u7531\u4e8e\u8d1f\u8f7d\u56e0\u5b50\u589e\u52a0&#xff0c;unordered_map \u89e6\u53d1\u6269\u5bb9<\/li>\n<li>\u54c8\u5e0c\u8868\u91cd\u65b0\u5206\u914d\u6876\u6570\u7ec4<\/li>\n<li>\u7ebf\u7a0b\u518d\u6b21\u5207\u6362\u56de\u5199\u7ebf\u7a0b<\/li>\n<p>\u6b64\u65f6\u5199\u7ebf\u7a0b\u4ecd\u7136\u57fa\u4e8e\u65e7\u7684\u54c8\u5e0c\u7ed3\u6784\u7ee7\u7eed\u8bbf\u95ee\u6570\u636e\u7ed3\u6784&#xff0c;\u5c31\u6709\u53ef\u80fd\u5bfc\u81f4\u8bbf\u95ee\u5df2\u7ecf\u5931\u6548\u7684\u5185\u5b58\u533a\u57df&#xff0c;\u4ece\u800c\u4ea7\u751f\u672a\u5b9a\u4e49\u884c\u4e3a\u3002<\/p>\n<p>\u56e0\u6b64&#xff0c;\u4e3a\u4e86\u4fdd\u8bc1\u54c8\u5e0c\u8868\u5728\u5e76\u53d1\u8bbf\u95ee\u4e0b\u7684\u5b89\u5168\u6027&#xff0c;\u9700\u8981\u5bf9\u6574\u4e2a\u54c8\u5e0c\u8868\u7684\u8bbf\u95ee\u8fdb\u884c\u540c\u6b65\u4fdd\u62a4\u3002<\/p>\n<p>\u5177\u4f53\u505a\u6cd5\u662f\u5f15\u5165\u4e00\u628a\u5168\u5c40\u4e92\u65a5\u9501&#xff0c;\u7528\u4e8e\u4fdd\u62a4\u6574\u4e2a\u54c8\u5e0c\u8868\u7ed3\u6784\u3002\u5f53\u4efb\u4f55\u7ebf\u7a0b\u9700\u8981\u8bbf\u95ee\u54c8\u5e0c\u8868\u65f6&#xff0c;\u90fd\u5fc5\u987b\u9996\u5148\u83b7\u53d6\u8fd9\u628a\u9501&#xff0c;\u52a0\u9501\u6210\u529f\u540e\u624d\u80fd\u6267\u884c\u76f8\u5e94\u64cd\u4f5c&#xff0c;\u5305\u62ec&#xff1a;<\/p>\n<ul>\n<li>\u67e5\u627e Connection<\/li>\n<li>\u63d2\u5165\u65b0\u8282\u70b9<\/li>\n<li>\u5220\u9664\u8282\u70b9<\/li>\n<\/ul>\n<p>\u793a\u4f8b\u4ee3\u7801\u5982\u4e0b&#xff1a;<\/p>\n<p>std<span class=\"token double-colon punctuation\">::<\/span>mutex send_queues_mtx<span class=\"token punctuation\">;<\/span><\/p>\n<p>\u901a\u8fc7\u8fd9\u79cd\u65b9\u5f0f&#xff0c;\u53ef\u4ee5\u4fdd\u8bc1\u5728\u4efb\u610f\u65f6\u523b\u53ea\u6709\u4e00\u4e2a\u7ebf\u7a0b\u80fd\u591f\u4fee\u6539\u6216\u8bbf\u95ee\u54c8\u5e0c\u8868\u7ed3\u6784&#xff0c;\u4ece\u800c\u907f\u514d\u5e76\u53d1\u8bbf\u95ee\u5bfc\u81f4\u7684\u6570\u636e\u7ed3\u6784\u4e0d\u4e00\u81f4\u4ee5\u53ca\u975e\u6cd5\u5185\u5b58\u8bbf\u95ee\u95ee\u9898\u3002<\/p>\n<hr \/>\n<p>\u7136\u800c&#xff0c;\u5982\u679c\u7b80\u5355\u5730\u5728\u6574\u4e2a\u54c8\u5e0c\u8868\u4e0a\u8bbe\u7f6e\u4e00\u628a\u5168\u5c40\u9501&#xff0c;\u53c8\u4f1a\u5f15\u5165\u65b0\u7684\u6548\u7387\u95ee\u9898\u3002<\/p>\n<p>\u5bf9\u4e8e\u5199\u7ebf\u7a0b\u800c\u8a00&#xff0c;\u5176\u4e3b\u8981\u804c\u8d23\u662f\u6e05\u7a7a\u53d1\u9001\u961f\u5217&#xff0c;\u8fd9\u610f\u5473\u7740\u5728\u5904\u7406\u67d0\u4e2a\u8fde\u63a5\u65f6&#xff0c;\u5199\u7ebf\u7a0b\u53ef\u80fd\u9700\u8981\u591a\u6b21\u8c03\u7528 send \u63a5\u53e3\u3002\u800c\u5728\u53d1\u9001\u8fc7\u7a0b\u4e2d&#xff0c;\u5199\u7ebf\u7a0b\u9700\u8981\u4e0d\u65ad\u8bbf\u95ee Connection \u5bf9\u8c61\u4e2d\u7684\u53d1\u9001\u961f\u5217\u3002<\/p>\n<p>\u5728\u5f53\u524d\u8bbe\u8ba1\u4e2d&#xff0c;Connection \u5bf9\u8c61\u662f\u901a\u8fc7 fd \u4f5c\u4e3a\u952e\u503c\u5b58\u50a8\u5728\u54c8\u5e0c\u8868\u4e2d\u7684&#xff0c;\u56e0\u6b64\u6bcf\u4e00\u6b21\u8bbf\u95ee Connection \u5bf9\u8c61&#xff0c;\u672c\u8d28\u4e0a\u90fd\u9700\u8981\u901a\u8fc7\u952e\u503c\u5728\u54c8\u5e0c\u8868\u4e2d\u5b9a\u4f4d\u5bf9\u5e94\u8282\u70b9\u3002<\/p>\n<p>\u5982\u679c\u6bcf\u6b21\u8bbf\u95ee\u90fd\u9700\u8981\u83b7\u53d6\u5168\u5c40\u54c8\u5e0c\u9501&#xff0c;\u90a3\u4e48\u5199\u7ebf\u7a0b\u5728\u5904\u7406\u53d1\u9001\u961f\u5217\u65f6\u5c31\u4f1a\u9891\u7e41\u7ade\u4e89\u8fd9\u628a\u9501\u3002\u4e00\u65e6\u9501\u7ade\u4e89\u5931\u8d25&#xff0c;\u7ebf\u7a0b\u5c31\u4f1a\u8fdb\u5165\u963b\u585e\u7b49\u5f85&#xff0c;\u4ece\u800c\u5ef6\u8fdf\u5f53\u524d fd \u7684\u53d1\u9001\u8fc7\u7a0b&#xff0c;\u5e76\u8fdb\u4e00\u6b65\u5f71\u54cd\u540e\u7eed fd \u7684\u5199\u4e8b\u4ef6\u5904\u7406\u6548\u7387\u3002<\/p>\n<p>\u4e0d\u8fc7\u5728\u5f53\u524d\u67b6\u6784\u8bbe\u8ba1\u4e2d&#xff0c;\u6709\u4e00\u4e2a\u975e\u5e38\u5173\u952e\u7684\u524d\u63d0&#xff1a;<\/p>\n<p>Connection \u5bf9\u8c61\u7684\u91ca\u653e\u4ee5\u53ca\u54c8\u5e0c\u8868\u8282\u70b9\u7684\u5220\u9664&#xff0c;\u5b8c\u5168\u7531\u5199\u7ebf\u7a0b\u8d1f\u8d23\u3002<\/p>\n<p>\u4e5f\u5c31\u662f\u8bf4&#xff0c;\u5728\u6574\u4e2a\u7cfb\u7edf\u4e2d&#xff1a;<\/p>\n<ul>\n<li>\u8bfb\u7ebf\u7a0b\u4e0d\u4f1a\u5220\u9664 Connection<\/li>\n<li>\u4e3b\u7ebf\u7a0b\u53ea\u8d1f\u8d23\u63d2\u5165\u65b0\u7684 Connection<\/li>\n<li>\u53ea\u6709\u5199\u7ebf\u7a0b\u4f1a\u5728\u8fde\u63a5\u751f\u547d\u5468\u671f\u7ed3\u675f\u65f6\u6216\u8005\u5199\u5165\u51fa\u9519\u65f6\u6267\u884c\u8d44\u6e90\u56de\u6536<\/li>\n<\/ul>\n<p>\u56e0\u6b64&#xff0c;\u5bf9\u4e8e\u5199\u7ebf\u7a0b\u6765\u8bf4&#xff0c;\u5728\u8bbf\u95ee\u67d0\u4e2a\u54c8\u5e0c\u8868\u8282\u70b9\u65f6&#xff0c;\u5e76\u4e0d\u9700\u8981\u62c5\u5fc3\u8be5\u8282\u70b9\u4f1a\u88ab\u5176\u4ed6\u7ebf\u7a0b\u5220\u9664\u3002\u6362\u53e5\u8bdd\u8bf4&#xff0c;\u5199\u7ebf\u7a0b\u4e0d\u9700\u8981\u8003\u8651\u8282\u70b9\u662f\u5426\u4ecd\u7136\u5b58\u5728\u7684\u95ee\u9898&#xff0c;\u56e0\u4e3a\u53ea\u6709\u5199\u7ebf\u7a0b\u81ea\u8eab\u624d\u4f1a\u6267\u884c\u5220\u9664\u64cd\u4f5c\u3002<\/p>\n<p>\u5199\u7ebf\u7a0b\u771f\u6b63\u9700\u8981\u5173\u6ce8\u7684\u95ee\u9898\u5176\u5b9e\u53ea\u6709\u4e00\u4e2a&#xff1a;<\/p>\n<p>\u54c8\u5e0c\u8868\u7684\u7ed3\u6784\u662f\u5426\u53d1\u751f\u4e86\u53d8\u5316\u3002<\/p>\n<p>\u4f8b\u5982&#xff0c;\u5f53\u4e3b\u7ebf\u7a0b\u63a5\u53d7\u65b0\u8fde\u63a5\u5e76\u5411 unordered_map \u63d2\u5165\u65b0\u7684\u8282\u70b9\u65f6&#xff0c;\u5982\u679c\u89e6\u53d1\u4e86\u54c8\u5e0c\u8868\u6269\u5bb9&#xff08;rehash&#xff09;&#xff0c;\u90a3\u4e48\u5e95\u5c42\u6876\u6570\u7ec4\u5c31\u4f1a\u88ab\u91cd\u65b0\u5206\u914d\u3002<\/p>\n<p>\u9700\u8981\u6ce8\u610f\u7684\u662f&#xff0c;rehash \u7684\u8fc7\u7a0b\u5e76\u4e0d\u4f1a\u91ca\u653e\u94fe\u8868\u8282\u70b9\u672c\u8eab&#xff0c;\u800c\u53ea\u662f\u91cd\u65b0\u5206\u914d\u6876\u6570\u7ec4&#xff0c;\u5e76\u5c06\u8282\u70b9\u91cd\u65b0\u6302\u8f7d\u5230\u65b0\u7684\u6876\u4e2d&#xff0c;\u968f\u540e\u91ca\u653e\u65e7\u7684\u6876\u6570\u7ec4\u3002<\/p>\n<p>\u56e0\u6b64&#xff0c;\u5bf9\u4e8e\u5199\u7ebf\u7a0b\u800c\u8a00&#xff0c;\u5982\u679c\u5728\u8bbf\u95ee\u54c8\u5e0c\u8868\u8282\u70b9\u65f6\u53d1\u751f\u6269\u5bb9&#xff0c;\u5c31\u53ef\u80fd\u5bfc\u81f4\u57fa\u4e8e\u65e7\u6876\u6570\u7ec4\u8ba1\u7b97\u51fa\u7684\u7d22\u5f15\u5931\u6548&#xff0c;\u4ece\u800c\u4ea7\u751f\u672a\u5b9a\u4e49\u884c\u4e3a\u3002<\/p>\n<p>\u57fa\u4e8e\u8fd9\u4e00\u70b9&#xff0c;\u53ef\u4ee5\u5bf9\u9501\u7684\u4f7f\u7528\u65b9\u5f0f\u8fdb\u884c\u4f18\u5316\u3002<\/p>\n<p>\u5199\u7ebf\u7a0b\u5728\u5904\u7406\u5199\u4e8b\u4ef6\u65f6&#xff0c;\u53ef\u4ee5\u5148\u77ed\u6682\u83b7\u53d6\u4e00\u6b21\u5168\u5c40\u54c8\u5e0c\u9501&#xff0c;\u4ec5\u7528\u4e8e\u6839\u636e fd \u83b7\u53d6\u5bf9\u5e94\u7684 Connection \u6307\u9488\u3002\u5728\u6210\u529f\u83b7\u53d6\u6307\u9488\u4e4b\u540e&#xff0c;\u4fbf\u53ef\u4ee5\u7acb\u5373\u91ca\u653e\u5168\u5c40\u9501\u3002<\/p>\n<p>\u7531\u4e8e Connection \u5bf9\u8c61\u7684\u751f\u547d\u5468\u671f\u7531\u5199\u7ebf\u7a0b\u81ea\u8eab\u63a7\u5236&#xff0c;\u5e76\u4e14\u5176\u4ed6\u7ebf\u7a0b\u4e0d\u4f1a\u5220\u9664\u8be5\u5bf9\u8c61&#xff0c;\u56e0\u6b64\u5728\u540e\u7eed\u8bbf\u95ee\u8be5\u6307\u9488\u65f6\u65e0\u9700\u518d\u6b21\u52a0\u9501&#xff0c;\u4e5f\u65e0\u9700\u62c5\u5fc3\u54c8\u5e0c\u8868\u6269\u5bb9\u5e26\u6765\u7684\u95ee\u9898\u3002<\/p>\n<p>\u8fd9\u79cd\u65b9\u5f0f\u53ef\u4ee5\u663e\u8457\u7f29\u77ed\u5168\u5c40\u9501\u7684\u6301\u6709\u65f6\u95f4&#xff0c;\u4ece\u800c\u51cf\u5c11\u9501\u7ade\u4e89\u5bf9\u7cfb\u7edf\u6027\u80fd\u7684\u5f71\u54cd\u3002<\/p>\n<p>\u5177\u4f53\u5b9e\u73b0\u793a\u4f8b\u5982\u4e0b&#xff1a;<\/p>\n<p><span class=\"token keyword\">static<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token function\">write_thread_func<\/span><span class=\"token punctuation\">(<\/span>Pollmanager<span class=\"token operator\">*<\/span> write_arg<span class=\"token punctuation\">,<\/span> Pollmanager<span class=\"token operator\">*<\/span> read_arg<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>vector<span class=\"token operator\">&lt;<\/span>pollfd<span class=\"token operator\">&gt;<\/span> poll_fds <span class=\"token operator\">&#061;<\/span> write_arg<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">get_snapshot<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>poll_fds<span class=\"token punctuation\">.<\/span><span class=\"token function\">empty<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token function\">usleep<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">10000<\/span><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 keyword\">int<\/span> n <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">poll<\/span><span class=\"token punctuation\">(<\/span>poll_fds<span class=\"token punctuation\">.<\/span><span class=\"token function\">data<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> poll_fds<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">10<\/span><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><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>Fatal<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;Poll error&#034;<\/span><span class=\"token punctuation\">)<\/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 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><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>info<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;write_thread poll timeout&#034;<\/span><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 keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">auto<\/span><span class=\"token operator\">&amp;<\/span> i <span class=\"token operator\">:<\/span> poll_fds<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>i<span class=\"token punctuation\">.<\/span>revents <span class=\"token operator\">&amp;<\/span> POLLOUT<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">lock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                Connection<span class=\"token operator\">*<\/span> conn <span class=\"token operator\">&#061;<\/span> send_queues<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">.<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                conn<span class=\"token operator\">-&gt;<\/span>mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">lock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                <span class=\"token keyword\">bool<\/span> eagain_occurred <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>conn<span class=\"token operator\">-&gt;<\/span>out_buffer<span class=\"token punctuation\">.<\/span><span class=\"token function\">empty<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token punctuation\">{<\/span><br \/>\n                    std<span class=\"token double-colon punctuation\">::<\/span>string data <span class=\"token operator\">&#061;<\/span> conn<span class=\"token operator\">-&gt;<\/span>out_buffer<span class=\"token punctuation\">.<\/span><span class=\"token function\">front<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    ssize_t send_bytes <span class=\"token operator\">&#061;<\/span><br \/>\n                        <span class=\"token function\">send<\/span><span class=\"token punctuation\">(<\/span>i<span class=\"token punctuation\">.<\/span>fd<span class=\"token punctuation\">,<\/span><br \/>\n                             data<span class=\"token punctuation\">.<\/span><span class=\"token function\">c_str<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#043;<\/span> conn<span class=\"token operator\">-&gt;<\/span>write_offset<span class=\"token punctuation\">,<\/span><br \/>\n                             data<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span> conn<span class=\"token operator\">-&gt;<\/span>write_offset<span class=\"token punctuation\">,<\/span><br \/>\n                             MSG_DONTWAIT<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    <span class=\"token comment\">\/\/ &#8230;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><\/p>\n<p>                <span class=\"token comment\">\/\/ &#8230;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u901a\u8fc7\u8fd9\u79cd\u65b9\u5f0f&#xff0c;\u5168\u5c40\u54c8\u5e0c\u9501\u4ec5\u7528\u4e8e\u83b7\u53d6 Connection \u6307\u9488&#xff0c;\u800c\u4e0d\u4f1a\u5728\u6574\u4e2a\u53d1\u9001\u8fc7\u7a0b\u4e2d\u6301\u7eed\u6301\u6709&#xff0c;\u4ece\u800c\u5728\u4fdd\u8bc1\u7ebf\u7a0b\u5b89\u5168\u7684\u540c\u65f6\u964d\u4f4e\u9501\u7ade\u4e89\u5e26\u6765\u7684\u6027\u80fd\u5f71\u54cd\u3002<\/p>\n<hr \/>\n<p>\u6839\u636e\u4e0a\u6587\u7684\u5206\u6790&#xff0c;\u81f3\u6b64\u6211\u4eec\u5df2\u7ecf\u80fd\u591f\u660e\u786e\u5199\u4e8b\u4ef6\u7684\u5904\u7406\u7ed3\u679c\u3002\u603b\u4f53\u800c\u8a00&#xff0c;\u5199\u4e8b\u4ef6\u5b8c\u6210\u540e\u7684\u72b6\u6001\u53ef\u4ee5\u5f52\u7eb3\u4e3a\u4ee5\u4e0b\u56db\u79cd\u60c5\u51b5&#xff1a;<\/p>\n<li>\u5199\u5165\u9519\u8bef<\/li>\n<li>\u53d1\u9001\u961f\u5217\u5df2\u7ecf\u6e05\u7a7a&#xff0c;\u4f46\u8fde\u63a5\u751f\u547d\u5468\u671f\u5c1a\u672a\u7ed3\u675f&#xff08;\u540e\u7eed\u4ecd\u53ef\u80fd\u6536\u5230\u65b0\u7684\u8bf7\u6c42\u62a5\u6587&#xff09;<\/li>\n<li>\u975e\u963b\u585e\u8c03\u7528 send \u65f6\u53d1\u9001\u7f13\u51b2\u533a\u5df2\u6ee1&#xff08;EAGAIN&#xff09;&#xff0c;\u53d1\u9001\u961f\u5217\u5c1a\u672a\u6e05\u7a7a<\/li>\n<li>\u53d1\u9001\u961f\u5217\u5df2\u7ecf\u6e05\u7a7a&#xff0c;\u5e76\u4e14\u8fde\u63a5\u751f\u547d\u5468\u671f\u7ed3\u675f<\/li>\n<p>\u56e0\u6b64&#xff0c;\u5199\u4e8b\u4ef6\u5904\u7406\u5b8c\u6210\u540e\u7684\u72b6\u6001\u672c\u8d28\u4e0a\u53ea\u4f1a\u843d\u5165\u4e0a\u8ff0\u56db\u79cd\u60c5\u51b5\u4e4b\u4e00\u3002\u63a5\u4e0b\u6765\u5206\u522b\u5206\u6790\u8fd9\u56db\u79cd\u60c5\u51b5\u5bf9\u5e94\u7684\u5904\u7406\u65b9\u5f0f\u3002<\/p>\n<hr \/>\n<p>\u7b2c\u4e00\u79cd\u60c5\u51b5&#xff1a;\u5199\u5165\u9519\u8bef and \u7b2c\u56db\u79cd\u60c5\u51b5&#xff1a;\u53d1\u9001\u961f\u5217\u6e05\u7a7a\u4e14\u8fde\u63a5\u751f\u547d\u5468\u671f\u7ed3\u675f<\/p>\n<p>\u8fd9\u4e24\u79cd\u60c5\u51b5\u7684\u5904\u7406\u903b\u8f91\u672c\u8d28\u4e0a\u662f\u76f8\u540c\u7684&#xff1a;\u8be5\u8fde\u63a5\u5df2\u7ecf\u4e0d\u518d\u9700\u8981\u7ee7\u7eed\u5b58\u5728&#xff0c;\u56e0\u6b64\u9700\u8981\u6267\u884c\u8fde\u63a5\u8d44\u6e90\u7684\u56de\u6536\u3002<\/p>\n<p>\u5177\u4f53\u5904\u7406\u6d41\u7a0b\u5982\u4e0b&#xff1a;<\/p>\n<li>\u5148\u4ece\u8bfb\u4e8b\u4ef6\u96c6\u5408\u548c\u5199\u4e8b\u4ef6\u96c6\u5408\u4e2d\u5220\u9664\u8be5 fd<\/li>\n<li>\u7ade\u4e89\u5168\u5c40\u54c8\u5e0c\u8868\u9501<\/li>\n<li>\u5148\u91ca\u653e Connection \u5bf9\u8c61\u5185\u90e8\u7684\u9501&#xff08;conn-&gt;mtx&#xff09;<\/li>\n<p>\u8fd9\u91cc\u9700\u8981\u7279\u522b\u6ce8\u610f\u9501\u7684\u91ca\u653e\u987a\u5e8f\u3002\u5982\u679c\u5728\u5220\u9664 Connection \u5bf9\u8c61\u4e4b\u540e\u518d\u5c1d\u8bd5\u91ca\u653e conn-&gt;mtx&#xff0c;\u5c31\u4f1a\u5bfc\u81f4\u5bf9\u5df2\u7ecf\u91ca\u653e\u5185\u5b58\u7684\u8bbf\u95ee&#xff0c;\u4ece\u800c\u4ea7\u751f\u975e\u6cd5\u5185\u5b58\u8bbf\u95ee&#xff08;use-after-free&#xff09;\u3002<\/p>\n<p>\u56e0\u6b64\u5fc5\u987b\u5148\u91ca\u653e Connection \u9501&#xff0c;\u518d\u6267\u884c\u5bf9\u8c61\u9500\u6bc1\u3002<\/p>\n<li>\u5220\u9664 Connection \u5bf9\u8c61<\/li>\n<li>\u4ece\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u5bf9\u5e94\u8282\u70b9<\/li>\n<li>\u91ca\u653e\u5168\u5c40\u54c8\u5e0c\u9501<\/li>\n<li>\u6700\u540e\u5173\u95ed\u5957\u63a5\u5b57<\/li>\n<hr \/>\n<p>\u7b2c\u4e8c\u79cd\u60c5\u51b5&#xff1a;\u53d1\u9001\u961f\u5217\u6e05\u7a7a&#xff0c;\u4f46\u8fde\u63a5\u5c1a\u672a\u5173\u95ed<\/p>\n<p>\u5f53\u53d1\u9001\u961f\u5217\u5df2\u7ecf\u88ab\u5b8c\u5168\u6e05\u7a7a&#xff0c;\u800c\u8fde\u63a5\u751f\u547d\u5468\u671f\u4ecd\u7136\u6709\u6548\u65f6&#xff0c;\u8bf4\u660e\u5f53\u524d\u54cd\u5e94\u5df2\u7ecf\u53d1\u9001\u5b8c\u6210&#xff0c;\u4f46\u8fde\u63a5\u4ecd\u7136\u4fdd\u6301&#xff08;\u4f8b\u5982 HTTP Keep-Alive&#xff09;\u3002<\/p>\n<p>\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b&#xff1a;<\/p>\n<ul>\n<li>\u5199\u7ebf\u7a0b\u4e0d\u80fd\u91ca\u653e Connection \u5bf9\u8c61<\/li>\n<li>\u4e5f\u4e0d\u80fd\u5220\u9664\u54c8\u5e0c\u8868\u8282\u70b9<\/li>\n<\/ul>\n<p>\u4f46\u662f\u6b64\u65f6\u7ee7\u7eed\u76d1\u542c\u8be5 fd \u7684\u5199\u4e8b\u4ef6\u5df2\u7ecf\u6ca1\u6709\u610f\u4e49\u3002<\/p>\n<p>\u8fd9\u662f\u56e0\u4e3a\u5199\u4e8b\u4ef6\u5c31\u7eea\u7684\u8bed\u4e49\u662f&#xff1a;\u53d1\u9001\u7f13\u51b2\u533a\u672a\u6ee1&#xff0c;\u53ef\u4ee5\u7ee7\u7eed\u53d1\u9001\u6570\u636e\u3002\u7136\u800c\u5f53\u524d\u53d1\u9001\u961f\u5217\u5df2\u7ecf\u4e3a\u7a7a&#xff0c;\u5373\u4f7f\u5199\u4e8b\u4ef6\u518d\u6b21\u5c31\u7eea&#xff0c;\u4e5f\u6ca1\u6709\u4efb\u4f55\u6570\u636e\u53ef\u4ee5\u53d1\u9001&#xff0c;\u56e0\u6b64\u7ebf\u7a0b\u4f1a\u88ab\u4e0d\u65ad\u5524\u9192\u5374\u65e0\u6cd5\u6267\u884c\u6709\u6548\u5de5\u4f5c&#xff0c;\u4ece\u800c\u5f62\u6210\u7a7a\u8f6c&#xff08;busy loop&#xff09;\u3002<\/p>\n<p>\u56e0\u6b64\u9700\u8981\u5c06\u8be5 fd \u4ece\u5199\u4e8b\u4ef6\u96c6\u5408\u4e2d\u5220\u9664&#xff0c;\u4ec5\u4fdd\u7559\u8bfb\u4e8b\u4ef6\u76d1\u542c&#xff0c;\u4ee5\u7b49\u5f85\u65b0\u7684\u8bf7\u6c42\u5230\u8fbe\u3002<\/p>\n<p>\u5b8c\u6210\u5220\u9664\u5199\u4e8b\u4ef6\u96c6\u5408\u64cd\u4f5c\u540e&#xff0c;\u53ea\u9700\u8981\u91ca\u653e Connection \u9501\u5373\u53ef\u3002<\/p>\n<hr \/>\n<p>\u7b2c\u4e09\u79cd\u60c5\u51b5&#xff1a;\u53d1\u9001\u7f13\u51b2\u533a\u5df2\u6ee1&#xff08;EAGAIN&#xff09;<\/p>\n<p>\u5982\u679c send \u8fd4\u56de EAGAIN&#xff0c;\u8bf4\u660e\u5f53\u524d\u5957\u63a5\u5b57\u7684\u53d1\u9001\u7f13\u51b2\u533a\u5df2\u7ecf\u6ee1&#xff0c;\u4f46\u8fd9\u5e76\u4e0d\u662f\u9519\u8bef&#xff0c;\u800c\u662f\u975e\u963b\u585e I\/O \u7684\u6b63\u5e38\u884c\u4e3a\u3002<\/p>\n<p>\u6b64\u65f6\u53d1\u9001\u961f\u5217\u5c1a\u672a\u6e05\u7a7a&#xff0c;\u56e0\u6b64\u8be5\u8fde\u63a5\u4ecd\u7136\u9700\u8981\u5728\u540e\u7eed\u5199\u4e8b\u4ef6\u4e2d\u7ee7\u7eed\u53d1\u9001\u5269\u4f59\u6570\u636e\u3002<\/p>\n<p>\u56e0\u6b64&#xff1a;<\/p>\n<ul>\n<li>\u4e0d\u9700\u8981\u5220\u9664\u5199\u4e8b\u4ef6<\/li>\n<li>\u4e0d\u9700\u8981\u91ca\u653e Connection<\/li>\n<li>\u53ea\u9700\u8981\u91ca\u653e\u8fde\u63a5\u9501<\/li>\n<\/ul>\n<p>\u5f53\u4e0b\u4e00\u8f6e\u5199\u4e8b\u4ef6\u518d\u6b21\u5c31\u7eea\u65f6&#xff0c;\u5199\u7ebf\u7a0b\u4f1a\u7ee7\u7eed\u6e05\u7a7a\u53d1\u9001\u961f\u5217\u3002<\/p>\n<hr \/>\n<p>\u5728\u5177\u4f53\u5b9e\u73b0\u4e2d&#xff0c;\u7531\u4e8e\u4e0a\u8ff0\u51e0\u79cd\u60c5\u51b5\u90fd\u4f1a\u5bfc\u81f4\u9000\u51fa while \u5faa\u73af&#xff0c;\u56e0\u6b64\u4ee3\u7801\u4e2d\u8bbe\u7f6e\u4e86\u4e24\u4e2a\u6807\u5fd7\u4f4d\u7528\u4e8e\u533a\u5206\u4e0d\u540c\u60c5\u51b5&#xff1a;<\/p>\n<ul>\n<li>error_occurred&#xff1a;\u7528\u4e8e\u6807\u8bc6\u5199\u5165\u9519\u8bef<\/li>\n<li>eagain_occurred&#xff1a;\u7528\u4e8e\u6807\u8bc6\u53d1\u9001\u7f13\u51b2\u533a\u5df2\u6ee1<\/li>\n<\/ul>\n<p>\u5bf9\u5e94\u5b9e\u73b0\u4ee3\u7801\u5982\u4e0b&#xff1a;<\/p>\n<p><span class=\"token keyword\">static<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token function\">write_thread_func<\/span><span class=\"token punctuation\">(<\/span>Pollmanager<span class=\"token operator\">*<\/span> write_arg<span class=\"token punctuation\">,<\/span>Pollmanager<span class=\"token operator\">*<\/span> read_arg<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <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><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>vector<span class=\"token operator\">&lt;<\/span>pollfd<span class=\"token operator\">&gt;<\/span> poll_fds<span class=\"token operator\">&#061;<\/span>write_arg<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">get_snapshot<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>poll_fds<span class=\"token punctuation\">.<\/span><span class=\"token function\">empty<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token function\">usleep<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">10000<\/span><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\">int<\/span> n<span class=\"token operator\">&#061;<\/span><span class=\"token function\">poll<\/span><span class=\"token punctuation\">(<\/span>poll_fds<span class=\"token punctuation\">.<\/span><span class=\"token function\">data<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>poll_fds<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><span class=\"token number\">10<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <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><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>Fatal<span class=\"token punctuation\">,<\/span><span class=\"token string\">&#034;Poll error&#034;<\/span><span class=\"token punctuation\">)<\/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><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><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>info<span class=\"token punctuation\">,<\/span><span class=\"token string\">&#034;write_thread poll timeout&#034;<\/span><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\">for<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">auto<\/span><span class=\"token operator\">&amp;<\/span> i<span class=\"token operator\">:<\/span>poll_fds<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>i<span class=\"token punctuation\">.<\/span>revents<span class=\"token operator\">&amp;<\/span>POLLOUT<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">lock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                Connection<span class=\"token operator\">*<\/span> conn<span class=\"token operator\">&#061;<\/span>send_queues<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">.<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                conn<span class=\"token operator\">-&gt;<\/span>mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">lock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                <span class=\"token keyword\">bool<\/span> error_occurred<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">bool<\/span> eagain_occurred<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                <span class=\"token keyword\">while<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>conn<span class=\"token operator\">-&gt;<\/span>out_buffer<span class=\"token punctuation\">.<\/span><span class=\"token function\">empty<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token punctuation\">{<\/span><br \/>\n                    std<span class=\"token double-colon punctuation\">::<\/span>string data<span class=\"token operator\">&#061;<\/span>conn<span class=\"token operator\">-&gt;<\/span>out_buffer<span class=\"token punctuation\">.<\/span><span class=\"token function\">front<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    ssize_t send_bytes<span class=\"token operator\">&#061;<\/span><br \/>\n                        <span class=\"token function\">send<\/span><span class=\"token punctuation\">(<\/span>i<span class=\"token punctuation\">.<\/span>fd<span class=\"token punctuation\">,<\/span><br \/>\n                             data<span class=\"token punctuation\">.<\/span><span class=\"token function\">c_str<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token operator\">&#043;<\/span>conn<span class=\"token operator\">-&gt;<\/span>write_offset<span class=\"token punctuation\">,<\/span><br \/>\n                             data<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token operator\">&#8211;<\/span>conn<span class=\"token operator\">-&gt;<\/span>write_offset<span class=\"token punctuation\">,<\/span><br \/>\n                             MSG_DONTWAIT<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>send_bytes<span class=\"token operator\">&lt;<\/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\">if<\/span><span class=\"token punctuation\">(<\/span>errno<span class=\"token operator\">&#061;&#061;<\/span>EAGAIN<span class=\"token punctuation\">)<\/span><br \/>\n                        <span class=\"token punctuation\">{<\/span><br \/>\n                            eagain_occurred<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">true<\/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><\/p>\n<p>                        lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>Fatal<span class=\"token punctuation\">,<\/span><span class=\"token string\">&#034;send error&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                        error_occurred<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">true<\/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 keyword\">else<\/span><br \/>\n                    <span class=\"token punctuation\">{<\/span><br \/>\n                        conn<span class=\"token operator\">-&gt;<\/span>write_offset<span class=\"token operator\">&#043;&#061;<\/span>send_bytes<span class=\"token punctuation\">;<\/span><\/p>\n<p>                        <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>conn<span class=\"token operator\">-&gt;<\/span>write_offset<span class=\"token operator\">&#061;&#061;<\/span>data<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n                        <span class=\"token punctuation\">{<\/span><br \/>\n                            conn<span class=\"token operator\">-&gt;<\/span>write_offset<span class=\"token operator\">&#061;<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                            conn<span class=\"token operator\">-&gt;<\/span>out_buffer<span class=\"token punctuation\">.<\/span><span class=\"token function\">pop<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/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 punctuation\">}<\/span><\/p>\n<p>                <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>error_occurred<span class=\"token operator\">||<\/span><span class=\"token punctuation\">(<\/span>conn<span class=\"token operator\">-&gt;<\/span>should_close<span class=\"token operator\">&amp;&amp;<\/span>conn<span class=\"token operator\">-&gt;<\/span>out_buffer<span class=\"token punctuation\">.<\/span><span class=\"token function\">empty<\/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 punctuation\">{<\/span><br \/>\n                    read_arg<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">del_fd<\/span><span class=\"token punctuation\">(<\/span>i<span class=\"token punctuation\">.<\/span>fd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    write_arg<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">del_fd<\/span><span class=\"token punctuation\">(<\/span>i<span class=\"token punctuation\">.<\/span>fd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">lock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    conn<span class=\"token operator\">-&gt;<\/span>mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token keyword\">delete<\/span> conn<span class=\"token punctuation\">;<\/span><br \/>\n                    send_queues<span class=\"token punctuation\">.<\/span><span class=\"token function\">erase<\/span><span class=\"token punctuation\">(<\/span>i<span class=\"token punctuation\">.<\/span>fd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    <span class=\"token function\">close<\/span><span class=\"token punctuation\">(<\/span>i<span class=\"token punctuation\">.<\/span>fd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/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>eagain_occurred<span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token punctuation\">{<\/span><br \/>\n                    conn<span class=\"token operator\">-&gt;<\/span>mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/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>conn<span class=\"token operator\">-&gt;<\/span>should_close<span class=\"token operator\">&#061;&#061;<\/span><span class=\"token boolean\">false<\/span><span class=\"token operator\">&amp;&amp;<\/span>conn<span class=\"token operator\">-&gt;<\/span>out_buffer<span class=\"token punctuation\">.<\/span><span class=\"token function\">empty<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token punctuation\">{<\/span><br \/>\n                    write_arg<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">del_fd<\/span><span class=\"token punctuation\">(<\/span>i<span class=\"token punctuation\">.<\/span>fd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    conn<span class=\"token operator\">-&gt;<\/span>mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/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 punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u6700\u540e\u8fd8\u9700\u8981\u8865\u5145\u4e00\u4e2a\u95ee\u9898&#xff1a;\u5199\u7ebf\u7a0b\u5982\u4f55\u5224\u65ad\u5f53\u524d\u8fde\u63a5\u7684\u751f\u547d\u5468\u671f\u662f\u5426\u5df2\u7ecf\u7ed3\u675f\u3002<\/p>\n<p>\u8fd9\u4e00\u70b9\u5b9e\u9645\u4e0a\u4e0e\u8bfb\u7ebf\u7a0b\u7684\u5904\u7406\u903b\u8f91\u5bc6\u5207\u76f8\u5173\u3002<\/p>\n<p>\u5f53\u8bfb\u7ebf\u7a0b\u8bfb\u53d6\u5230\u5b8c\u6574\u7684 HTTP \u8bf7\u6c42\u62a5\u6587\u4e4b\u540e&#xff0c;\u4f1a\u8fdb\u5165\u8bf7\u6c42\u5904\u7406\u9636\u6bb5\u3002\u5728\u5904\u7406\u8bf7\u6c42\u7684\u8fc7\u7a0b\u4e2d&#xff0c;\u9700\u8981\u89e3\u6790\u8bf7\u6c42\u5934\u4e2d\u7684\u4e00\u4e2a\u5173\u952e\u5b57\u6bb5&#xff0c;\u5373 Connection \u5b57\u6bb5\u3002\u8be5\u5b57\u6bb5\u7528\u4e8e\u6307\u793a\u5ba2\u6237\u7aef\u5bf9\u8fde\u63a5\u751f\u547d\u5468\u671f\u7684\u671f\u671b\u3002<\/p>\n<p>\u901a\u5e38\u5b58\u5728\u4e24\u79cd\u60c5\u51b5&#xff1a;<\/p>\n<li>\n<p>Connection: keep-alive<\/p>\n<p>\u5982\u679c\u8bf7\u6c42\u5934\u4e2d\u7684 Connection \u5b57\u6bb5\u4e3a keep-alive&#xff0c;\u8bf4\u660e\u5ba2\u6237\u7aef\u5e0c\u671b\u4fdd\u6301\u5f53\u524d TCP \u8fde\u63a5\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b&#xff0c;\u5f53\u524d\u8bf7\u6c42\u5904\u7406\u5b8c\u6210\u4e4b\u540e&#xff0c;\u8fde\u63a5\u4ecd\u7136\u4fdd\u6301\u6253\u5f00\u72b6\u6001&#xff0c;\u540e\u7eed\u8fd8\u53ef\u80fd\u7ee7\u7eed\u63a5\u6536\u65b0\u7684\u8bf7\u6c42\u62a5\u6587\u3002<\/p>\n<\/li>\n<li>\n<p>Connection: close<\/p>\n<p>\u5982\u679c\u8bf7\u6c42\u5934\u4e2d\u7684 Connection \u5b57\u6bb5\u4e3a close&#xff0c;\u5219\u8bf4\u660e\u5ba2\u6237\u7aef\u5e0c\u671b\u5728\u5f53\u524d\u8bf7\u6c42\u5904\u7406\u5b8c\u6210\u540e\u5173\u95ed\u8fde\u63a5\u3002\u56e0\u6b64&#xff0c;\u5f53\u524d\u8bfb\u7ebf\u7a0b\u8bfb\u53d6\u5230\u7684\u8bf7\u6c42\u62a5\u6587\u5c31\u662f\u8be5\u8fde\u63a5\u4e0a\u7684\u6700\u540e\u4e00\u4e2a\u8bf7\u6c42\u62a5\u6587&#xff0c;\u540e\u7eed\u4e0d\u4f1a\u518d\u63a5\u6536\u5230\u65b0\u7684\u8bf7\u6c42\u3002<\/p>\n<\/li>\n<p>\u57fa\u4e8e\u8fd9\u4e00\u8bed\u4e49&#xff0c;\u5728 Connection \u5bf9\u8c61\u4e2d\u5f15\u5165\u4e86\u4e00\u4e2a\u6807\u5fd7\u4f4d should_close\u3002\u5f53\u8bfb\u7ebf\u7a0b\u5728\u89e3\u6790 HTTP \u8bf7\u6c42\u5934\u65f6&#xff0c;\u5982\u679c\u68c0\u6d4b\u5230 Connection \u5b57\u6bb5\u4e3a close&#xff0c;\u5c31\u4f1a\u5c06\u8be5\u6807\u5fd7\u4f4d\u8bbe\u7f6e\u4e3a true\u3002<\/p>\n<p>\u4e4b\u540e&#xff0c;\u5f53\u5199\u7ebf\u7a0b\u5b8c\u6210\u54cd\u5e94\u53d1\u9001\u65f6&#xff0c;\u5c31\u53ef\u4ee5\u6839\u636e should_close \u6807\u5fd7\u4f4d\u5224\u65ad\u5f53\u524d\u8fde\u63a5\u7684\u6700\u7ec8\u5904\u7406\u65b9\u5f0f&#xff1a;<\/p>\n<ul>\n<li>\u5982\u679c should_close &#061;&#061; false&#xff0c;\u8bf4\u660e\u8fde\u63a5\u4ecd\u7136\u9700\u8981\u4fdd\u6301&#xff0c;\u7528\u4e8e\u540e\u7eed\u8bf7\u6c42<\/li>\n<li>\u5982\u679c should_close &#061;&#061; true&#xff0c;\u5219\u5728\u53d1\u9001\u961f\u5217\u6e05\u7a7a\u4e4b\u540e\u9700\u8981\u5173\u95ed\u8fde\u63a5\u5e76\u91ca\u653e\u76f8\u5173\u8d44\u6e90<\/li>\n<\/ul>\n<p>\u4e5f\u5c31\u662f\u8bf4&#xff0c;\u8bfb\u7ebf\u7a0b\u8d1f\u8d23\u51b3\u5b9a\u8fde\u63a5\u751f\u547d\u5468\u671f&#xff0c;\u800c\u5199\u7ebf\u7a0b\u8d1f\u8d23\u5728\u53d1\u9001\u5b8c\u6210\u540e\u6267\u884c\u6700\u7ec8\u7684\u8fde\u63a5\u56de\u6536\u3002\u8fd9\u79cd\u804c\u8d23\u5212\u5206\u53ef\u4ee5\u907f\u514d\u591a\u7ebf\u7a0b\u540c\u65f6\u64cd\u4f5c\u8fde\u63a5\u751f\u547d\u5468\u671f\u6240\u5e26\u6765\u7684\u5e76\u53d1\u95ee\u9898\u3002<\/p>\n<p>\u5bf9\u5e94\u7684 Connection \u6570\u636e\u7ed3\u6784\u5b9a\u4e49\u5982\u4e0b&#xff1a;<\/p>\n<p><span class=\"token keyword\">enum<\/span> <span class=\"token class-name\">ParseState<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    PARSE_HEDER<span class=\"token punctuation\">,<\/span><br \/>\n    PARSE_BODY<br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">Connection<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">public<\/span><span class=\"token operator\">:<\/span><br \/>\n    <span class=\"token function\">Connection<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token operator\">:<\/span> <span class=\"token function\">write_offset<\/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 function\">should_close<\/span><span class=\"token punctuation\">(<\/span><span class=\"token boolean\">false<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n          <span class=\"token function\">parse_state<\/span><span class=\"token punctuation\">(<\/span>PARSE_HEDER<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n          <span class=\"token function\">header_length<\/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 function\">body_length<\/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 function\">header<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    std<span class=\"token double-colon punctuation\">::<\/span>queue<span class=\"token operator\">&lt;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&gt;<\/span> in_buffer<span class=\"token punctuation\">;<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>queue<span class=\"token operator\">&lt;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&gt;<\/span> out_buffer<span class=\"token punctuation\">;<\/span><\/p>\n<p>    std<span class=\"token double-colon punctuation\">::<\/span>mutex mtx<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">int<\/span> write_offset<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">bool<\/span> should_close<span class=\"token punctuation\">;<\/span><\/p>\n<p>    ParseState parse_state<span class=\"token punctuation\">;<\/span><\/p>\n<p>    size_t header_length<span class=\"token punctuation\">;<\/span><br \/>\n    size_t body_length<span class=\"token punctuation\">;<\/span><\/p>\n<p>    std<span class=\"token double-colon punctuation\">::<\/span>string header<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>std<span class=\"token double-colon punctuation\">::<\/span>unordered_map<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token punctuation\">,<\/span> Connection<span class=\"token operator\">*<\/span><span class=\"token operator\">&gt;<\/span> send_queues<span class=\"token punctuation\">;<\/span><\/p>\n<p>\u81f3\u6b64&#xff0c;\u7ec8\u4e8e\u8bf4\u660e\u767d\u4e86Connection\u5bf9\u8c61\u7684\u5b8c\u5168\u4f53<\/p>\n<hr \/>\n<h3>Connection\u5bf9\u8c61\u751f\u547d\u5468\u671f\u7ba1\u7406&#xff1a;\u5f15\u7528\u8ba1\u6570&#043;\u5ef6\u8fdf\u5220\u9664<\/h3>\n<p>\u81f3\u6b64&#xff0c;\u5bf9\u4e8e\u8bfb\u7ebf\u7a0b\u800c\u8a00&#xff0c;\u6211\u4eec\u5c31\u53ef\u4ee5\u8fdb\u4e00\u6b65\u5b8c\u5584 Get_HttpRequest \u51fd\u6570\u7684\u5b9e\u73b0\u903b\u8f91\u3002Get_HttpRequest \u51fd\u6570\u7684\u4e3b\u8981\u804c\u8d23\u662f&#xff1a;\u8bfb\u53d6\u4e00\u4e2a\u5b8c\u6574\u7684 HTTP \u8bf7\u6c42\u62a5\u6587\u5e76\u5b8c\u6210\u53cd\u5e8f\u5217\u5316\u89e3\u6790\u3002<\/p>\n<p>\u7136\u800c&#xff0c;\u6839\u636e\u4e0a\u6587\u7684\u5206\u6790&#xff0c;\u6211\u4eec\u5df2\u7ecf\u77e5\u9053\u5199\u7ebf\u7a0b\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u4f1a\u6267\u884c\u201c\u6536\u5c38\u201d\u64cd\u4f5c&#xff0c;\u4e5f\u5c31\u662f\u91ca\u653e Connection \u5bf9\u8c61\u5e76\u5220\u9664\u54c8\u5e0c\u8868\u8282\u70b9\u3002\u56e0\u6b64&#xff0c;\u5bf9\u4e8e\u8bfb\u7ebf\u7a0b\u6765\u8bf4&#xff0c;\u8be5\u51fd\u6570\u540e\u7eed\u6d41\u7a0b\u5fc5\u7136\u9700\u8981\u8bbf\u95ee Connection \u5bf9\u8c61\u4e2d\u7684\u63a5\u6536\u961f\u5217&#xff0c;\u800c\u8bfb\u7ebf\u7a0b\u4e0e\u5199\u7ebf\u7a0b\u662f\u5e76\u53d1\u6267\u884c\u7684\u3002\u8fd9\u662f\u56e0\u4e3a TCP \u672c\u8eab\u662f\u5168\u53cc\u5de5\u901a\u4fe1&#xff0c;\u8bfb\u4e8b\u4ef6\u548c\u5199\u4e8b\u4ef6\u53ef\u4ee5\u540c\u65f6\u53d1\u751f\u3002<\/p>\n<p>\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b&#xff0c;\u5c31\u53ef\u80fd\u51fa\u73b0\u5982\u4e0b\u5e76\u53d1\u573a\u666f&#xff1a;<\/p>\n<li>\u8bfb\u7ebf\u7a0b\u6b63\u5728\u8bbf\u95ee\u54c8\u5e0c\u8868&#xff0c;\u901a\u8fc7 fd \u83b7\u53d6\u5bf9\u5e94\u7684 Connection \u5bf9\u8c61&#xff1b;<\/li>\n<li>\u7ebf\u7a0b\u53d1\u751f\u5207\u6362&#xff0c;\u8c03\u5ea6\u5230\u5199\u7ebf\u7a0b&#xff1b;<\/li>\n<li>\u5199\u7ebf\u7a0b\u6b63\u5728\u5904\u7406\u8be5 fd \u7684\u5199\u4e8b\u4ef6&#xff0c;\u5e76\u4e14\u5728\u5199\u5165\u8fc7\u7a0b\u4e2d\u53d1\u751f\u9519\u8bef&#xff1b;<\/li>\n<li>\u5199\u7ebf\u7a0b\u6267\u884c\u6e05\u7406\u903b\u8f91&#xff0c;\u5220\u9664\u54c8\u5e0c\u8868\u8282\u70b9\u5e76\u91ca\u653e Connection \u5bf9\u8c61&#xff1b;<\/li>\n<li>\u968f\u540e\u7ebf\u7a0b\u518d\u6b21\u5207\u6362\u56de\u8bfb\u7ebf\u7a0b&#xff1b;<\/li>\n<li>\u8bfb\u7ebf\u7a0b\u7ee7\u7eed\u8bbf\u95ee\u5df2\u7ecf\u88ab\u91ca\u653e\u7684 Connection \u5bf9\u8c61&#xff0c;\u4ece\u800c\u5bfc\u81f4\u975e\u6cd5\u5185\u5b58\u8bbf\u95ee&#xff08;use-after-free&#xff09;\u3002<\/li>\n<hr \/>\n<p>\u6709\u4e9b\u8bfb\u8005\u53ef\u80fd\u4f1a\u60f3\u5230\u8fd9\u6837\u4e00\u79cd\u89e3\u51b3\u65b9\u6848\u3002<\/p>\n<p>\u6839\u636e\u4e4b\u524d\u7684\u8bbe\u8ba1&#xff0c;\u5199\u7ebf\u7a0b\u5728\u5904\u7406\u5199\u4e8b\u4ef6\u65f6&#xff0c;\u5176\u52a0\u9501\u6d41\u7a0b\u5927\u81f4\u5982\u4e0b&#xff1a;<\/p>\n<li>\u5148\u7ade\u4e89\u5168\u5c40\u54c8\u5e0c\u9501&#xff1b;<\/li>\n<li>\u6839\u636e fd \u83b7\u53d6 Connection \u6307\u9488&#xff1b;<\/li>\n<li>\u91ca\u653e\u54c8\u5e0c\u9501&#xff1b;<\/li>\n<li>\u518d\u83b7\u53d6 Connection \u5185\u90e8\u9501&#xff08;\u5c0f\u9501&#xff09;&#xff1b;<\/li>\n<li>\u5b8c\u6210\u5199\u4e8b\u4ef6\u5904\u7406\u3002<\/li>\n<p>\u800c\u5728\u6267\u884c\u6e05\u7406\u64cd\u4f5c\u65f6&#xff0c;\u5199\u7ebf\u7a0b\u7684\u9501\u64cd\u4f5c\u987a\u5e8f\u5982\u4e0b&#xff1a;<\/p>\n<li>\u5148\u91ca\u653e Connection \u5c0f\u9501&#xff1b;<\/li>\n<li>\u518d\u7ade\u4e89\u5168\u5c40\u54c8\u5e0c\u9501&#xff1b;<\/li>\n<li>\u5220\u9664\u54c8\u5e0c\u8868\u8282\u70b9\u5e76\u91ca\u653e Connection \u5bf9\u8c61&#xff1b;<\/li>\n<li>\u6700\u540e\u91ca\u653e\u54c8\u5e0c\u9501\u3002<\/li>\n<p>\u8fd9\u91cc\u9700\u8981\u7279\u522b\u8bf4\u660e\u4e00\u70b9&#xff1a;\u5199\u7ebf\u7a0b\u5728\u6e05\u7406\u9636\u6bb5\u5fc5\u987b\u5148\u91ca\u653e Connection \u5c0f\u9501\u3002\u5982\u679c\u5728\u5220\u9664 Connection \u5bf9\u8c61\u4e4b\u540e\u518d\u91ca\u653e\u8be5\u9501&#xff0c;\u5c31\u4f1a\u5bf9\u5df2\u7ecf\u91ca\u653e\u7684\u5185\u5b58\u8fdb\u884c\u8bbf\u95ee&#xff0c;\u4ece\u800c\u5bfc\u81f4\u672a\u5b9a\u4e49\u884c\u4e3a\u3002<\/p>\n<p>\u56e0\u6b64&#xff0c;\u6574\u4f53\u52a0\u9501\u6d41\u7a0b\u5927\u81f4\u5982\u4e0b&#xff1a;<\/p>\n<p>\u8bfb\u7ebf\u7a0b&#xff1a;\u54c8\u5e0c\u9501 \u2192 \u83b7\u53d6\u6307\u9488 \u2192 conn<span class=\"token operator\">-&gt;<\/span>mtx \u2192 \u91ca\u653e\u54c8\u5e0c\u9501 \u2192 \u5de5\u4f5c\u4e2d \u2192 \u91ca\u653e conn<span class=\"token operator\">-&gt;<\/span>mtx<br \/>\n\u5199\u7ebf\u7a0b&#xff1a;\u54c8\u5e0c\u9501 \u2192 \u83b7\u53d6\u6307\u9488 \u2192 \u91ca\u653e\u54c8\u5e0c\u9501 \u2192 conn<span class=\"token operator\">-&gt;<\/span>mtx \u2192 \u5de5\u4f5c<\/p>\n<p>\u867d\u7136\u8bfb\u7ebf\u7a0b\u548c\u5199\u7ebf\u7a0b\u90fd\u4f1a\u7ade\u4e89\u5168\u5c40\u9501\u548c\u8fde\u63a5\u9501&#xff0c;\u4f46\u8fd9\u91cc\u4e0d\u4f1a\u4ea7\u751f\u6b7b\u9501\u3002\u8fd9\u662f\u56e0\u4e3a\u6b7b\u9501\u901a\u5e38\u9700\u8981\u6ee1\u8db3\u591a\u4e2a\u5fc5\u8981\u6761\u4ef6&#xff0c;\u5176\u4e2d\u4e00\u4e2a\u5173\u952e\u6761\u4ef6\u662f&#xff1a;<\/p>\n<p>\u591a\u4e2a\u7ebf\u7a0b\u4ee5\u76f8\u53cd\u987a\u5e8f\u83b7\u53d6\u76f8\u540c\u7684\u4e24\u628a\u9501\u3002<\/p>\n<p>\u800c\u5728\u5f53\u524d\u8bbe\u8ba1\u4e2d&#xff0c;\u5199\u7ebf\u7a0b\u4f1a\u4e3b\u52a8\u91ca\u653e\u5176\u4e2d\u4e00\u628a\u9501&#xff0c;\u4ece\u800c\u7834\u574f\u6b7b\u9501\u4ea7\u751f\u6240\u9700\u7684\u6761\u4ef6&#xff0c;\u56e0\u6b64\u4e0d\u4f1a\u5f62\u6210\u6b7b\u9501\u3002<\/p>\n<hr \/>\n<p>\u57fa\u4e8e\u4e0a\u8ff0\u5206\u6790&#xff0c;\u6709\u4e9b\u8bfb\u8005\u53ef\u80fd\u4f1a\u63d0\u51fa\u4e00\u4e2a\u6539\u8fdb\u601d\u8def&#xff1a;<\/p>\n<p>\u8bfb\u7ebf\u7a0b\u5728\u8bbf\u95ee Connection \u65f6&#xff0c;\u53ef\u4ee5\u5148\u83b7\u53d6\u5168\u5c40\u54c8\u5e0c\u9501&#xff0c;\u7136\u540e\u5728\u54c8\u5e0c\u9501\u4fdd\u62a4\u8303\u56f4\u5185\u518d\u83b7\u53d6 Connection \u5c0f\u9501&#xff0c;\u968f\u540e\u91ca\u653e\u54c8\u5e0c\u9501\u3002<\/p>\n<p>\u8fd9\u6837\u4e00\u6765&#xff0c;\u5f53\u5199\u7ebf\u7a0b\u5c1d\u8bd5\u5904\u7406\u5199\u4e8b\u4ef6\u65f6&#xff0c;\u5fc5\u987b\u5148\u83b7\u53d6 Connection \u5c0f\u9501&#xff0c;\u800c\u8be5\u9501\u5df2\u7ecf\u88ab\u8bfb\u7ebf\u7a0b\u6301\u6709&#xff0c;\u56e0\u6b64\u5199\u7ebf\u7a0b\u4f1a\u88ab\u963b\u585e\u3002<\/p>\n<p>\u7531\u4e8e\u8be5\u9501\u53ea\u4fdd\u62a4\u5f53\u524d Connection \u5bf9\u8c61&#xff0c;\u56e0\u6b64\u4e0d\u4f1a\u5f71\u54cd\u5176\u4ed6\u8fde\u63a5\u7684\u5904\u7406&#xff0c;\u4e5f\u4e0d\u4f1a\u963b\u585e\u5176\u4ed6\u8bfb\u7ebf\u7a0b\u6216\u5199\u7ebf\u7a0b\u3002<\/p>\n<p>\u8868\u9762\u4e0a\u770b&#xff0c;\u8fd9\u4f3c\u4e4e\u662f\u4e00\u79cd\u5408\u7406\u7684\u65b9\u6848\u3002<\/p>\n<hr \/>\n<p>\u7136\u800c&#xff0c;\u8fd9\u79cd\u65b9\u6848\u5b9e\u9645\u4e0a\u4ecd\u7136\u5b58\u5728\u95ee\u9898\u3002<\/p>\n<p>\u9996\u5148\u662f\u6548\u7387\u95ee\u9898\u3002\u5982\u679c\u8bfb\u7ebf\u7a0b\u6301\u6709 Connection \u9501\u7684\u65f6\u95f4\u8f83\u957f&#xff0c;\u5c31\u4f1a\u963b\u585e\u5199\u7ebf\u7a0b\u5bf9\u8be5\u8fde\u63a5\u7684\u5199\u4e8b\u4ef6\u5904\u7406\u3002\u8fd9\u6837\u4e0d\u4ec5\u4f1a\u5ef6\u8fdf\u5f53\u524d fd \u7684\u53d1\u9001\u8fc7\u7a0b&#xff0c;\u8fd8\u4f1a\u5f71\u54cd\u5199\u7ebf\u7a0b\u540e\u7eed\u5904\u7406\u5176\u4ed6 fd \u7684\u5199\u4e8b\u4ef6\u3002<\/p>\n<p>\u4f46\u66f4\u5173\u952e\u7684\u95ee\u9898\u5176\u5b9e\u662f\u5b89\u5168\u6027\u95ee\u9898\u3002<\/p>\n<p>\u9700\u8981\u91cd\u70b9\u5173\u6ce8\u5199\u7ebf\u7a0b\u7684\u6e05\u7406\u9636\u6bb5\u3002\u8003\u8651\u5982\u4e0b\u6267\u884c\u65f6\u5e8f&#xff1a;<\/p>\n<li>\u8bfb\u7ebf\u7a0b\u9996\u5148\u83b7\u53d6\u5168\u5c40\u54c8\u5e0c\u9501&#xff1b;<\/li>\n<li>\u8bfb\u7ebf\u7a0b\u901a\u8fc7 fd \u83b7\u53d6 Connection \u6307\u9488&#xff1b;<\/li>\n<li>\u8bfb\u7ebf\u7a0b\u5c1d\u8bd5\u83b7\u53d6 conn-&gt;mtx&#xff0c;\u4f46\u6b64\u65f6\u8be5\u9501\u88ab\u5199\u7ebf\u7a0b\u6301\u6709&#xff1b;<\/li>\n<li>\u5199\u7ebf\u7a0b\u6b63\u5728\u6267\u884c\u6e05\u7406\u903b\u8f91&#xff1b;<\/li>\n<li>\u5199\u7ebf\u7a0b\u91ca\u653e conn-&gt;mtx&#xff1b;<\/li>\n<li>\u5199\u7ebf\u7a0b\u968f\u540e\u5c1d\u8bd5\u83b7\u53d6\u54c8\u5e0c\u9501&#xff1b;<\/li>\n<li>\u6b64\u65f6\u8bfb\u7ebf\u7a0b\u6210\u529f\u83b7\u53d6 conn-&gt;mtx&#xff0c;\u968f\u540e\u91ca\u653e\u54c8\u5e0c\u9501&#xff1b;<\/li>\n<li>\u5199\u7ebf\u7a0b\u83b7\u5f97\u54c8\u5e0c\u9501\u5e76\u5220\u9664 Connection \u5bf9\u8c61\u3002<\/li>\n<p>\u6267\u884c\u987a\u5e8f\u53ef\u4ee5\u8868\u793a\u4e3a&#xff1a;<\/p>\n<p>\u8bfb\u7ebf\u7a0b&#xff1a;\u54c8\u5e0c\u9501 \u2192 \u53d6\u6307\u9488 \u2192 conn<span class=\"token operator\">-&gt;<\/span>mtx \u2192 \u91ca\u653e\u54c8\u5e0c\u9501 \u2192 \u5de5\u4f5c\u4e2d<span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><br \/>\n\u5199\u7ebf\u7a0b&#xff1a;\u91ca\u653e conn<span class=\"token operator\">-&gt;<\/span>mtx \u2192 \u7b49\u5f85\u54c8\u5e0c\u9501 \u2192 \u62ff\u5230\u54c8\u5e0c\u9501 \u2192 <span class=\"token keyword\">delete<\/span> conn \u2192 \u91ca\u653e\u54c8\u5e0c\u9501<\/p>\n<p>\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b&#xff0c;\u8bfb\u7ebf\u7a0b\u5df2\u7ecf\u6301\u6709 conn-&gt;mtx \u5e76\u7ee7\u7eed\u8bbf\u95ee Connection \u5bf9\u8c61&#xff0c;\u800c\u5199\u7ebf\u7a0b\u968f\u540e\u5220\u9664\u4e86\u8be5\u5bf9\u8c61\u3002\u8fd9\u5c31\u4f1a\u5bfc\u81f4\u8bfb\u7ebf\u7a0b\u8bbf\u95ee\u5df2\u7ecf\u88ab\u91ca\u653e\u7684\u5185\u5b58&#xff0c;\u4ece\u800c\u4ea7\u751f\u975e\u6cd5\u5185\u5b58\u8bbf\u95ee\u95ee\u9898\u3002<\/p>\n<p>\u56e0\u6b64&#xff0c;\u4ec5\u4ec5\u901a\u8fc7\u8c03\u6574\u9501\u7684\u83b7\u53d6\u987a\u5e8f&#xff0c;\u5e76\u4e0d\u80fd\u5f7b\u5e95\u89e3\u51b3 Connection \u751f\u547d\u5468\u671f\u4e0e\u5e76\u53d1\u8bbf\u95ee\u4e4b\u95f4\u7684\u51b2\u7a81\u95ee\u9898\u3002<\/p>\n<hr \/>\n<p>\u6240\u4ee5\u8fd9\u91cc\u5c31\u9700\u8981\u5f15\u5165 shared_ptr \u667a\u80fd\u6307\u9488\u3002\u90a3\u4e48\u6b64\u65f6\u54c8\u5e0c\u8868\u4e2d\u7684\u8282\u70b9\u4e0d\u518d\u662f\u88f8\u6307\u9488&#xff0c;\u800c\u662f\u7531 shared_ptr \u8fdb\u884c\u7ba1\u7406\u3002shared_ptr \u5185\u90e8\u7ef4\u62a4\u4e00\u4e2a\u5f15\u7528\u8ba1\u6570&#xff0c;\u5176\u62f7\u8d1d\u6784\u9020\u672c\u8d28\u4e0a\u662f\u201c\u6d45\u62f7\u8d1d\u201d&#xff0c;\u591a\u4e2a shared_ptr \u5b9e\u4f8b\u5171\u540c\u6307\u5411\u540c\u4e00\u5757\u5185\u5b58\u533a\u57df&#xff1b;\u5728\u62f7\u8d1d\u65f6&#xff0c;\u4f1a\u5148\u5bf9\u5f15\u7528\u8ba1\u6570\u8fdb\u884c\u9012\u589e\u3002\u800c\u5728\u6790\u6784\u65f6&#xff0c;\u4f1a\u5148\u5bf9\u5f15\u7528\u8ba1\u6570\u8fdb\u884c\u9012\u51cf&#xff0c;\u53ea\u6709\u5f53\u5f15\u7528\u8ba1\u6570\u4e3a 0 \u65f6&#xff0c;\u624d\u4f1a\u771f\u6b63\u91ca\u653e\u6240\u7ba1\u7406\u7684\u5bf9\u8c61\u3002<\/p>\n<p>std<span class=\"token double-colon punctuation\">::<\/span>unordered_map<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token punctuation\">,<\/span>std<span class=\"token double-colon punctuation\">::<\/span>shared_ptr<span class=\"token operator\">&lt;<\/span>Connection<span class=\"token operator\">&gt;&gt;<\/span> send_queues<span class=\"token punctuation\">;<\/span><\/p>\n<p>\u56e0\u6b64&#xff0c;\u5bf9\u4e8e\u5199\u7ebf\u7a0b\u800c\u8a00&#xff0c;\u4e0d\u518d\u9700\u8981\u624b\u52a8\u91ca\u653e Connection \u8282\u70b9\u5e76\u5220\u9664\u54c8\u5e0c\u8868\u8282\u70b9&#xff0c;\u800c\u662f\u53ea\u9700\u8c03\u7528 erase \u65b9\u6cd5\u5373\u53ef\u3002\u8be5\u65b9\u6cd5\u4f1a\u89e6\u53d1\u5bf9\u5e94\u5143\u7d20\u7684\u6790\u6784&#xff0c;\u4ece\u800c\u51cf\u5c11 Connection \u5bf9\u8c61\u7684\u5f15\u7528\u8ba1\u6570\u3002\u6362\u8a00\u4e4b&#xff0c;\u5199\u7ebf\u7a0b\u53ea\u9700\u8981\u5173\u6ce8\u54c8\u5e0c\u8868\u7ed3\u6784\u672c\u8eab\u7684\u4e00\u81f4\u6027&#xff08;\u5373\u7ed3\u6784\u662f\u5426\u88ab\u4fee\u6539&#xff09;&#xff0c;\u56e0\u6b64\u53ea\u9700\u8981\u5bf9\u54c8\u5e0c\u8868\u52a0\u9501\u5373\u53ef\u3002<\/p>\n<p>\u4ece\u804c\u8d23\u4e0a\u770b&#xff0c;\u5199\u7ebf\u7a0b\u662f\u201c\u6536\u5c3e\/\u6e05\u7406\u7ebf\u7a0b\u201d&#xff0c;\u5176\u4e0d\u9700\u8981\u5173\u5fc3\u8282\u70b9\u5728\u5176\u4ed6\u7ebf\u7a0b\u4e2d\u662f\u5426\u4ecd\u88ab\u4f7f\u7528\u3002<\/p>\n<hr \/>\n<p>\u800c\u5bf9\u4e8e\u8bfb\u7ebf\u7a0b\u7684 Get_HttpRequest \u51fd\u6570&#xff0c;\u8fd9\u91cc\u4e5f\u4e0d\u518d\u5c1d\u8bd5\u4f7f\u7528\u7ec6\u7c92\u5ea6\u9501&#xff0c;\u800c\u662f\u76f4\u63a5\u4f7f\u7528\u5168\u5c40\u5927\u9501&#xff0c;\u539f\u56e0\u6709\u4e24\u70b9&#xff1a;<\/p>\n<li>\u4fdd\u8bc1\u54c8\u5e0c\u8868\u7ed3\u6784\u7684\u4e00\u81f4\u6027&#xff0c;\u907f\u514d\u5728\u6269\u5bb9\u6216\u5220\u9664\u8fc7\u7a0b\u4e2d\u53d1\u751f\u975e\u6cd5\u5185\u5b58\u8bbf\u95ee&#xff1b;<\/li>\n<li>\u786e\u4fdd\u8282\u70b9\u5b58\u5728\u6027&#xff0c;\u9632\u6b62\u5728\u8bbf\u95ee\u524d\u8be5\u8282\u70b9\u5df2\u88ab\u5199\u7ebf\u7a0b\u5220\u9664\u3002<\/li>\n<p>\u5177\u4f53\u6d41\u7a0b\u662f&#xff1a;\u5148\u52a0\u5927\u9501&#xff0c;\u901a\u8fc7 find \u5224\u65ad\u8282\u70b9\u662f\u5426\u5b58\u5728&#xff1b;\u82e5\u5b58\u5728&#xff0c;\u5219\u83b7\u53d6\u5bf9\u5e94\u7684 shared_ptr&#xff08;\u8fd9\u4e00\u6b65\u4f1a\u589e\u52a0\u5f15\u7528\u8ba1\u6570&#xff09;&#xff1b;\u968f\u540e\u7acb\u5373\u91ca\u653e\u5927\u9501\u3002<\/p>\n<p>\u8fd9\u91cc\u5728\u5927\u9501\u5185\u83b7\u53d6 shared_ptr \u7684\u610f\u4e49\u5728\u4e8e&#xff1a;\u5ef6\u957f Connection \u5bf9\u8c61\u7684\u751f\u547d\u5468\u671f\u3002\u5373\u4f7f\u540e\u7eed\u5199\u7ebf\u7a0b\u5220\u9664\u4e86\u8be5\u8282\u70b9&#xff0c;\u4e5f\u53ea\u662f\u51cf\u5c11\u5f15\u7528\u8ba1\u6570&#xff0c;\u53ea\u8981\u5f53\u524d\u8bfb\u7ebf\u7a0b\u4ecd\u6301\u6709 shared_ptr&#xff0c;\u5bf9\u8c61\u5c31\u4e0d\u4f1a\u88ab\u91ca\u653e\u3002<\/p>\n<hr \/>\n<p>\u63a5\u4e0b\u6765\u8bfb\u7ebf\u7a0b\u4f1a\u6267\u884c\u201c\u62bd\u5e72 TCP \u63a5\u6536\u7f13\u51b2\u533a\u201d\u7684\u64cd\u4f5c&#xff1a;\u5faa\u73af\u8c03\u7528 recv&#xff08;\u975e\u963b\u585e\u6a21\u5f0f&#xff09;&#xff0c;\u76f4\u5230\u8fd4\u56de EAGAIN \u4e3a\u6b62\u3002<\/p>\n<ul>\n<li>\u82e5 recv &lt; 0 \u4e14 errno \u2260 EAGAIN \u2192 \u8fd4\u56de RECV_ERROR<\/li>\n<li>\u82e5 recv &#061;&#061; 0 \u2192 \u8868\u793a\u5bf9\u7aef\u5173\u95ed\u8fde\u63a5&#xff0c;\u8fd4\u56de CLIENT_CLOSE<\/li>\n<li>\u82e5 recv &gt; 0 \u2192 \u5c06\u6570\u636e\u8ffd\u52a0\u5230\u5f53\u524d\u961f\u9996\u8282\u70b9<\/li>\n<\/ul>\n<hr \/>\n<p>\u968f\u540e\u8fdb\u5165 HTTP \u89e3\u6790\u9636\u6bb5&#xff1a;<\/p>\n<p>1. \u89e3\u6790\u8bf7\u6c42\u5934\u9636\u6bb5&#xff08;PARSE_HEADER&#xff09;<\/p>\n<p>\u9996\u5148\u67e5\u627e \\\\r\\\\n\\\\r\\\\n&#xff1a;<\/p>\n<ul>\n<li>\u82e5\u4e0d\u5b58\u5728 \u2192 \u8bf4\u660e\u8bf7\u6c42\u5934\u5c1a\u672a\u63a5\u6536\u5b8c\u6574&#xff0c;\u8fd4\u56de RECV_TIMEOUT<\/li>\n<li>\u82e5\u5b58\u5728 \u2192 \u8bf4\u660e\u8bf7\u6c42\u5934\u5b8c\u6574&#xff0c;\u53ef\u4ee5\u8fdb\u884c\u89e3\u6790<\/li>\n<\/ul>\n<p>\u89e3\u6790\u5185\u5bb9\u5305\u62ec&#xff1a;<\/p>\n<ul>\n<li>\u63d0\u53d6\u8bf7\u6c42\u5934\u5b57\u7b26\u4e32<\/li>\n<li>\u8bb0\u5f55 header_length<\/li>\n<li>\u67e5\u627e Content-Length \u5b57\u6bb5&#xff08;\u5927\u5c0f\u5199\u517c\u5bb9&#xff09;\n<ul>\n<li>\u82e5\u5b58\u5728 \u2192 \u8bbe\u7f6e body_length<\/li>\n<li>\u82e5\u4e0d\u5b58\u5728 \u2192 \u9ed8\u8ba4\u4e3a 0&#xff08;\u901a\u5e38\u4e3a GET \u8bf7\u6c42&#xff09;<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\u7136\u540e\u72b6\u6001\u5207\u6362\u4e3a PARSE_BODY<\/p>\n<hr \/>\n<p>2. \u89e3\u6790\u8bf7\u6c42\u4f53\u9636\u6bb5&#xff08;PARSE_BODY&#xff09;<\/p>\n<p>\u8ba1\u7b97&#xff1a;<\/p>\n<p>remaining &#061; \u5df2\u63a5\u6536\u603b\u957f\u5ea6 &#8211; header_length<\/p>\n<p>\u5206\u60c5\u51b5&#xff1a;<\/p>\n<ul>\n<li>\u82e5 remaining &lt; body_length \u2192 \u8bf7\u6c42\u4f53\u672a\u63a5\u6536\u5b8c\u6574&#xff0c;\u8fd4\u56de RECV_TIMEOUT<\/li>\n<li>\u82e5 remaining &gt;&#061; body_length \u2192 \u8bf7\u6c42\u4f53\u5df2\u5b8c\u6574&#xff1a;\n<ul>\n<li>\u63d0\u53d6\u8bf7\u6c42\u4f53<\/li>\n<li>\u82e5\u5b58\u5728\u591a\u4f59\u6570\u636e&#xff08;\u7c98\u5305&#xff09;&#xff1a;\n<ul>\n<li>\u5c06\u5269\u4f59\u90e8\u5206\u653e\u5165\u65b0\u7684\u961f\u5217\u8282\u70b9&#xff08;\u7528\u4e8e\u4e0b\u4e00\u4e2a\u8bf7\u6c42&#xff09;<\/li>\n<\/ul>\n<\/li>\n<li>\u53cd\u5e8f\u5217\u5316\u4e3a Http_Request \u5bf9\u8c61<\/li>\n<li>\u5f39\u51fa\u5f53\u524d\u8282\u70b9<\/li>\n<li>\u91cd\u7f6e\u89e3\u6790\u72b6\u6001&#xff08;\u652f\u6301 keep-alive \u573a\u666f&#xff09;<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\u8fd9\u91cc\u7279\u522b\u9700\u8981\u5f3a\u8c03\u4e00\u70b9&#xff1a;TCP \u662f\u5b57\u8282\u6d41\u534f\u8bae&#xff0c;\u4e00\u6b21 recv \u53ef\u80fd\u5305\u542b\u591a\u4e2a HTTP \u8bf7\u6c42&#xff0c;\u56e0\u6b64\u5fc5\u987b\u6b63\u786e\u5904\u7406\u201c\u7c98\u5305\u201d\u95ee\u9898\u3002<\/p>\n<p>\u8fd4\u56de\u503c\u8bed\u4e49<\/p>\n<ul>\n<li>RECV_TIMEOUT \u8868\u793a\u5f53\u524d\u672a\u83b7\u53d6\u5b8c\u6574 HTTP \u8bf7\u6c42&#xff0c;\u4ec5\u9700\u91cd\u65b0\u52a0\u5165\u8bfb\u4e8b\u4ef6\u96c6\u5408\u5373\u53ef<\/li>\n<li>RECV_ERROR \u8868\u793a\u8bfb\u53d6\u51fa\u9519\u3002\u6b64\u65f6\u8bfb\u7ebf\u7a0b\u4e0d\u80fd\u76f4\u63a5\u6e05\u7406\u8d44\u6e90&#xff0c;\u800c\u662f&#xff1a;\n<ul>\n<li>\u8bbe\u7f6e\u9519\u8bef\u54cd\u5e94&#xff08;\u5982 502&#xff09;<\/li>\n<li>\u6807\u8bb0 should_close &#061; true<\/li>\n<li>\u4ea4\u7531\u5199\u7ebf\u7a0b\u5b8c\u6210\u6700\u7ec8\u6e05\u7406<\/li>\n<\/ul>\n<\/li>\n<li>CLIENT_CLOSE \u8868\u793a\u5bf9\u7aef\u5173\u95ed\u8fde\u63a5&#xff1a;\n<ul>\n<li>\u6807\u8bb0 should_close &#061; true<\/li>\n<li>\u8f6c\u4ea4\u5199\u7ebf\u7a0b\u6e05\u7406\u53d1\u9001\u961f\u5217\u5e76\u5173\u95ed\u8fde\u63a5<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<hr \/>\n<p>4. \u5173\u4e8e\u9501\u987a\u5e8f&#xff08;\u5173\u952e\u7ec6\u8282&#xff09;<\/p>\n<p>\u8fd9\u91cc\u6709\u4e00\u4e2a\u975e\u5e38\u5173\u952e\u7684\u5e76\u53d1\u7ec6\u8282&#xff1a;\u9501\u7684\u83b7\u53d6\u987a\u5e8f\u5fc5\u987b\u7edf\u4e00&#xff0c;\u5426\u5219\u4f1a\u53d1\u751f\u6b7b\u9501\u3002<\/p>\n<p>\u5f53\u524d\u8bbe\u8ba1\u662f&#xff1a;<\/p>\n<ul>\n<li>\u8bfb\u7ebf\u7a0b&#xff1a;\n<ul>\n<li>\u5148\u52a0\u5927\u9501 \u2192 \u83b7\u53d6 shared_ptr \u2192 \u91ca\u653e\u5927\u9501 \u2192 \u518d\u52a0\u5c0f\u9501<\/li>\n<\/ul>\n<\/li>\n<li>\u5199\u7ebf\u7a0b&#xff1a;\n<ul>\n<li>\u5148\u6301\u6709\u5c0f\u9501 \u2192 \u518d\u5c1d\u8bd5\u52a0\u5927\u9501&#xff08;\u7528\u4e8e erase&#xff09;<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\u5982\u679c\u8bfb\u7ebf\u7a0b\u5728\u6301\u6709\u5927\u9501\u65f6\u518d\u53bb\u83b7\u53d6\u5c0f\u9501&#xff0c;\u5c31\u53ef\u80fd\u5f62\u6210&#xff1a;<\/p>\n<p>\u8bfb\u7ebf\u7a0b&#xff1a;\u6301\u6709\u5927\u9501 \u2192 \u7b49\u5f85\u5c0f\u9501<br \/>\n\u5199\u7ebf\u7a0b&#xff1a;\u6301\u6709\u5c0f\u9501 \u2192 \u7b49\u5f85\u5927\u9501<br \/>\n\u2192 \u6b7b\u9501<\/p>\n<p>\u56e0\u6b64\u8fd9\u91cc\u91c7\u7528\u201c\u8bfb\u7ebf\u7a0b\u5148\u91ca\u653e\u5927\u9501\u518d\u52a0\u5c0f\u9501\u201d\u7684\u7b56\u7565&#xff0c;\u907f\u514d\u9501\u987a\u5e8f\u53cd\u8f6c\u3002<\/p>\n<hr \/>\n<p>\u5f53\u7136&#xff0c;\u4e5f\u53ef\u4ee5\u8c03\u6574\u5199\u7ebf\u7a0b\u7684\u52a0\u9501\u987a\u5e8f&#xff08;\u4f8b\u5982\u5148\u91ca\u653e\u5c0f\u9501\u518d\u83b7\u53d6\u5927\u9501&#xff09;&#xff0c;\u8fd9\u6837\u8bfb\u7ebf\u7a0b\u5c31\u53ef\u4ee5\u5728\u5927\u9501\u5185\u90e8\u83b7\u53d6\u5c0f\u9501\u3002\u4f46\u5f53\u524d\u65b9\u6848\u7684\u4f18\u52bf\u5728\u4e8e&#xff1a;<\/p>\n<p>&#x1f449; \u501f\u52a9 shared_ptr \u7684\u5f15\u7528\u8ba1\u6570\u673a\u5236&#xff0c;\u65e0\u9700\u4f9d\u8d56\u9501\u6765\u4fdd\u8bc1\u5bf9\u8c61\u751f\u547d\u5468\u671f\u5b89\u5168&#xff0c;\u4ece\u800c\u53ef\u4ee5\u4e3b\u52a8\u964d\u4f4e\u9501\u7c92\u5ea6&#xff0c;\u907f\u514d\u6b7b\u9501\u98ce\u9669\u3002<\/p>\n<h3>\u8bfb\u7ebf\u7a0b\u5b9e\u73b0\u7ec6\u8282<\/h3>\n<p>\u90a3\u4e48&#xff0c;\u5f53\u83b7\u53d6\u5230\u4e00\u4e2a\u5b8c\u6574\u7684 HTTP \u8bf7\u6c42\u4e4b\u540e&#xff0c;\u63a5\u4e0b\u6765\u5c31\u8fdb\u5165\u4e1a\u52a1\u903b\u8f91\u5904\u7406\u9636\u6bb5\u3002\u6b64\u65f6\u4f1a\u6839\u636e HTTP \u8bf7\u6c42\u7684\u65b9\u6cd5\u7c7b\u578b\u8fdb\u884c\u5206\u53d1\u5224\u65ad&#xff0c;\u5373\u5224\u65ad\u662f GET \u8bf7\u6c42\u8fd8\u662f POST \u8bf7\u6c42&#xff0c;\u4ece\u800c\u8fdb\u5165\u4e0d\u540c\u7684\u4e1a\u52a1\u5904\u7406\u6d41\u7a0b&#xff0c;\u5206\u522b\u8c03\u7528 Http_Get_Handler \u6216 Http_Post_Handler \u51fd\u6570\u3002\u51fd\u6570\u7684\u8fd4\u56de\u503c\u5373\u4e3a\u6784\u9020\u597d\u7684 HTTP \u54cd\u5e94\u62a5\u6587\u3002<\/p>\n<p>\u968f\u540e\u8fdb\u5165\u54cd\u5e94\u53d1\u9001\u9636\u6bb5\u3002\u9996\u5148\u4ecd\u7136\u9700\u8981\u52a0\u5168\u5c40\u54c8\u5e0c\u9501&#xff0c;\u68c0\u67e5\u5f53\u524d\u8282\u70b9\u662f\u5426\u5b58\u5728&#xff1b;\u82e5\u5b58\u5728&#xff0c;\u5219\u521b\u5efa\u4e00\u4e2a shared_ptr \u6307\u5411\u5bf9\u5e94\u7684 Connection \u5bf9\u8c61&#xff0c;\u4ece\u800c\u589e\u52a0\u5f15\u7528\u8ba1\u6570&#xff0c;\u7136\u540e\u91ca\u653e\u5168\u5c40\u9501\u3002\u63a5\u7740\u52a0 Connection \u5bf9\u8c61\u7684\u5c0f\u9501&#xff0c;\u5c06\u54cd\u5e94\u62a5\u6587\u653e\u5165\u53d1\u9001\u961f\u5217 out_buffer \u4e2d\u3002<\/p>\n<p>\u4e4b\u540e\u9700\u8981\u6839\u636e\u8bf7\u6c42\u5934\u4e2d\u7684 Connection \u5b57\u6bb5\u5224\u65ad\u8fde\u63a5\u751f\u547d\u5468\u671f&#xff1a;<\/p>\n<ul>\n<li>\u82e5\u4e3a close&#xff0c;\u5219\u8bf4\u660e\u5f53\u524d\u8bf7\u6c42\u4e3a\u8be5\u8fde\u63a5\u7684\u6700\u540e\u4e00\u4e2a\u8bf7\u6c42&#xff0c;\u540e\u7eed\u4e0d\u4f1a\u518d\u6709\u65b0\u7684\u8bf7\u6c42\u62a5\u6587&#xff0c;\u6b64\u65f6\u76f4\u63a5\u5c06 should_close \u6807\u5fd7\u4f4d\u7f6e\u4e3a true&#xff1b;<\/li>\n<li>\u82e5\u4e0d\u4e3a close&#xff0c;\u5219\u8868\u793a\u8fde\u63a5\u903b\u8f91\u4e0a\u4ecd\u7136\u4fdd\u6301&#xff0c;\u4f46\u4e0d\u610f\u5473\u7740\u5ba2\u6237\u7aef\u4e00\u5b9a\u8fd8\u4f1a\u7ee7\u7eed\u53d1\u9001\u8bf7\u6c42\u3002<\/li>\n<\/ul>\n<hr \/>\n<p>\u8fd9\u91cc\u9700\u8981\u91cd\u70b9\u5173\u6ce8\u4e00\u4e2a\u5178\u578b\u573a\u666f&#xff1a;<\/p>\n<p>\u5ba2\u6237\u7aef\u5728\u4e00\u4e2a TCP \u957f\u8fde\u63a5\u4e2d\u8fde\u7eed\u53d1\u9001\u8bf7\u6c42 A\u3001B\u3001C&#xff0c;\u968f\u540e\u4e0d\u518d\u53d1\u9001\u4efb\u4f55\u8bf7\u6c42&#xff0c;\u5e76\u4e3b\u52a8\u5173\u95ed\u8fde\u63a5\u3002\u800c\u670d\u52a1\u7aef\u5728\u5904\u7406\u8be5 fd \u7684\u8bfb\u4e8b\u4ef6\u65f6&#xff0c;\u4f1a\u201c\u62bd\u5e72\u201d TCP \u63a5\u6536\u7f13\u51b2\u533a&#xff0c;\u5c06 A\u3001B\u3001C \u4e09\u4e2a\u8bf7\u6c42\u5168\u90e8\u8ffd\u52a0\u5230 in_buffer \u961f\u9996\u8282\u70b9\u4e2d\u3002<\/p>\n<p>\u6b64\u65f6\u8bfb\u7ebf\u7a0b\u89e3\u6790\u51fa\u7b2c\u4e00\u4e2a\u5b8c\u6574\u8bf7\u6c42 A&#xff0c;\u5b8c\u6210\u4e1a\u52a1\u5904\u7406\u5e76\u751f\u6210\u54cd\u5e94&#xff0c;\u7136\u540e\u5c06\u8be5 fd \u6dfb\u52a0\u5230\u8bfb\/\u5199\u96c6\u5408\u4e2d&#xff0c;\u4ea4\u7531\u5199\u7ebf\u7a0b\u53d1\u9001\u54cd\u5e94\u3002<\/p>\n<p>\u4f46\u662f\u6b64\u65f6\u5ba2\u6237\u7aef\u5df2\u7ecf\u4e0d\u4f1a\u518d\u53d1\u9001\u65b0\u7684\u8bf7\u6c42\u62a5\u6587&#xff0c;\u8fd9\u4f1a\u5bfc\u81f4&#xff1a;<\/p>\n<ul>\n<li>\u4e3b\u7ebf\u7a0b\u4e0d\u4f1a\u518d\u68c0\u6d4b\u5230\u8be5 fd \u7684\u8bfb\u4e8b\u4ef6&#xff08;\u56e0\u4e3a\u6ca1\u6709\u65b0\u6570\u636e\u5230\u8fbe&#xff09;<\/li>\n<li>Connection \u5bf9\u8c61\u6301\u7eed\u5b58\u5728&#xff08;\u672a\u89e6\u53d1\u91ca\u653e\u6761\u4ef6&#xff09;<\/li>\n<li>in_buffer \u4e2d\u6b8b\u7559\u7684\u8bf7\u6c42 B\u3001C \u65e0\u6cd5\u88ab\u7ee7\u7eed\u5904\u7406<\/li>\n<\/ul>\n<p>\u6700\u7ec8\u53ef\u80fd\u5bfc\u81f4**\u903b\u8f91\u4e0a\u7684\u201c\u5185\u5b58\u6ede\u7559\u201d&#xff08;\u7c7b\u4f3c\u6cc4\u6f0f&#xff09;**\u4ee5\u53ca\u8bf7\u6c42\u79ef\u538b\u3002<\/p>\n<hr \/>\n<p>\u4e3a\u907f\u514d\u4e0a\u8ff0\u95ee\u9898&#xff0c;\u8bfb\u7ebf\u7a0b\u5728\u5904\u7406\u5b8c\u4e00\u4e2a\u8bf7\u6c42\u540e&#xff0c;\u4e0d\u80fd\u4ec5\u4ec5\u5c06 fd \u52a0\u5165\u5199\u96c6\u5408&#xff0c;\u8fd8\u9700\u8981\u4e3b\u52a8\u68c0\u67e5\u63a5\u6536\u961f\u5217\u72b6\u6001&#xff1a;<\/p>\n<ul>\n<li>\u82e5 Connection \u672a\u5173\u95ed&#xff08;should_close &#061;&#061; false&#xff09;&#xff0c;\u4e14 in_buffer \u961f\u9996\u4ecd\u5b58\u5728\u672a\u5904\u7406\u6570\u636e&#xff08;\u5373\u8fd8\u6709\u540e\u7eed\u8bf7\u6c42&#xff09;&#xff0c;\u5219&#xff1a;\n<ul>\n<li>\u9700\u8981\u4e3b\u52a8\u521b\u5efa\u65b0\u7684\u4efb\u52a1\u5bf9\u8c61 Task<\/li>\n<li>\u5c06\u5176\u6295\u9012\u5230\u7ebf\u7a0b\u6c60&#xff08;\u73af\u5f62\u7f13\u51b2\u533a&#xff09;<\/li>\n<li>\u7531\u5176\u4ed6\u8bfb\u7ebf\u7a0b\u7ee7\u7eed\u5904\u7406\u5269\u4f59\u8bf7\u6c42<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\u4e5f\u5c31\u662f\u8bf4&#xff0c;\u8fd9\u91cc\u4ece\u201c\u4e8b\u4ef6\u9a71\u52a8\u201d\u8f6c\u4e3a\u201c\u4e8b\u4ef6 &#043; \u4e3b\u52a8\u8c03\u5ea6\u201d\u7684\u6df7\u5408\u6a21\u578b&#xff0c;\u4ee5\u907f\u514d\u957f\u8fde\u63a5\u573a\u666f\u4e0b\u7684\u8bf7\u6c42\u6ede\u7559\u3002<\/p>\n<hr \/>\n<p>\u4f46\u662f\u8fd9\u91cc\u5b58\u5728\u4e00\u4e2a\u5173\u952e\u7684\u5e76\u53d1\u9677\u9631&#xff1a;<\/p>\n<p>\u8bfb\u7ebf\u7a0b\u5f53\u524d\u662f\u6301\u6709 Connection \u5c0f\u9501\u7684&#xff0c;\u800c\u4efb\u52a1\u6295\u9012&#xff08;push \u5230\u7ebf\u7a0b\u6c60\u961f\u5217&#xff09;\u662f\u4e00\u4e2a\u5171\u4eab\u8d44\u6e90\u64cd\u4f5c&#xff08;\u8bfb\u7ebf\u7a0b\u4ee5\u53ca\u4e3b\u7ebf\u7a0b\u90fd\u4f1apush&#xff09;&#xff0c;\u4f1a\u6d89\u53ca\u9501\u7ade\u4e89\u3002\u5982\u679c\u5728\u6301\u9501\u72b6\u6001\u4e0b\u8fdb\u884c push&#xff1a;<\/p>\n<ul>\n<li>\u4e00\u65e6\u7ebf\u7a0b\u6c60\u961f\u5217\u9501\u7ade\u4e89\u5931\u8d25&#xff0c;\u8bfb\u7ebf\u7a0b\u4f1a\u963b\u585e<\/li>\n<li>\u800c\u8bfb\u7ebf\u7a0b\u6b64\u65f6\u6301\u6709 Connection \u9501<\/li>\n<li>\u5199\u7ebf\u7a0b\u53ef\u80fd\u6b63\u7b49\u5f85\u8be5\u9501\u4ee5\u5904\u7406\u53d1\u9001\u4e8b\u4ef6<\/li>\n<\/ul>\n<p>\u4ece\u800c\u5bfc\u81f4\u5199\u7ebf\u7a0b\u88ab\u957f\u65f6\u95f4\u963b\u585e&#xff0c;\u751a\u81f3\u5f71\u54cd\u5f53\u524d\u4ee5\u53ca\u5176\u4ed6 fd \u7684\u5199\u4e8b\u4ef6\u5904\u7406<\/p>\n<hr \/>\n<p>\u56e0\u6b64\u8fd9\u91cc\u5fc5\u987b\u4e25\u683c\u9075\u5b88&#xff1a;<\/p>\n<p>&#x1f449; \u5728 push \u4efb\u52a1\u4e4b\u524d&#xff0c;\u5fc5\u987b\u91ca\u653e Connection \u5c0f\u9501<\/p>\n<p>\u540c\u65f6\u6ce8\u610f&#xff1a;<\/p>\n<ul>\n<li>\u5c0f\u9501\u7684\u4f5c\u7528\u4ec5\u9650\u4e8e&#xff1a;\n<ul>\n<li>\u5411 out_buffer \u5199\u5165\u54cd\u5e94<\/li>\n<li>\u4fee\u6539 should_close \u6807\u5fd7\u4f4d<\/li>\n<\/ul>\n<\/li>\n<li>\u800c\u4efb\u52a1\u6295\u9012\u53d1\u751f\u5728\u4e0a\u8ff0\u64cd\u4f5c\u4e4b\u540e&#xff0c;\u56e0\u6b64\u63d0\u524d\u91ca\u653e\u5c0f\u9501\u662f\u5b89\u5168\u7684<\/li>\n<\/ul>\n<p>\u6b64\u5916&#xff0c;\u5728\u91ca\u653e\u9501\u4e4b\u524d&#xff0c;\u8fd8\u9700\u8981\u786e\u4fdd&#xff1a;<\/p>\n<ul>\n<li>\u5df2\u5c06 fd \u52a0\u5165\u5199\u96c6\u5408&#xff08;\u4fdd\u8bc1\u54cd\u5e94\u53ef\u4ee5\u88ab\u53d1\u9001&#xff09;<\/li>\n<\/ul>\n<hr \/>\n<p>\u53e6\u4e00\u79cd\u60c5\u51b5\u662f&#xff1a;<\/p>\n<ul>\n<li>Connection \u672a\u5173\u95ed<\/li>\n<li>\u4e14 in_buffer \u5df2\u4e3a\u7a7a<\/li>\n<\/ul>\n<p>\u8bf4\u660e\u5f53\u524d\u573a\u666f\u662f\u5178\u578b\u7684\u201c\u8bf7\u6c42-\u54cd\u5e94\u4e32\u884c\u6a21\u578b\u201d&#xff1a;<\/p>\n<p>\u5ba2\u6237\u7aef\u53d1\u9001\u4e00\u4e2a\u8bf7\u6c42 \u2192 \u7b49\u5f85\u54cd\u5e94 \u2192 \u518d\u53d1\u9001\u4e0b\u4e00\u4e2a\u8bf7\u6c42<\/p>\n<p>\u6b64\u65f6\u65e0\u9700\u4e3b\u52a8\u8c03\u5ea6\u4efb\u52a1&#xff0c;\u53ea\u9700&#xff1a;<\/p>\n<ul>\n<li>\u5c06 fd \u540c\u65f6\u52a0\u5165\u8bfb\u96c6\u5408\u548c\u5199\u96c6\u5408<\/li>\n<li>\u7b49\u5f85\u540e\u7eed\u4e8b\u4ef6\u9a71\u52a8\u5373\u53ef<\/li>\n<\/ul>\n<p><span class=\"token keyword\">void<\/span> <span class=\"token class-name\">Task<\/span><span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">run<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n     Http_Request hr<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">int<\/span> get_result <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">Get_HttpRequest<\/span><span class=\"token punctuation\">(<\/span>socketfd<span class=\"token punctuation\">,<\/span> hr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>get_result <span class=\"token operator\">!&#061;<\/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\">if<\/span><span class=\"token punctuation\">(<\/span>get_result <span class=\"token operator\">&#061;&#061;<\/span> RECV_TIMEOUT<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                 send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">lock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                  <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>send_queues<span class=\"token punctuation\">.<\/span><span class=\"token function\">find<\/span><span class=\"token punctuation\">(<\/span>socketfd<span class=\"token punctuation\">)<\/span><span class=\"token operator\">&#061;&#061;<\/span>send_queues<span class=\"token punctuation\">.<\/span><span class=\"token function\">end<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><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 punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n              std<span class=\"token double-colon punctuation\">::<\/span>shared_ptr<span class=\"token operator\">&lt;<\/span>Connection<span class=\"token operator\">&gt;<\/span> conn<span class=\"token operator\">&#061;<\/span>send_queues<span class=\"token punctuation\">[<\/span>socketfd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            conn<span class=\"token operator\">-&gt;<\/span>mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">lock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            read_manager<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">add_fd<\/span><span class=\"token punctuation\">(<\/span>socketfd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            conn<span class=\"token operator\">-&gt;<\/span>mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            last_active_time<span class=\"token punctuation\">[<\/span>socketfd<span class=\"token punctuation\">]<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token function\">time<\/span><span class=\"token punctuation\">(<\/span><span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">return<\/span><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>get_result <span class=\"token operator\">&#061;&#061;<\/span> CLIENT_CLOSE<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">lock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>send_queues<span class=\"token punctuation\">.<\/span><span class=\"token function\">find<\/span><span class=\"token punctuation\">(<\/span>socketfd<span class=\"token punctuation\">)<\/span><span class=\"token operator\">&#061;&#061;<\/span>send_queues<span class=\"token punctuation\">.<\/span><span class=\"token function\">end<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token punctuation\">{<\/span><br \/>\n                    send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><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 punctuation\">;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><br \/>\n                std<span class=\"token double-colon punctuation\">::<\/span>shared_ptr<span class=\"token operator\">&lt;<\/span>Connection<span class=\"token operator\">&gt;<\/span> conn<span class=\"token operator\">&#061;<\/span>send_queues<span class=\"token punctuation\">[<\/span>socketfd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                conn<span class=\"token operator\">-&gt;<\/span>mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">lock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                read_manager<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">del_fd<\/span><span class=\"token punctuation\">(<\/span>socketfd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                conn<span class=\"token operator\">-&gt;<\/span>should_close<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">true<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                write_manager<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">add_fd<\/span><span class=\"token punctuation\">(<\/span>socketfd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                conn<span class=\"token operator\">-&gt;<\/span>mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><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 punctuation\">;<\/span><\/p>\n<p>            <span class=\"token punctuation\">}<\/span><br \/>\n            lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>Fatal<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;get http request error&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">lock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>send_queues<span class=\"token punctuation\">.<\/span><span class=\"token function\">find<\/span><span class=\"token punctuation\">(<\/span>socketfd<span class=\"token punctuation\">)<\/span><span class=\"token operator\">&#061;&#061;<\/span>send_queues<span class=\"token punctuation\">.<\/span><span class=\"token function\">end<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><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 punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>shared_ptr<span class=\"token operator\">&lt;<\/span>Connection<span class=\"token operator\">&gt;<\/span> conn<span class=\"token operator\">&#061;<\/span>send_queues<span class=\"token punctuation\">[<\/span>socketfd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n           send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n           conn<span class=\"token operator\">-&gt;<\/span>mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">lock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n           hr<span class=\"token punctuation\">.<\/span>headers<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;Connection&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Close&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n           conn<span class=\"token operator\">-&gt;<\/span>out_buffer<span class=\"token punctuation\">.<\/span><span class=\"token function\">push<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">process_bad_request<\/span><span class=\"token punctuation\">(<\/span>hr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n           conn<span class=\"token operator\">-&gt;<\/span>should_close<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">true<\/span><span class=\"token punctuation\">;<\/span><br \/>\n           read_manager<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">del_fd<\/span><span class=\"token punctuation\">(<\/span>socketfd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n           write_manager<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">add_fd<\/span><span class=\"token punctuation\">(<\/span>socketfd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n           conn<span class=\"token operator\">-&gt;<\/span>mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><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 punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>string res<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>hr<span class=\"token punctuation\">.<\/span>method <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;GET&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            res <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">Http_Get_Handler<\/span><span class=\"token punctuation\">(<\/span>hr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/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>hr<span class=\"token punctuation\">.<\/span>method <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;POST&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            res <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">Http_Post_Handler<\/span><span class=\"token punctuation\">(<\/span>hr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token keyword\">else<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>warning<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;unsupported method:%s&#034;<\/span><span class=\"token punctuation\">,<\/span> hr<span class=\"token punctuation\">.<\/span>method<span class=\"token punctuation\">.<\/span><span class=\"token function\">c_str<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">lock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>send_queues<span class=\"token punctuation\">.<\/span><span class=\"token function\">find<\/span><span class=\"token punctuation\">(<\/span>socketfd<span class=\"token punctuation\">)<\/span><span class=\"token operator\">&#061;&#061;<\/span>send_queues<span class=\"token punctuation\">.<\/span><span class=\"token function\">end<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><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 punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n           std<span class=\"token double-colon punctuation\">::<\/span>shared_ptr<span class=\"token operator\">&lt;<\/span>Connection<span class=\"token operator\">&gt;<\/span> conn<span class=\"token operator\">&#061;<\/span>send_queues<span class=\"token punctuation\">[<\/span>socketfd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n           send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n           conn<span class=\"token operator\">-&gt;<\/span>mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">lock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n           hr<span class=\"token punctuation\">.<\/span>headers<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;Connection&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Close&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n           conn<span class=\"token operator\">-&gt;<\/span>out_buffer<span class=\"token punctuation\">.<\/span><span class=\"token function\">push<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">process_bad_request<\/span><span class=\"token punctuation\">(<\/span>hr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n           conn<span class=\"token operator\">-&gt;<\/span>should_close<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">true<\/span><span class=\"token punctuation\">;<\/span><br \/>\n           write_manager<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">add_fd<\/span><span class=\"token punctuation\">(<\/span>socketfd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n           conn<span class=\"token operator\">-&gt;<\/span>mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><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 punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n         send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">lock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n         <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>send_queues<span class=\"token punctuation\">.<\/span><span class=\"token function\">find<\/span><span class=\"token punctuation\">(<\/span>socketfd<span class=\"token punctuation\">)<\/span><span class=\"token operator\">&#061;&#061;<\/span>send_queues<span class=\"token punctuation\">.<\/span><span class=\"token function\">end<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><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 punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n            std<span class=\"token double-colon punctuation\">::<\/span>shared_ptr<span class=\"token operator\">&lt;<\/span>Connection<span class=\"token operator\">&gt;<\/span> conn<span class=\"token operator\">&#061;<\/span>send_queues<span class=\"token punctuation\">[<\/span>socketfd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            conn<span class=\"token operator\">-&gt;<\/span>mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">lock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n             conn<span class=\"token operator\">-&gt;<\/span>out_buffer<span class=\"token punctuation\">.<\/span><span class=\"token function\">push<\/span><span class=\"token punctuation\">(<\/span>res<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>hr<span class=\"token punctuation\">.<\/span>headers<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;Connection&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token operator\">&#061;&#061;<\/span><span class=\"token string\">&#034;close&#034;<\/span><span class=\"token operator\">||<\/span>hr<span class=\"token punctuation\">.<\/span>headers<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;Connection&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token operator\">&#061;&#061;<\/span><span class=\"token string\">&#034;Close&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n              conn<span class=\"token operator\">-&gt;<\/span>should_close<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">true<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><span class=\"token keyword\">else<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>conn<span class=\"token operator\">-&gt;<\/span>in_buffer<span class=\"token punctuation\">.<\/span><span class=\"token function\">empty<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token operator\">&amp;&amp;<\/span><span class=\"token operator\">!<\/span>conn<span class=\"token operator\">-&gt;<\/span>in_buffer<span class=\"token punctuation\">.<\/span><span class=\"token function\">front<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">empty<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                write_manager<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">add_fd<\/span><span class=\"token punctuation\">(<\/span>socketfd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                conn<span class=\"token operator\">-&gt;<\/span>mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                Task <span class=\"token function\">t<\/span><span class=\"token punctuation\">(<\/span>socketfd<span class=\"token punctuation\">,<\/span>read_manager<span class=\"token punctuation\">,<\/span>write_manager<span class=\"token punctuation\">,<\/span>last_active_time<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                last_active_time<span class=\"token punctuation\">[<\/span>socketfd<span class=\"token punctuation\">]<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token function\">time<\/span><span class=\"token punctuation\">(<\/span><span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                threadpool<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">getinstance<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">push<\/span><span class=\"token punctuation\">(<\/span>t<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><span class=\"token keyword\">else<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                read_manager<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">add_fd<\/span><span class=\"token punctuation\">(<\/span>socketfd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        write_manager<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">add_fd<\/span><span class=\"token punctuation\">(<\/span>socketfd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        conn<span class=\"token operator\">-&gt;<\/span>mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        last_active_time<span class=\"token punctuation\">[<\/span>socketfd<span class=\"token punctuation\">]<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token function\">time<\/span><span class=\"token punctuation\">(<\/span><span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h3>\u8d85\u65f6\u68c0\u6d4b\u7ebf\u7a0b<\/h3>\n<p>\u800c\u8fd9\u91cc\u9700\u8981\u6ce8\u610f\u7684\u662f&#xff0c;\u7531\u4e8e\u5f53\u524d\u573a\u666f\u662f\u9ad8\u5e76\u53d1\u670d\u52a1\u5668&#xff0c;\u670d\u52a1\u5668\u5728\u4efb\u610f\u65f6\u523b\u90fd\u4f1a\u63a5\u6536\u5230\u5927\u91cf\u8fde\u63a5\u4ee5\u53ca\u5bf9\u5e94\u7684\u8bf7\u6c42\u62a5\u6587\u3002\u56e0\u6b64&#xff0c;\u5bf9\u4e8e\u5ba2\u6237\u7aef\u800c\u8a00&#xff0c;\u5176\u884c\u4e3a\u53ef\u80fd\u662f\u8bf7\u6c42-\u54cd\u5e94\u7684\u4e32\u884c\u6a21\u578b&#xff0c;\u800c\u4e0d\u662f\u4e00\u6b21\u6027\u8fde\u7eed\u53d1\u9001\u591a\u4e2a HTTP \u8bf7\u6c42\u3002<\/p>\n<p>\u4e5f\u5c31\u662f\u8bf4&#xff0c;\u5ba2\u6237\u7aef\u5728\u6536\u5230\u54cd\u5e94\u4e4b\u540e&#xff0c;\u5f80\u5f80\u9700\u8981\u8f83\u957f\u65f6\u95f4\u6765\u5b8c\u6210\u81ea\u8eab\u7684\u4e1a\u52a1\u903b\u8f91\u5904\u7406\u3002\u8fdb\u4e00\u6b65\u8003\u8651\u6781\u7aef\u60c5\u51b5&#xff0c;\u5ba2\u6237\u7aef\u751a\u81f3\u53ef\u80fd\u662f\u4e00\u4e2a\u6076\u610f\u5ba2\u6237\u7aef&#xff1a;\u5176\u5728\u63a5\u6536\u5230\u670d\u52a1\u7aef\u8fd4\u56de\u7684\u54cd\u5e94\u62a5\u6587\u540e&#xff0c;\u4e0d\u518d\u53d1\u9001\u540e\u7eed\u8bf7\u6c42&#xff0c;\u4f46\u8fde\u63a5\u4f9d\u7136\u4fdd\u6301\u4e0d\u5173\u95ed\u72b6\u6001\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b&#xff0c;\u5bf9\u4e8e\u4e3b\u7ebf\u7a0b\u800c\u8a00&#xff0c;\u5c06\u65e0\u6cd5\u518d\u68c0\u6d4b\u5230\u8be5 fd \u5bf9\u5e94\u7684\u8bfb\u4e8b\u4ef6\u5c31\u7eea&#xff0c;\u4ece\u800c\u5bfc\u81f4\u8be5\u6587\u4ef6\u63cf\u8ff0\u7b26\u4ee5\u53ca\u5176\u5bf9\u5e94\u7684 Connection \u5bf9\u8c61\u65e0\u6cd5\u88ab\u53ca\u65f6\u6e05\u7406\u3002\u56e0\u6b64&#xff0c;\u8fd9\u91cc\u5c31\u5f15\u51fa\u4e86\u8d85\u65f6\u68c0\u6d4b\u7ebf\u7a0b\u5b58\u5728\u7684\u5fc5\u8981\u6027\u3002<\/p>\n<p>\u90a3\u4e48\u5728\u5b9e\u73b0\u4e0a&#xff0c;\u6211\u4eec\u4f1a\u5728 Poll_Server \u5bf9\u8c61\u4e2d\u5b9a\u4e49\u4e00\u4e2a\u9759\u6001\u6570\u7ec4&#xff0c;\u957f\u5ea6\u4e3a 65535&#xff0c;\u7528\u4e8e\u8986\u76d6\u8fdb\u7a0b\u6587\u4ef6\u63cf\u8ff0\u7b26\u8868\u7684\u4e0a\u9650\u3002\u6570\u7ec4\u7684\u4e0b\u6807\u76f4\u63a5\u5bf9\u5e94 fd\u3002\u6bcf\u5f53\u8bfb\u7ebf\u7a0b\u8bfb\u53d6\u5230\u5b8c\u6574\u7684 HTTP \u8bf7\u6c42&#xff0c;\u5b8c\u6210\u89e3\u6790\u5e76\u6784\u5efa\u54cd\u5e94&#xff0c;\u968f\u540e\u5c06\u54cd\u5e94\u653e\u5165\u53d1\u9001\u961f\u5217\u4e4b\u540e&#xff0c;\u8fd8\u4f1a\u540c\u6b65\u66f4\u65b0\u8be5 fd \u5bf9\u5e94\u7684\u65f6\u95f4\u6233\u3002<\/p>\n<p>\u800c\u5bf9\u4e8e\u8d85\u65f6\u68c0\u6d4b\u7ebf\u7a0b&#xff0c;\u5176\u6838\u5fc3\u6d41\u7a0b\u5982\u4e0b&#xff1a;\u9996\u5148\u83b7\u53d6\u5f53\u524d\u65f6\u95f4\u6233&#xff0c;\u7136\u540e\u83b7\u53d6\u8bfb\u96c6\u5408\u7684\u4e00\u4e2a\u5feb\u7167&#xff08;snapshot&#xff09;\u3002\u4e4b\u6240\u4ee5\u91c7\u7528\u5feb\u7167&#xff0c;\u662f\u56e0\u4e3a\u8d85\u65f6\u7ebf\u7a0b\u4f1a\u4e0e\u4e3b\u7ebf\u7a0b\u4ee5\u53ca\u8bfb\u7ebf\u7a0b\u5e76\u53d1\u8bbf\u95ee\u8bfb\u96c6\u5408&#xff0c;\u4e3a\u4e86\u907f\u514d\u52a0\u9501\u5e26\u6765\u7684\u6027\u80fd\u5f00\u9500&#xff0c;\u8fd9\u91cc\u4f1a\u77ed\u6682\u6301\u6709\u9501\u3002\u968f\u540e\u904d\u5386\u8be5\u5feb\u7167\u6570\u7ec4&#xff0c;\u7b5b\u9009\u51fa\u9700\u8981\u68c0\u6d4b\u8bfb\u4e8b\u4ef6\u7684 fd&#xff0c;\u5e76\u8bbf\u95ee\u65f6\u95f4\u6233\u6570\u7ec4&#xff0c;\u901a\u8fc7\u201c\u5f53\u524d\u65f6\u95f4 &#8211; \u6700\u540e\u6d3b\u8dc3\u65f6\u95f4\u201d\u8ba1\u7b97\u65f6\u95f4\u95f4\u9694&#xff0c;\u518d\u5224\u65ad\u8be5\u503c\u662f\u5426\u8d85\u8fc7\u8bbe\u5b9a\u9608\u503c&#xff08;\u4f8b\u5982 60 \u79d2&#xff09;\u3002\u4e4b\u6240\u4ee5\u9009\u62e9 60 \u79d2&#xff0c;\u662f\u57fa\u4e8e\u901a\u5e38\u60c5\u51b5\u4e0b\u5ba2\u6237\u7aef\u5904\u7406\u901f\u5ea6\u4e0e\u7f51\u7edc\u4f20\u8f93\u5ef6\u8fdf\u90fd\u8f83\u4f4e\u8fd9\u4e00\u7ecf\u9a8c\u524d\u63d0\u3002<\/p>\n<p>\u5982\u679c\u8be5\u65f6\u95f4\u95f4\u9694\u5927\u4e8e 60 \u79d2&#xff0c;\u5219\u8ba4\u4e3a\u8be5\u8fde\u63a5\u5df2\u7ecf\u8d85\u65f6\u3002\u6b64\u65f6\u5c06\u8be5 fd \u4ece\u8bfb\u96c6\u5408\u4e2d\u5220\u9664\u3002\u7531\u4e8e\u5199\u7ebf\u7a0b\u8d1f\u8d23\u6267\u884c Connection \u5bf9\u8c61\u7684\u6700\u7ec8\u6e05\u7406\u5de5\u4f5c&#xff0c;\u56e0\u6b64\u8fd9\u91cc\u7684\u5904\u7406\u6d41\u7a0b\u5982\u4e0b&#xff1a;\u9996\u5148\u52a0\u5168\u5c40\u5927\u9501&#xff0c;\u67e5\u8be2\u5bf9\u5e94\u7684 Connection \u5bf9\u8c61\u662f\u5426\u4ecd\u7136\u5b58\u5728&#xff1b;\u82e5\u5b58\u5728&#xff0c;\u5219\u6784\u9020\u4e00\u4e2a shared_ptr \u6307\u5411\u8be5 Connection \u5bf9\u8c61\u4ee5\u589e\u52a0\u5f15\u7528\u8ba1\u6570&#xff0c;\u968f\u540e\u91ca\u653e\u5927\u9501&#xff1b;\u63a5\u7740\u52a0\u7ec6\u7c92\u5ea6\u7684\u5c0f\u9501&#xff0c;\u4fee\u6539\u5176\u5173\u95ed\u6807\u5fd7\u4f4d should_close&#xff0c;\u518d\u91ca\u653e\u5c0f\u9501&#xff1b;\u6700\u540e\u5c06\u8be5 fd \u52a0\u5165\u5bf9\u5e94\u7684\u5199\u96c6\u5408&#xff0c;\u7531\u5199\u7ebf\u7a0b\u5b8c\u6210\u540e\u7eed\u8d44\u6e90\u56de\u6536\u4e0e\u5173\u95ed\u64cd\u4f5c\u3002<\/p>\n<p>  <span class=\"token keyword\">static<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token function\">check_timeout_fun<\/span><span class=\"token punctuation\">(<\/span>Poll_Server<span class=\"token operator\">*<\/span> server<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">while<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                time_t now<span class=\"token operator\">&#061;<\/span><span class=\"token function\">time<\/span><span class=\"token punctuation\">(<\/span><span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                std<span class=\"token double-colon punctuation\">::<\/span>vector<span class=\"token operator\">&lt;<\/span>pollfd<span class=\"token operator\">&gt;<\/span> poll_fds<span class=\"token operator\">&#061;<\/span>server<span class=\"token operator\">-&gt;<\/span>read_pollmanger<span class=\"token punctuation\">.<\/span><span class=\"token function\">get_snapshot<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">for<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">auto<\/span><span class=\"token operator\">&amp;<\/span> read_active<span class=\"token operator\">:<\/span>poll_fds<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>read_active<span class=\"token punctuation\">.<\/span>fd<span class=\"token operator\">!&#061;<\/span>server<span class=\"token operator\">-&gt;<\/span>listensock<span class=\"token punctuation\">.<\/span><span class=\"token function\">fd<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><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>now<span class=\"token operator\">&#8211;<\/span>server<span class=\"token operator\">-&gt;<\/span>last_active_time<span class=\"token punctuation\">[<\/span>read_active<span class=\"token punctuation\">.<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token operator\">&gt;<\/span><span class=\"token number\">60<\/span><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>server<span class=\"token operator\">-&gt;<\/span>read_pollmanger<span class=\"token punctuation\">.<\/span><span class=\"token function\">del_fd<\/span><span class=\"token punctuation\">(<\/span>read_active<span class=\"token punctuation\">.<\/span>fd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n                            lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>info<span class=\"token punctuation\">,<\/span><span class=\"token string\">&#034;client fd:%d timeout&#034;<\/span><span class=\"token punctuation\">,<\/span>read_active<span class=\"token punctuation\">.<\/span>fd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                            send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">lock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                            <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>send_queues<span class=\"token punctuation\">.<\/span><span class=\"token function\">find<\/span><span class=\"token punctuation\">(<\/span>read_active<span class=\"token punctuation\">.<\/span>fd<span class=\"token punctuation\">)<\/span><span class=\"token operator\">&#061;&#061;<\/span>send_queues<span class=\"token punctuation\">.<\/span><span class=\"token function\">end<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n                            <span class=\"token punctuation\">{<\/span><br \/>\n                                send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><span class=\"token punctuation\">(<\/span><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                            std<span class=\"token double-colon punctuation\">::<\/span>shared_ptr<span class=\"token operator\">&lt;<\/span>Connection<span class=\"token operator\">&gt;<\/span> conn<span class=\"token operator\">&#061;<\/span>send_queues<span class=\"token punctuation\">[<\/span>read_active<span class=\"token punctuation\">.<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                            send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                            conn<span class=\"token operator\">-&gt;<\/span>mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">lock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                            conn<span class=\"token operator\">-&gt;<\/span>should_close<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">true<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                            conn<span class=\"token operator\">-&gt;<\/span>mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                            server<span class=\"token operator\">-&gt;<\/span>write_pollmangers<span class=\"token punctuation\">[<\/span>read_active<span class=\"token punctuation\">.<\/span>fd<span class=\"token operator\">%<\/span>write_thread_num<span class=\"token punctuation\">]<\/span><span class=\"token operator\">-&gt;<\/span><span class=\"token function\">add_fd<\/span><span class=\"token punctuation\">(<\/span>read_active<span class=\"token punctuation\">.<\/span>fd<span class=\"token punctuation\">)<\/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 punctuation\">}<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><br \/>\n                <span class=\"token function\">sleep<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">30<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>\u6b64\u5916\u9700\u8981\u6ce8\u610f&#xff0c;\u8d85\u65f6\u68c0\u6d4b\u7ebf\u7a0b\u4e0d\u80fd\u6301\u7eed\u9ad8\u9891\u8fd0\u884c\u3002\u7531\u4e8e\u6bcf\u6b21\u68c0\u6d4b\u90fd\u9700\u8981\u8fdb\u884c\u4e00\u6b21 O(N) \u7ea7\u522b\u7684\u904d\u5386&#xff0c;\u5982\u679c\u9891\u7e41\u6267\u884c&#xff0c;\u4f1a\u5bf9 CPU \u9020\u6210\u8f83\u5927\u538b\u529b\u3002\u56e0\u6b64&#xff0c;\u5728\u6bcf\u4e00\u8f6e\u904d\u5386\u7ed3\u675f\u540e&#xff0c;\u7ebf\u7a0b\u4f1a\u4e3b\u52a8\u8ba9\u51fa CPU&#xff0c;\u5e76\u8fdb\u5165\u4f11\u7720\u72b6\u6001&#xff08;\u4f8b\u5982 sleep 30 \u79d2&#xff09;&#xff0c;\u4ee5\u964d\u4f4e\u7cfb\u7edf\u6574\u4f53\u8d1f\u8f7d\u3002\u8fd9\u672c\u8d28\u4e0a\u662f\u4e00\u79cd\u65f6\u95f4\u6362\u7a7a\u95f4\u3001\u541e\u5410\u4e0e\u5ef6\u8fdf\u4e4b\u95f4\u7684\u6743\u8861\u7b56\u7565\u3002<\/p>\n<p>\u8fd9\u91cc\u8fd8\u9700\u8981\u8865\u5145\u4e00\u4e2a\u5173\u952e\u7ec6\u8282&#xff0c;\u5373\u8bfb\u7ebf\u7a0b\u66f4\u65b0\u65f6\u95f4\u6233\u7684\u65f6\u673a\u95ee\u9898\u3002\u6709\u8bfb\u8005\u53ef\u80fd\u4f1a\u62c5\u5fc3&#xff1a;\u5f53\u524d\u5b9e\u73b0\u4e2d&#xff0c;\u65f6\u95f4\u6233\u662f\u5728 run \u51fd\u6570\u672b\u5c3e\u624d\u66f4\u65b0\u7684&#xff0c;\u4e5f\u5c31\u662f\u5728\u201c\u8bfb\u53d6 HTTP \u8bf7\u6c42 \u2192 \u89e3\u6790\u8bf7\u6c42 \u2192 \u6784\u5efa\u54cd\u5e94 \u2192 \u653e\u5165\u53d1\u9001\u961f\u5217\u201d\u8fd9\u4e00\u6574\u5957\u6d41\u7a0b\u5168\u90e8\u5b8c\u6210\u4e4b\u540e\u624d\u66f4\u65b0\u3002\u5982\u679c\u4e2d\u95f4\u4e1a\u52a1\u5904\u7406\u8017\u65f6\u8f83\u957f&#xff0c;\u6216\u8005\u7531\u4e8e\u9501\u7ade\u4e89\u5bfc\u81f4\u7ebf\u7a0b\u963b\u585e&#xff0c;\u90a3\u4e48\u5728\u8fd9\u6bb5\u65f6\u95f4\u5185&#xff0c;\u8d85\u65f6\u68c0\u6d4b\u7ebf\u7a0b\u53ef\u80fd\u4f1a\u8bef\u5224\u8be5\u8fde\u63a5\u5df2\u8d85\u65f6&#xff0c;\u4ece\u800c\u9519\u8bef\u5730\u5173\u95ed\u8fde\u63a5\u3002<\/p>\n<p>\u4f46\u8fd9\u91cc\u7684\u8bbe\u8ba1\u6070\u6070\u89c4\u907f\u4e86\u8fd9\u4e00\u95ee\u9898\u3002\u5173\u952e\u70b9\u5728\u4e8e&#xff1a;\u4e3b\u7ebf\u7a0b\u5728\u5c06\u8bfb\u4e8b\u4ef6\u5206\u53d1\u7ed9\u8bfb\u7ebf\u7a0b\u4e4b\u524d&#xff0c;\u4f1a\u5148\u5c06\u8be5 fd \u4ece\u8bfb\u96c6\u5408\u4e2d\u79fb\u9664\u3002\u4ece\u8868\u9762\u4e0a\u770b&#xff0c;\u8fd9\u4e00\u64cd\u4f5c\u7684\u76ee\u7684\u5728\u4e8e\u4fdd\u8bc1\u8bfb\u7ebf\u7a0b\u5bf9\u8be5 fd \u7684\u72ec\u5360\u8bbf\u95ee&#xff0c;\u907f\u514d\u591a\u4e2a\u8bfb\u7ebf\u7a0b\u5e76\u53d1\u8bfb\u53d6 TCP \u63a5\u6536\u7f13\u51b2\u533a\u3002\u4f46\u5b9e\u9645\u4e0a&#xff0c;\u8fd9\u4e00\u673a\u5236\u540c\u65f6\u4e5f\u201c\u5de7\u5999\u5730\u201d\u907f\u514d\u4e86\u8d85\u65f6\u8bef\u5224\u95ee\u9898\u3002<\/p>\n<p>\u539f\u56e0\u5728\u4e8e&#xff1a;\u8d85\u65f6\u68c0\u6d4b\u7ebf\u7a0b\u53ea\u4f1a\u68c0\u6d4b\u5f53\u524d\u4ecd\u5728\u8bfb\u96c6\u5408\u4e2d\u7684 fd\u3002\u800c\u4e00\u65e6\u67d0\u4e2a fd \u88ab\u4e3b\u7ebf\u7a0b\u5206\u914d\u7ed9\u8bfb\u7ebf\u7a0b\u5904\u7406&#xff0c;\u5b83\u5c31\u5df2\u7ecf\u4ece\u8bfb\u96c6\u5408\u4e2d\u79fb\u9664\u3002\u56e0\u6b64&#xff0c;\u5728\u8bfb\u7ebf\u7a0b\u6267\u884c\u671f\u95f4&#xff0c;\u8be5 fd \u4e0d\u4f1a\u51fa\u73b0\u5728\u8d85\u65f6\u68c0\u6d4b\u7ebf\u7a0b\u7684\u68c0\u6d4b\u8303\u56f4\u5185\u3002\u4e5f\u5c31\u662f\u8bf4&#xff0c;\u5373\u4f7f\u4e1a\u52a1\u5904\u7406\u65f6\u95f4\u8f83\u957f&#xff0c;\u4e5f\u4e0d\u4f1a\u88ab\u8bef\u5224\u4e3a\u8d85\u65f6\u3002<\/p>\n<p>\u8fdb\u4e00\u6b65\u5206\u6790\u4e00\u4e2a\u7ade\u6001\u573a\u666f&#xff1a;\u5047\u8bbe\u67d0\u4e00\u65f6\u523b&#xff0c;\u8d85\u65f6\u7ebf\u7a0b\u83b7\u53d6\u4e86\u8bfb\u96c6\u5408\u7684\u5feb\u7167&#xff0c;\u5176\u4e2d\u5305\u542b fd5&#xff1b;\u968f\u540e&#xff0c;\u5728\u8d85\u65f6\u7ebf\u7a0b\u5c1a\u672a\u5b8c\u6210\u68c0\u6d4b\u4e4b\u524d&#xff0c;\u4e3b\u7ebf\u7a0b\u68c0\u6d4b\u5230 fd5 \u8bfb\u4e8b\u4ef6\u5c31\u7eea&#xff0c;\u5e76\u5c06\u5176\u4ece\u8bfb\u96c6\u5408\u4e2d\u79fb\u9664&#xff0c;\u540c\u65f6\u5206\u914d\u8bfb\u7ebf\u7a0b\u5904\u7406\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b&#xff0c;\u53ef\u80fd\u5b58\u5728\u4e00\u4e2a\u6781\u77ed\u7684\u65f6\u95f4\u7a97\u53e3&#xff0c;\u4f7f\u5f97\u8d85\u65f6\u7ebf\u7a0b\u4ecd\u7136\u57fa\u4e8e\u65e7\u5feb\u7167\u5224\u65ad fd5 \u5df2\u8d85\u65f6\u3002<\/p>\n<p>\u4f8b\u5982&#xff0c;\u5b58\u5728\u8fd9\u6837\u4e00\u79cd\u65f6\u5e8f\u573a\u666f&#xff1a;\u4e3b\u7ebf\u7a0b\u5728\u7b2c 59 \u79d2\u65f6\u68c0\u6d4b\u5230\u67d0\u4e2a fd \u7684\u8bfb\u4e8b\u4ef6\u5c31\u7eea&#xff0c;\u5e76\u5c06\u5176\u5206\u914d\u7ed9\u8bfb\u7ebf\u7a0b\u8fdb\u884c\u5904\u7406&#xff1b;\u800c\u8d85\u65f6\u68c0\u6d4b\u7ebf\u7a0b\u5728\u7b2c 60 \u79d2\u6267\u884c\u68c0\u6d4b\u65f6&#xff0c;\u57fa\u4e8e\u65f6\u95f4\u6233\u5224\u65ad\u8be5 fd \u5df2\u7ecf\u8d85\u65f6&#xff0c;\u4ece\u800c\u5c06\u5176\u6807\u8bb0\u5e76\u901a\u77e5\u5bf9\u5e94\u7684\u5199\u7ebf\u7a0b\u6267\u884c\u6e05\u7406\u64cd\u4f5c\u3002<\/p>\n<p>\u9700\u8981\u6ce8\u610f\u7684\u662f&#xff0c;\u8fd9\u79cd\u60c5\u51b5\u672c\u8d28\u4e0a\u5c5e\u4e8e**\u7ade\u6001\u6761\u4ef6&#xff08;race condition&#xff09;**\u7684\u4e00\u79cd\u8868\u73b0\u3002\u56e0\u6b64&#xff0c;\u5728\u6267\u884c\u8d85\u65f6\u6e05\u7406\u903b\u8f91\u4e4b\u524d&#xff0c;\u5fc5\u987b\u518d\u6b21\u6821\u9a8c\u8be5 fd \u5f53\u524d\u662f\u5426\u4ecd\u7136\u5904\u4e8e\u8bfb\u96c6\u5408\u4e2d&#xff1b;\u5982\u679c\u8be5 fd \u5df2\u88ab\u4e3b\u7ebf\u7a0b\u79fb\u9664\u5e76\u4ea4\u7531\u8bfb\u7ebf\u7a0b\u5904\u7406&#xff0c;\u5219\u4e0d\u5e94\u6267\u884c\u8d85\u65f6\u5173\u95ed\u64cd\u4f5c&#xff0c;\u4ee5\u907f\u514d\u8bef\u6740\u6b63\u5728\u5904\u7406\u4e2d\u7684\u8fde\u63a5\u3002<\/p>\n<p>\u56e0\u6b64&#xff0c;\u8fd9\u91cc\u5fc5\u987b\u589e\u52a0\u4e00\u9053\u989d\u5916\u7684\u6821\u9a8c&#xff1a;\u5728\u6267\u884c\u8d85\u65f6\u6e05\u7406\u524d&#xff0c;\u5fc5\u987b\u518d\u6b21\u786e\u8ba4\u8be5 fd \u662f\u5426\u4ecd\u7136\u5b58\u5728\u4e8e\u8bfb\u96c6\u5408\u4e2d\u3002\u5982\u679c\u8be5 fd \u5df2\u7ecf\u88ab\u79fb\u9664&#xff0c;\u5219\u8bf4\u660e\u5176\u5df2\u7ecf\u8fdb\u5165\u8bfb\u7ebf\u7a0b\u5904\u7406\u6d41\u7a0b&#xff0c;\u4e0d\u5e94\u8fdb\u884c\u8d85\u65f6\u6e05\u7406&#xff1b;\u53ea\u6709\u5f53 fd \u4ecd\u7136\u5b58\u5728\u4e8e\u8bfb\u96c6\u5408\u4e2d\u4e14\u6ee1\u8db3\u8d85\u65f6\u6761\u4ef6\u65f6&#xff0c;\u624d\u6267\u884c\u8fde\u63a5\u5173\u95ed\u903b\u8f91\u3002<\/p>\n<p>\u6240\u4ee5\u65e0\u8bba\u662f\u54ea\u79cd\u573a\u666f&#xff1a;<\/p>\n<p>\u573a\u666f A&#xff1a;\u4e3b\u7ebf\u7a0b\u62a2\u5148\u3002 \u5ba2\u6237\u7aef\u53d1\u9001\u65b0\u6570\u636e\u540e&#xff0c;\u4e3b\u7ebf\u7a0b\u5728 poll \u8fd4\u56de\u540e\u7acb\u5373\u6267\u884c read_manager-&gt;del_fd(fd)&#xff0c;\u5e76\u5c06\u8be5 fd \u5206\u914d\u7ed9\u8bfb\u7ebf\u7a0b\u5904\u7406\u3002\u6b64\u65f6&#xff0c;\u82e5\u8d85\u65f6\u68c0\u6d4b\u7ebf\u7a0b\u5c1d\u8bd5\u6267\u884c del_fd&#xff0c;\u5219\u4f1a\u5931\u8d25&#xff08;\u8fd4\u56de false&#xff09;\u3002\u8be5\u8fd4\u56de\u7ed3\u679c\u9690\u542b\u5730\u8868\u660e&#xff1a;\u5f53\u524d\u8fde\u63a5\u5df2\u7ecf\u88ab\u4e3b\u7ebf\u7a0b\u63a5\u7ba1&#xff0c;\u6b63\u5904\u4e8e\u6d3b\u8dc3\u5904\u7406\u72b6\u6001\u3002\u56e0\u6b64&#xff0c;\u8d85\u65f6\u7ebf\u7a0b\u4f1a\u636e\u6b64\u653e\u5f03\u6e05\u7406\u64cd\u4f5c\u3002<\/p>\n<p>\u573a\u666f B&#xff1a;\u8d85\u65f6\u7ebf\u7a0b\u62a2\u5148\u3002 \u5f53\u8fde\u63a5\u786e\u5b9e\u5728 60 \u79d2\u5185\u65e0\u4efb\u4f55\u6d3b\u52a8\u65f6&#xff0c;\u8d85\u65f6\u68c0\u6d4b\u7ebf\u7a0b\u4f1a\u5148\u4e00\u6b65\u6210\u529f\u6267\u884c del_fd&#xff08;\u8fd4\u56de true&#xff09;\u3002\u6b64\u65f6&#xff0c;\u5373\u4f7f\u5728\u4e0b\u4e00\u77ac\u95f4\u4e3b\u7ebf\u7a0b\u7684 poll \u8fd4\u56de&#xff0c;\u7531\u4e8e\u8be5 fd \u5df2\u7ecf\u4ece\u8bfb\u96c6\u5408\u4e2d\u79fb\u9664&#xff0c;\u4e3b\u7ebf\u7a0b\u4e5f\u4e0d\u4f1a\u518d\u611f\u77e5\u5230\u8be5 fd \u7684\u8bfb\u4e8b\u4ef6&#xff0c;\u4ece\u800c\u4e0d\u4f1a\u5bf9\u5176\u8fdb\u884c\u5904\u7406\u3002<\/p>\n<p>\u4e0a\u8ff0\u4e24\u79cd\u573a\u666f\u5171\u540c\u6784\u6210\u4e86\u4e00\u79cd\u5929\u7136\u7684\u4e92\u65a5\u673a\u5236\u3002\u672c\u8d28\u4e0a&#xff0c;\u8fd9\u91cc\u5229\u7528\u4e86 Pollmanager \u5185\u90e8\u7684\u90a3\u628a\u9501\u548c vector\/unordered_map \u7684\u64cd\u4f5c\u7ed3\u679c&#xff0c;\u5b8c\u6210\u4e86\u4e00\u6b21\u65e0\u987b\u989d\u5916\u6807\u5fd7\u4f4d\u7684\u201c\u539f\u5b50\u62a2\u5360\u201d&#xff0c;\u5c31\u80fd\u591f\u5728\u4e3b\u7ebf\u7a0b\u4e0e\u8d85\u65f6\u7ebf\u7a0b\u4e4b\u95f4\u5efa\u7acb\u6b63\u786e\u7684\u7ade\u4e89\u5173\u7cfb&#xff0c;\u4ece\u800c\u907f\u514d\u7ade\u6001\u6761\u4ef6\u5e26\u6765\u7684\u8bef\u5224\u3002<\/p>\n<h3>Accept()<\/h3>\n<p>\u800c\u8fd9\u91cc\u6700\u540e&#xff0c;\u6211\u4eec\u6765\u89e3\u7b54\u4e0a\u6587\u57cb\u4e0b\u7684\u4e00\u4e2a\u5173\u952e\u70b9&#xff0c;\u4e5f\u5c31\u662f\u4e3b\u7ebf\u7a0b\u83b7\u53d6\u65b0\u8fde\u63a5\u7684\u5904\u7406\u7b56\u7565\u3002<\/p>\n<p>\u5f53\u4e3b\u7ebf\u7a0b\u68c0\u6d4b\u5230\u76d1\u542c\u5957\u63a5\u5b57\u7684\u8bfb\u4e8b\u4ef6\u5c31\u7eea\u65f6&#xff0c;\u4fbf\u4f1a\u6267\u884c\u83b7\u53d6\u65b0\u8fde\u63a5\u7684\u64cd\u4f5c\u3002\u6211\u4eec\u77e5\u9053&#xff0c;\u76d1\u542c\u5957\u63a5\u5b57\u7684\u8bfb\u4e8b\u4ef6\u5c31\u7eea&#xff0c;\u672c\u8d28\u4e0a\u610f\u5473\u7740\u5168\u8fde\u63a5\u961f\u5217&#xff08;accept \u961f\u5217&#xff09;\u4e0d\u4e3a\u7a7a\u3002\u800c\u8c03\u7528 accept \u63a5\u53e3\u65f6&#xff0c;\u5176\u8bed\u4e49\u53ea\u662f\u4ece\u5168\u8fde\u63a5\u961f\u5217\u7684\u961f\u9996\u53d6\u51fa\u4e00\u4e2a\u5df2\u5b8c\u6210\u8fde\u63a5\u7684\u5957\u63a5\u5b57&#xff08;\u5373\u4e00\u4e2a\u5df2\u5efa\u7acb\u8fde\u63a5\u7684 fd&#xff09;\u3002<\/p>\n<p>\u7136\u800c&#xff0c;\u5728\u9ad8\u5e76\u53d1\u670d\u52a1\u5668\u573a\u666f\u4e0b&#xff0c;\u670d\u52a1\u7aef\u4f1a\u6301\u7eed\u63a5\u6536\u5927\u91cf\u5ba2\u6237\u7aef\u7684\u8fde\u63a5\u8bf7\u6c42&#xff0c;\u5e95\u5c42 TCP \u534f\u8bae\u6808\u4e0d\u65ad\u5b8c\u6210\u4e09\u6b21\u63e1\u624b&#xff0c;\u5c06\u65b0\u8fde\u63a5\u653e\u5165\u5168\u8fde\u63a5\u961f\u5217\u3002\u5982\u679c\u6bcf\u6b21\u4ec5\u8c03\u7528\u4e00\u6b21 accept&#xff0c;\u53ea\u53d6\u51fa\u4e00\u4e2a\u8fde\u63a5&#xff0c;\u90a3\u4e48\u5728\u9ad8\u5e76\u53d1\u538b\u529b\u4e0b&#xff0c;\u5168\u8fde\u63a5\u961f\u5217\u5f88\u53ef\u80fd\u5728\u6781\u77ed\u65f6\u95f4\u5185\u518d\u6b21\u88ab\u586b\u6ee1&#xff0c;\u751a\u81f3\u51fa\u73b0\u961f\u5217\u6ea2\u51fa&#xff08;backlog \u88ab\u6253\u6ee1&#xff09;\u7684\u60c5\u51b5\u3002<\/p>\n<p>\u56e0\u6b64&#xff0c;\u5bf9\u4e8e\u76d1\u542c\u5957\u63a5\u5b57\u7684\u8bfb\u4e8b\u4ef6\u5904\u7406&#xff0c;\u6b63\u786e\u7684\u505a\u6cd5\u5e76\u4e0d\u662f\u201c\u5904\u7406\u4e00\u4e2a\u8fde\u63a5\u201d&#xff0c;\u800c\u662f\u5c3d\u53ef\u80fd\u6e05\u7a7a\u5f53\u524d\u5168\u8fde\u63a5\u961f\u5217\u3002\u4e5f\u5c31\u662f\u8bf4&#xff0c;\u9700\u8981\u5faa\u73af\u8c03\u7528 accept&#xff0c;\u76f4\u5230\u961f\u5217\u88ab\u53d6\u7a7a\u4e3a\u6b62\u3002<\/p>\n<hr \/>\n<p>\u4f46\u8fd9\u91cc\u5b58\u5728\u4e00\u4e2a\u5bb9\u6613\u8e29\u7684\u5173\u952e\u95ee\u9898&#xff1a;<\/p>\n<p>\u5f53\u6700\u540e\u4e00\u4e2a\u5df2\u8fde\u63a5\u5957\u63a5\u5b57\u88ab\u53d6\u8d70\u540e&#xff0c;\u5168\u8fde\u63a5\u961f\u5217\u53d8\u4e3a\u7a7a&#xff0c;\u800c accept \u7684\u9ed8\u8ba4\u884c\u4e3a\u662f\u963b\u585e\u7b49\u5f85\u65b0\u7684\u8fde\u63a5\u5230\u6765\u3002\u8fd9\u5c31\u4f1a\u5bfc\u81f4\u4e3b\u7ebf\u7a0b\u88ab\u6302\u8d77&#xff0c;\u65e0\u6cd5\u7ee7\u7eed\u5904\u7406\u5176\u4ed6\u5df2\u7ecf\u5c31\u7eea\u7684 I\/O \u4e8b\u4ef6&#xff08;\u4f8b\u5982\u5df2\u6709\u8fde\u63a5\u7684\u8bfb\u5199\u4e8b\u4ef6&#xff09;&#xff0c;\u4ece\u800c\u5f71\u54cd\u6574\u4e2a\u4e8b\u4ef6\u5faa\u73af\u7684\u54cd\u5e94\u80fd\u529b\u3002<\/p>\n<p>\u56e0\u6b64&#xff0c;\u8fd9\u91cc\u5fc5\u987b\u5c06\u76d1\u542c\u5957\u63a5\u5b57\u8bbe\u7f6e\u4e3a\u975e\u963b\u585e\u6a21\u5f0f&#xff0c;\u4f7f\u5f97\u5f53\u5168\u8fde\u63a5\u961f\u5217\u4e3a\u7a7a\u65f6&#xff0c;accept \u80fd\u591f\u7acb\u5373\u8fd4\u56de&#xff0c;\u800c\u4e0d\u662f\u963b\u585e\u7b49\u5f85\u3002<\/p>\n<p>\u5b9e\u73b0\u65b9\u5f0f\u662f\u901a\u8fc7 fcntl \u63a5\u53e3\u4fee\u6539\u6587\u4ef6\u63cf\u8ff0\u7b26\u7684\u72b6\u6001\u6807\u5fd7\u4f4d&#xff1a;<\/p>\n<ul>\n<li>\u7cfb\u7edf\u8c03\u7528&#xff1a;fcntl<\/li>\n<li>\u5934\u6587\u4ef6&#xff1a;&lt;fcntl.h&gt;<\/li>\n<li>\u51fd\u6570\u58f0\u660e&#xff1a;int fcntl(int fd, int cmd, &#8230; \/* arg *\/ );<\/li>\n<li>\u8fd4\u56de\u503c&#xff1a;\u6210\u529f\u65f6\u8fd4\u56de\u503c\u53d6\u51b3\u4e8e cmd&#xff08;\u4f8b\u5982 F_GETFL \u8fd4\u56de\u6587\u4ef6\u72b6\u6001\u6807\u5fd7&#xff09;&#xff0c;\u5931\u8d25\u65f6\u8fd4\u56de -1 \u5e76\u8bbe\u7f6e errno<\/li>\n<\/ul>\n<p>\u5728\u5185\u6838\u4e2d&#xff0c;\u6bcf\u4e2a fd \u5bf9\u5e94\u4e00\u4e2a file \u7ed3\u6784\u4f53&#xff0c;\u5176\u4e2d\u5305\u542b flags \u5b57\u6bb5&#xff0c;\u7528\u4e8e\u63cf\u8ff0\u8be5\u6587\u4ef6\u63cf\u8ff0\u7b26\u7684\u884c\u4e3a\u5c5e\u6027&#xff08;\u5982\u963b\u585e\/\u975e\u963b\u585e\u3001\u8bfb\u5199\u6a21\u5f0f&#xff08;\u6bd4\u5982O_RDONLY&#xff09;\u7b49&#xff09;\u3002\u56e0\u6b64&#xff0c;\u8fd9\u91cc\u7684\u64cd\u4f5c\u6d41\u7a0b\u662f&#xff1a;\u5148\u83b7\u53d6\u5f53\u524d\u6807\u5fd7\u4f4d&#xff0c;\u518d\u8fdb\u884c\u6309\u4f4d\u4fee\u6539&#xff0c;\u6700\u540e\u5199\u56de\u3002<\/p>\n<p>\u4ee3\u7801\u793a\u4f8b&#xff1a;<\/p>\n<p> <span class=\"token comment\">\/\/ \u83b7\u53d6\u6587\u4ef6\u72b6\u6001\u6807\u5fd7<\/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>fd<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><\/p>\n<p><span class=\"token comment\">\/\/ \u8bbe\u7f6e\u975e\u963b\u585e\u6807\u5fd7<\/span><br \/>\nflags <span class=\"token operator\">|&#061;<\/span> O_NONBLOCK<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token function\">fcntl<\/span><span class=\"token punctuation\">(<\/span>fd<span class=\"token punctuation\">,<\/span> F_SETFL<span class=\"token punctuation\">,<\/span> flags<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>\u8bbe\u7f6e\u4e3a\u975e\u963b\u585e\u4e4b\u540e&#xff0c;\u5f53\u5168\u8fde\u63a5\u961f\u5217\u4e3a\u7a7a\u65f6&#xff0c;accept \u4f1a\u7acb\u5373\u8fd4\u56de -1&#xff0c;\u5e76\u5c06 errno \u8bbe\u7f6e\u4e3a EAGAIN \u6216 EWOULDBLOCK&#xff0c;\u8868\u793a\u201c\u5f53\u524d\u64cd\u4f5c\u65e0\u6cd5\u7acb\u5373\u5b8c\u6210&#xff0c;\u9700\u8981\u7a0d\u540e\u91cd\u8bd5\u201d\u3002\u8fd9\u6b63\u662f\u6211\u4eec\u7528\u6765\u5224\u65ad\u201c\u961f\u5217\u5df2\u7ecf\u88ab\u53d6\u7a7a\u201d\u7684\u4f9d\u636e\u3002<\/p>\n<hr \/>\n<p>\u7ed3\u5408\u4e0a\u8ff0\u673a\u5236&#xff0c;\u76d1\u542c\u5957\u63a5\u5b57\u7684\u5904\u7406\u903b\u8f91\u53ef\u4ee5\u5b9e\u73b0\u4e3a&#xff1a;<\/p>\n<p><span class=\"token keyword\">void<\/span> <span class=\"token function\">Accept<\/span><span class=\"token punctuation\">(<\/span>Pollmanager<span class=\"token operator\">*<\/span> read_arg<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">while<\/span><span class=\"token punctuation\">(<\/span><span class=\"token boolean\">true<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sockaddr_in<\/span> Client<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">memset<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>Client<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>Client<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        socklen_t Client_len <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>Client<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> listensock<span class=\"token punctuation\">.<\/span><span class=\"token function\">accept<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>Client<span class=\"token punctuation\">,<\/span><span class=\"token operator\">&amp;<\/span>Client_len<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\">&lt;<\/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\">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><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token comment\">\/\/ \u5168\u8fde\u63a5\u961f\u5217\u5df2\u53d6\u7a7a<\/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 keyword\">return<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        last_active_time<span class=\"token punctuation\">[<\/span>connfd<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">time<\/span><span class=\"token punctuation\">(<\/span><span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">lock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        send_queues<span class=\"token punctuation\">[<\/span>connfd<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token generic-function\"><span class=\"token function\">make_shared<\/span><span class=\"token generic class-name\"><span class=\"token operator\">&lt;<\/span>Connection<span class=\"token operator\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>connfd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        read_arg<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">add_fd<\/span><span class=\"token punctuation\">(<\/span>connfd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h2>\u6e90\u7801<\/h2>\n<p>Poll_Server.hpp:<\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">pragma<\/span> <span class=\"token expression\">once<\/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;iostream&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;unistd.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;signal.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\">&#034;daemon.hpp&#034;<\/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\">&#034;Socket.hpp&#034;<\/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\">&#034;log.hpp&#034;<\/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&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;poll.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;sys\/time.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;sys\/types.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;thread&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;queue&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;unordered_map&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;vector&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\">&#034;Task.hpp&#034;<\/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\">&#034;Threadpool.h&#034;<\/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\">&#034;Pollmanager.hpp&#034;<\/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;mutex&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;time.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;atomic&gt;<\/span><\/span><\/p>\n<p><span class=\"token keyword\">extern<\/span>  std<span class=\"token double-colon punctuation\">::<\/span>string _deafault<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">extern<\/span> log lg<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">const<\/span> <span class=\"token keyword\">int<\/span> write_thread_num <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">16<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/** Poll_Server \u7c7b\u5b9e\u73b0\u4e86\u4e00\u4e2a\u57fa\u4e8epoll\u7684\u591a\u7ebf\u7a0b\u670d\u52a1\u5668*\/<\/span><br \/>\n<span class=\"token keyword\">class<\/span> <span class=\"token class-name\">Poll_Server<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">public<\/span><span class=\"token operator\">:<\/span><br \/>\n        <span class=\"token function\">Poll_Server<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">uint16_t<\/span> _port<span class=\"token operator\">&#061;<\/span><span class=\"token number\">8888<\/span><span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string _ip<span class=\"token operator\">&#061;<\/span>_deafault<span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token operator\">:<\/span><span class=\"token function\">port<\/span><span class=\"token punctuation\">(<\/span>_port<span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token punctuation\">,<\/span> <span class=\"token function\">ip<\/span><span class=\"token punctuation\">(<\/span>_ip<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">,<\/span><span class=\"token function\">read_tp<\/span><span class=\"token punctuation\">(<\/span>threadpool<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">getinstance<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token comment\">\/\/ \u83b7\u53d6\u7ebf\u7a0b\u6c60\u5355\u4f8b<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u521d\u59cb\u5316\u6700\u540e\u6d3b\u52a8\u65f6\u95f4\u6570\u7ec4<\/span><br \/>\n           <span class=\"token keyword\">for<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/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><span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>last_active_time<span class=\"token punctuation\">)<\/span><span class=\"token operator\">\/<\/span><span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>time_t<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>i<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n           <span class=\"token punctuation\">{<\/span><br \/>\n              last_active_time<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token number\">0<\/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\">static<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token function\">check_timeout_fun<\/span><span class=\"token punctuation\">(<\/span>Poll_Server<span class=\"token operator\">*<\/span> server<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">while<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                time_t now<span class=\"token operator\">&#061;<\/span><span class=\"token function\">time<\/span><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<\/span><br \/>\n                std<span class=\"token double-colon punctuation\">::<\/span>vector<span class=\"token operator\">&lt;<\/span>pollfd<span class=\"token operator\">&gt;<\/span> poll_fds<span class=\"token operator\">&#061;<\/span>server<span class=\"token operator\">-&gt;<\/span>read_pollmanger<span class=\"token punctuation\">.<\/span><span class=\"token function\">get_snapshot<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u904d\u5386\u6240\u6709\u6587\u4ef6\u63cf\u8ff0\u7b26<\/span><br \/>\n                <span class=\"token keyword\">for<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">auto<\/span><span class=\"token operator\">&amp;<\/span> read_active<span class=\"token operator\">:<\/span>poll_fds<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>read_active<span class=\"token punctuation\">.<\/span>fd<span class=\"token operator\">!&#061;<\/span>server<span class=\"token operator\">-&gt;<\/span>listensock<span class=\"token punctuation\">.<\/span><span class=\"token function\">fd<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n                    <span class=\"token punctuation\">{<\/span><br \/>\n                    <span class=\"token comment\">\/\/ \u68c0\u67e5\u662f\u5426\u8d85\u8fc760\u79d2\u65e0\u6d3b\u52a8<\/span><br \/>\n                         <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>now<span class=\"token operator\">&#8211;<\/span>server<span class=\"token operator\">-&gt;<\/span>last_active_time<span class=\"token punctuation\">[<\/span>read_active<span class=\"token punctuation\">.<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token operator\">&gt;<\/span><span class=\"token number\">60<\/span><span class=\"token punctuation\">)<\/span><br \/>\n                         <span class=\"token punctuation\">{<\/span><br \/>\n                        <span class=\"token comment\">\/\/ \u5220\u9664\u8d85\u65f6\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26<\/span><br \/>\n                               <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>server<span class=\"token operator\">-&gt;<\/span>read_pollmanger<span class=\"token punctuation\">.<\/span><span class=\"token function\">del_fd<\/span><span class=\"token punctuation\">(<\/span>read_active<span class=\"token punctuation\">.<\/span>fd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n                            lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>info<span class=\"token punctuation\">,<\/span><span class=\"token string\">&#034;client fd:%d timeout&#034;<\/span><span class=\"token punctuation\">,<\/span>read_active<span class=\"token punctuation\">.<\/span>fd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                            server<span class=\"token operator\">-&gt;<\/span>read_pollmanger<span class=\"token punctuation\">.<\/span><span class=\"token function\">del_fd<\/span><span class=\"token punctuation\">(<\/span>read_active<span class=\"token punctuation\">.<\/span>fd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                            send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">lock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                            <span class=\"token comment\">\/\/ \u68c0\u67e5\u53d1\u9001\u961f\u5217\u4e2d\u662f\u5426\u5b58\u5728\u8be5\u8fde\u63a5<\/span><br \/>\n                            <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>send_queues<span class=\"token punctuation\">.<\/span><span class=\"token function\">find<\/span><span class=\"token punctuation\">(<\/span>read_active<span class=\"token punctuation\">.<\/span>fd<span class=\"token punctuation\">)<\/span><span class=\"token operator\">&#061;&#061;<\/span>send_queues<span class=\"token punctuation\">.<\/span><span class=\"token function\">end<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n                            <span class=\"token punctuation\">{<\/span><br \/>\n                                send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><span class=\"token punctuation\">(<\/span><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 comment\">\/\/ \u83b7\u53d6\u8fde\u63a5\u5e76\u6807\u8bb0\u4e3a\u9700\u8981\u5173\u95ed<\/span><br \/>\n                           std<span class=\"token double-colon punctuation\">::<\/span>shared_ptr<span class=\"token operator\">&lt;<\/span>Connection<span class=\"token operator\">&gt;<\/span> conn<span class=\"token operator\">&#061;<\/span>send_queues<span class=\"token punctuation\">[<\/span>read_active<span class=\"token punctuation\">.<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                            send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                            conn<span class=\"token operator\">-&gt;<\/span>mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">lock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                            conn<span class=\"token operator\">-&gt;<\/span>should_close<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">true<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                            conn<span class=\"token operator\">-&gt;<\/span>mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                            <span class=\"token comment\">\/\/ \u5c06\u6587\u4ef6\u63cf\u8ff0\u7b26\u6dfb\u52a0\u5230\u5199\u8f6e\u8be2\u7ba1\u7406\u5668<\/span><br \/>\n                            server<span class=\"token operator\">-&gt;<\/span>write_pollmangers<span class=\"token punctuation\">[<\/span>read_active<span class=\"token punctuation\">.<\/span>fd<span class=\"token operator\">%<\/span>write_thread_num<span class=\"token punctuation\">]<\/span><span class=\"token operator\">-&gt;<\/span><span class=\"token function\">add_fd<\/span><span class=\"token punctuation\">(<\/span>read_active<span class=\"token punctuation\">.<\/span>fd<span class=\"token punctuation\">)<\/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 punctuation\">}<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><br \/>\n                <span class=\"token function\">sleep<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">30<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u6bcf30\u79d2\u68c0\u67e5\u4e00\u6b21<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>   <span class=\"token keyword\">static<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token function\">write_thread_func<\/span><span class=\"token punctuation\">(<\/span>Pollmanager<span class=\"token operator\">*<\/span> write_arg<span class=\"token punctuation\">,<\/span> Pollmanager<span class=\"token operator\">*<\/span> read_arg<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <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\">\/\/ \u65e0\u9650\u5faa\u73af\u5904\u7406\u53d1\u9001\u4efb\u52a1<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u83b7\u53d6\u5f53\u524d\u9700\u8981\u76d1\u542c\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u5feb\u7167<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>vector<span class=\"token operator\">&lt;<\/span>pollfd<span class=\"token operator\">&gt;<\/span> poll_fds <span class=\"token operator\">&#061;<\/span> write_arg<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">get_snapshot<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u5982\u679c\u6ca1\u6709\u9700\u8981\u76d1\u542c\u7684\u63cf\u8ff0\u7b26&#xff0c;\u77ed\u6682\u4f11\u7720\u907f\u514d\u7a7a\u8f6c<\/span><br \/>\n        <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>poll_fds<span class=\"token punctuation\">.<\/span><span class=\"token function\">empty<\/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\">usleep<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">10000<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u4f11\u772010ms<\/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\">\/\/ \u4f7f\u7528poll\u7b49\u5f85\u53ef\u5199\u4e8b\u4ef6&#xff0c;\u8d85\u65f6\u65f6\u95f4\u4e3a10ms<\/span><br \/>\n        <span class=\"token keyword\">int<\/span> n <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">poll<\/span><span class=\"token punctuation\">(<\/span>poll_fds<span class=\"token punctuation\">.<\/span><span class=\"token function\">data<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> poll_fds<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">10<\/span><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\">\/\/ poll\u8c03\u7528\u51fa\u9519&#xff0c;\u8bb0\u5f55\u9519\u8bef\u65e5\u5fd7\u5e76\u9000\u51fa\u5faa\u73af<\/span><br \/>\n            lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>Fatal<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;Poll error&#034;<\/span><span class=\"token punctuation\">)<\/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> <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><br \/>\n            <span class=\"token comment\">\/\/ poll\u8d85\u65f6&#xff0c;\u6ca1\u6709\u63cf\u8ff0\u7b26\u53ef\u5199<\/span><br \/>\n            lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>info<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;write_thread poll timeout&#034;<\/span><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\">\/\/ \u904d\u5386\u6240\u6709\u76d1\u542c\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26<\/span><br \/>\n        <span class=\"token keyword\">for<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">auto<\/span><span class=\"token operator\">&amp;<\/span> i <span class=\"token operator\">:<\/span> poll_fds<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u68c0\u67e5\u662f\u5426\u6709\u53ef\u5199\u4e8b\u4ef6<\/span><br \/>\n            <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>i<span class=\"token punctuation\">.<\/span>revents <span class=\"token operator\">&amp;<\/span> POLLOUT<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token comment\">\/\/ \u52a0\u9501\u83b7\u53d6\u8fde\u63a5\u5bf9\u8c61<\/span><br \/>\n                send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">lock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                std<span class=\"token double-colon punctuation\">::<\/span>shared_ptr<span class=\"token operator\">&lt;<\/span>Connection<span class=\"token operator\">&gt;<\/span> conn <span class=\"token operator\">&#061;<\/span> send_queues<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">.<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                <span class=\"token comment\">\/\/ \u52a0\u9501\u8fde\u63a5\u5bf9\u8c61&#xff0c;\u786e\u4fdd\u7ebf\u7a0b\u5b89\u5168<\/span><br \/>\n                conn<span class=\"token operator\">-&gt;<\/span>mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">lock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                <span class=\"token keyword\">bool<\/span> error_occurred <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">bool<\/span> eagain_occurred <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                <span class=\"token comment\">\/\/ \u5faa\u73af\u53d1\u9001\u7f13\u51b2\u533a\u4e2d\u7684\u6240\u6709\u6570\u636e<\/span><br \/>\n                <span class=\"token keyword\">while<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>conn<span class=\"token operator\">-&gt;<\/span>out_buffer<span class=\"token punctuation\">.<\/span><span class=\"token function\">empty<\/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 comment\">\/\/ \u83b7\u53d6\u5f85\u53d1\u9001\u6570\u636e<\/span><br \/>\n                    std<span class=\"token double-colon punctuation\">::<\/span>string data <span class=\"token operator\">&#061;<\/span> conn<span class=\"token operator\">-&gt;<\/span>out_buffer<span class=\"token punctuation\">.<\/span><span class=\"token function\">front<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    <span class=\"token comment\">\/\/ \u5c1d\u8bd5\u53d1\u9001\u6570\u636e&#xff08;\u975e\u963b\u585e\u6a21\u5f0f&#xff09;<\/span><br \/>\n                    ssize_t send_bytes <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">send<\/span><span class=\"token punctuation\">(<\/span>i<span class=\"token punctuation\">.<\/span>fd<span class=\"token punctuation\">,<\/span><br \/>\n                                             data<span class=\"token punctuation\">.<\/span><span class=\"token function\">c_str<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#043;<\/span> conn<span class=\"token operator\">-&gt;<\/span>write_offset<span class=\"token punctuation\">,<\/span><br \/>\n                                             data<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span> conn<span class=\"token operator\">-&gt;<\/span>write_offset<span class=\"token punctuation\">,<\/span><br \/>\n                                             MSG_DONTWAIT<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>send_bytes <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\">\/\/ \u53d1\u9001\u51fa\u9519<\/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 punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                            <span class=\"token comment\">\/\/ \u7f13\u51b2\u533a\u6ee1&#xff0c;\u6682\u65f6\u65e0\u6cd5\u53d1\u9001<\/span><br \/>\n                            eagain_occurred <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">true<\/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 comment\">\/\/ \u5176\u4ed6\u9519\u8bef&#xff0c;\u8bb0\u5f55\u65e5\u5fd7<\/span><br \/>\n                        lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>Fatal<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;send error&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                        error_occurred <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">true<\/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> <span class=\"token keyword\">else<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                        <span class=\"token comment\">\/\/ \u66f4\u65b0\u5df2\u53d1\u9001\u7684\u5b57\u8282\u6570<\/span><br \/>\n                        conn<span class=\"token operator\">-&gt;<\/span>write_offset <span class=\"token operator\">&#043;&#061;<\/span> send_bytes<span class=\"token punctuation\">;<\/span><\/p>\n<p>                        <span class=\"token comment\">\/\/ \u5982\u679c\u5f53\u524d\u6570\u636e\u5757\u53d1\u9001\u5b8c\u6bd5<\/span><br \/>\n                        <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>conn<span class=\"token operator\">-&gt;<\/span>write_offset <span class=\"token operator\">&#061;&#061;<\/span> data<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                            conn<span class=\"token operator\">-&gt;<\/span>write_offset <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                            conn<span class=\"token operator\">-&gt;<\/span>out_buffer<span class=\"token punctuation\">.<\/span><span class=\"token function\">pop<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/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 punctuation\">}<\/span><\/p>\n<p>                <span class=\"token comment\">\/\/ \u5904\u7406\u53d1\u9001\u5b8c\u6210\u540e\u7684\u72b6\u6001<\/span><br \/>\n                <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>error_occurred <span class=\"token operator\">||<\/span> <span class=\"token punctuation\">(<\/span>conn<span class=\"token operator\">-&gt;<\/span>should_close <span class=\"token operator\">&amp;&amp;<\/span> conn<span class=\"token operator\">-&gt;<\/span>out_buffer<span class=\"token punctuation\">.<\/span><span class=\"token function\">empty<\/span><span class=\"token punctuation\">(<\/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 comment\">\/\/ \u53d1\u751f\u9519\u8bef\u6216\u9700\u8981\u5173\u95ed\u8fde\u63a5<\/span><br \/>\n                    read_arg<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">del_fd<\/span><span class=\"token punctuation\">(<\/span>i<span class=\"token punctuation\">.<\/span>fd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u4ece\u8bfb\u76d1\u542c\u4e2d\u79fb\u9664<\/span><br \/>\n                    write_arg<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">del_fd<\/span><span class=\"token punctuation\">(<\/span>i<span class=\"token punctuation\">.<\/span>fd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u4ece\u5199\u76d1\u542c\u4e2d\u79fb\u9664<\/span><\/p>\n<p>                    <span class=\"token comment\">\/\/ \u52a0\u9501\u79fb\u9664\u8fde\u63a5<\/span><br \/>\n                    send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">lock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    conn<span class=\"token operator\">-&gt;<\/span>mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    send_queues<span class=\"token punctuation\">.<\/span><span class=\"token function\">erase<\/span><span class=\"token punctuation\">(<\/span>i<span class=\"token punctuation\">.<\/span>fd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><span class=\"token punctuation\">(<\/span><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 keyword\">if<\/span><span class=\"token punctuation\">(<\/span>eagain_occurred<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                    <span class=\"token comment\">\/\/ \u7f13\u51b2\u533a\u6ee1&#xff0c;\u6682\u65f6\u65e0\u6cd5\u53d1\u9001&#xff0c;\u4fdd\u6301\u8fde\u63a5\u5728\u76d1\u542c\u4e2d<\/span><br \/>\n                    conn<span class=\"token operator\">-&gt;<\/span>mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><span class=\"token punctuation\">(<\/span><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 keyword\">if<\/span><span class=\"token punctuation\">(<\/span>conn<span class=\"token operator\">-&gt;<\/span>should_close <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token boolean\">false<\/span> <span class=\"token operator\">&amp;&amp;<\/span> conn<span class=\"token operator\">-&gt;<\/span>out_buffer<span class=\"token punctuation\">.<\/span><span class=\"token function\">empty<\/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 comment\">\/\/ \u6570\u636e\u53d1\u9001\u5b8c\u6bd5\u4e14\u4e0d\u9700\u8981\u5173\u95ed\u8fde\u63a5&#xff0c;\u4ece\u5199\u76d1\u542c\u4e2d\u79fb\u9664<\/span><br \/>\n                    write_arg<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">del_fd<\/span><span class=\"token punctuation\">(<\/span>i<span class=\"token punctuation\">.<\/span>fd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    conn<span class=\"token operator\">-&gt;<\/span>mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/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 punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/**<br \/>\n * \u63a5\u53d7\u5ba2\u6237\u7aef\u8fde\u63a5\u7684\u51fd\u6570<br \/>\n *\/<\/span><br \/>\n        <span class=\"token keyword\">void<\/span> <span class=\"token function\">Accept<\/span><span class=\"token punctuation\">(<\/span>Pollmanager<span class=\"token operator\">*<\/span> read_arg<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token keyword\">while<\/span><span class=\"token punctuation\">(<\/span><span class=\"token boolean\">true<\/span><span class=\"token punctuation\">)<\/span>  <span class=\"token comment\">\/\/ \u65e0\u9650\u5faa\u73af&#xff0c;\u6301\u7eed\u63a5\u53d7\u65b0\u7684\u8fde\u63a5<\/span><br \/>\n                <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sockaddr_in<\/span> Client<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u5ba2\u6237\u7aef\u5730\u5740\u7ed3\u6784\u4f53<\/span><br \/>\n                <span class=\"token function\">memset<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>Client<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>Client<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u6e05\u7a7a\u5ba2\u6237\u7aef\u5730\u5740\u7ed3\u6784\u4f53<\/span><br \/>\n                socklen_t Client_len <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>Client<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u5ba2\u6237\u7aef\u5730\u5740\u7ed3\u6784\u4f53\u957f\u5ea6<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u63a5\u53d7\u65b0\u7684\u8fde\u63a5&#xff0c;\u83b7\u53d6\u5957\u63a5\u5b57\u63cf\u8ff0\u7b26<\/span><br \/>\n                <span class=\"token keyword\">int<\/span> connfd <span class=\"token operator\">&#061;<\/span> listensock<span class=\"token punctuation\">.<\/span><span class=\"token function\">accept<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>Client<span class=\"token punctuation\">,<\/span><span class=\"token operator\">&amp;<\/span>Client_len<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\">&lt;<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span>  <span class=\"token comment\">\/\/ \u5982\u679c\u63a5\u53d7\u8fde\u63a5\u5931\u8d25<\/span><br \/>\n                <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u5982\u679c\u9519\u8bef\u662fEAGAIN\u6216EWOULDBLOCK&#xff0c;\u8868\u793a\u6ca1\u6709\u66f4\u591a\u8fde\u63a5\u9700\u8981\u5904\u7406&#xff0c;\u9000\u51fa\u5faa\u73af<\/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><br \/>\n                    <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><\/p>\n<p>            <span class=\"token comment\">\/\/ \u5176\u4ed6\u9519\u8bef&#xff0c;\u76f4\u63a5\u8fd4\u56de<\/span><br \/>\n                    <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u8bb0\u5f55\u8fde\u63a5\u7684\u6700\u540e\u6d3b\u52a8\u65f6\u95f4\u4e3a\u5f53\u524d\u65f6\u95f4<\/span><br \/>\n                last_active_time<span class=\"token punctuation\">[<\/span>connfd<span class=\"token punctuation\">]<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token function\">time<\/span><span class=\"token punctuation\">(<\/span><span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u52a0\u9501\u4fdd\u62a4\u5171\u4eab\u8d44\u6e90<\/span><br \/>\n                send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">lock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u4e3a\u65b0\u8fde\u63a5\u521b\u5efaConnection\u5bf9\u8c61\u5e76\u5b58\u5165\u53d1\u9001\u961f\u5217<\/span><br \/>\n                send_queues<span class=\"token punctuation\">[<\/span>connfd<span class=\"token punctuation\">]<\/span><span class=\"token operator\">&#061;<\/span>std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token generic-function\"><span class=\"token function\">make_shared<\/span><span class=\"token generic class-name\"><span class=\"token operator\">&lt;<\/span>Connection<span class=\"token operator\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>connfd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u5c06\u65b0\u7684\u8fde\u63a5\u63cf\u8ff0\u7b26\u6dfb\u52a0\u5230Pollmanager\u4e2d\u7ba1\u7406<\/span><br \/>\n                read_arg<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">add_fd<\/span><span class=\"token punctuation\">(<\/span>connfd<span class=\"token punctuation\">)<\/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 comment\">\/**<br \/>\n * \u5206\u53d1\u51fd\u6570&#xff0c;\u7528\u4e8e\u5c06\u6587\u4ef6\u63cf\u8ff0\u7b26\u4ece\u4e00\u4e2apoll\u7ba1\u7406\u5668\u8f6c\u79fb\u5230\u4efb\u52a1\u961f\u5217\u4e2d<br \/>\n *\/<\/span><br \/>\n        <span class=\"token keyword\">void<\/span> <span class=\"token function\">Distribute<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> fd<span class=\"token punctuation\">,<\/span>Pollmanager<span class=\"token operator\">*<\/span> read_arg<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u4ece\u8bfb\u53d6poll\u7ba1\u7406\u5668\u4e2d\u5220\u9664\u8be5\u6587\u4ef6\u63cf\u8ff0\u7b26<\/span><br \/>\n                   read_arg<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">del_fd<\/span><span class=\"token punctuation\">(<\/span>fd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u521b\u5efa\u4e00\u4e2a\u4efb\u52a1\u5bf9\u8c61&#xff0c;\u5305\u542b\u4ee5\u4e0b\u53c2\u6570&#xff1a;<\/span><br \/>\n    <span class=\"token comment\">\/\/ &#8211; fd: \u6587\u4ef6\u63cf\u8ff0\u7b26<\/span><br \/>\n    <span class=\"token comment\">\/\/ &#8211; read_arg: \u8bfb\u53d6poll\u7ba1\u7406\u5668\u6307\u9488<\/span><br \/>\n    <span class=\"token comment\">\/\/ &#8211; write_pollmangers[fd%write_thread_num]: \u6839\u636efd\u8ba1\u7b97\u5f97\u5230\u7684\u5199\u5165poll\u7ba1\u7406\u5668<\/span><br \/>\n    <span class=\"token comment\">\/\/ &#8211; last_active_time: \u6700\u540e\u6d3b\u8dc3\u65f6\u95f4<\/span><br \/>\n                   Task <span class=\"token function\">t<\/span><span class=\"token punctuation\">(<\/span>fd<span class=\"token punctuation\">,<\/span>read_arg<span class=\"token punctuation\">,<\/span>write_pollmangers<span class=\"token punctuation\">[<\/span>fd<span class=\"token operator\">%<\/span>write_thread_num<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span>last_active_time<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u5c06\u521b\u5efa\u7684\u4efb\u52a1\u63a8\u5165\u8bfb\u53d6\u7ebf\u7a0b\u6c60\u7684\u4efb\u52a1\u961f\u5217<\/span><br \/>\n                   read_tp<span class=\"token punctuation\">.<\/span><span class=\"token function\">push<\/span><span class=\"token punctuation\">(<\/span>t<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token comment\">\/**<br \/>\n * \u5904\u7406\u4efb\u52a1\u51fd\u6570&#xff0c;\u6839\u636epoll\u4e8b\u4ef6\u8fdb\u884c\u76f8\u5e94\u7684\u5904\u7406<br \/>\n *\/<\/span><br \/>\n        <span class=\"token keyword\">void<\/span> <span class=\"token function\">handlertask<\/span><span class=\"token punctuation\">(<\/span>Pollmanager<span class=\"token operator\">*<\/span> read_arg<span class=\"token punctuation\">,<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>vector<span class=\"token operator\">&lt;<\/span>pollfd<span class=\"token operator\">&gt;<\/span><span class=\"token operator\">&amp;<\/span> poll_fds<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u904d\u5386\u6240\u6709\u7684pollfd\u7ed3\u6784<\/span><br \/>\n               <span class=\"token keyword\">for<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">auto<\/span><span class=\"token operator\">&amp;<\/span> i<span class=\"token operator\">:<\/span>poll_fds<span class=\"token punctuation\">)<\/span><br \/>\n               <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u68c0\u67e5\u662f\u5426\u6709\u53ef\u8bfb\u4e8b\u4ef6\u53d1\u751f<\/span><br \/>\n                <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>i<span class=\"token punctuation\">.<\/span>revents<span class=\"token operator\">&amp;<\/span>POLLIN<span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u5982\u679c\u662f\u76d1\u542c\u5957\u63a5\u5b57\u6709\u4e8b\u4ef6&#xff0c;\u5219\u63a5\u53d7\u65b0\u8fde\u63a5<\/span><br \/>\n                     <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>i<span class=\"token punctuation\">.<\/span>fd<span class=\"token operator\">&#061;&#061;<\/span>listensock<span class=\"token punctuation\">.<\/span><span class=\"token function\">fd<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n                     <span class=\"token punctuation\">{<\/span><br \/>\n                        <span class=\"token function\">Accept<\/span><span class=\"token punctuation\">(<\/span>read_arg<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\">\/\/ \u5426\u5219&#xff0c;\u5c06\u4e8b\u4ef6\u5206\u53d1\u7ed9\u5bf9\u5e94\u7684\u5904\u7406\u51fd\u6570<\/span><br \/>\n                        <span class=\"token function\">Distribute<\/span><span class=\"token punctuation\">(<\/span>i<span class=\"token punctuation\">.<\/span>fd<span class=\"token punctuation\">,<\/span>read_arg<span class=\"token punctuation\">)<\/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 punctuation\">}<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token comment\">\/**<br \/>\n * \u521d\u59cb\u5316\u51fd\u6570&#xff0c;\u7528\u4e8e\u8bbe\u7f6e\u76d1\u542c\u5957\u63a5\u5b57<br \/>\n *\/<\/span><br \/>\n         <span class=\"token keyword\">bool<\/span> <span class=\"token function\">init<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u521b\u5efa\u5957\u63a5\u5b57<\/span><br \/>\n                listensock<span class=\"token punctuation\">.<\/span><span class=\"token function\">socket<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u7ed1\u5b9aIP\u5730\u5740\u548c\u7aef\u53e3\u53f7<\/span><br \/>\n                listensock<span class=\"token punctuation\">.<\/span><span class=\"token function\">bind<\/span><span class=\"token punctuation\">(<\/span>ip<span class=\"token punctuation\">,<\/span> port<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u5c06\u5957\u63a5\u5b57\u8bbe\u7f6e\u4e3a\u975e\u963b\u585e\u6a21\u5f0f<\/span><br \/>\n                listensock<span class=\"token punctuation\">.<\/span><span class=\"token function\">setnonblock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u8fd4\u56de\u521d\u59cb\u5316\u6210\u529f\u6807\u5fd7<\/span><br \/>\n                <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">start<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">bool<\/span> isdaemon<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">false<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u5ffd\u7565SIGPIPE\u4fe1\u53f7&#xff0c;\u9632\u6b62\u5411\u5df2\u5173\u95ed\u7684socket\u5199\u5165\u5bfc\u81f4\u8fdb\u7a0b\u5d29\u6e83<\/span><br \/>\n    <span class=\"token function\">signal<\/span><span class=\"token punctuation\">(<\/span>SIGPIPE<span class=\"token punctuation\">,<\/span> SIG_IGN<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <\/p>\n<p>    <span class=\"token comment\">\/\/ \u5982\u679c\u9700\u8981\u4ee5\u5b88\u62a4\u8fdb\u7a0b\u65b9\u5f0f\u8fd0\u884c<\/span><br \/>\n    <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>isdaemon<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        Daemon d<span class=\"token punctuation\">;<\/span><br \/>\n        d<span class=\"token punctuation\">.<\/span><span class=\"token function\">daemon<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u5c06\u5f53\u524d\u8fdb\u7a0b\u8f6c\u6362\u4e3a\u5b88\u62a4\u8fdb\u7a0b<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u5f00\u59cb\u76d1\u542c\u5ba2\u6237\u7aef\u8fde\u63a5<\/span><br \/>\n    listensock<span class=\"token punctuation\">.<\/span><span class=\"token function\">listen<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u542f\u52a8\u8bfb\u7ebf\u7a0b\u6c60<\/span><br \/>\n    read_tp<span class=\"token punctuation\">.<\/span><span class=\"token function\">start<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u542f\u52a8\u8d85\u65f6\u68c0\u67e5\u7ebf\u7a0b&#xff0c;\u5e76\u5206\u79bb<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">thread<\/span><span class=\"token punctuation\">(<\/span>check_timeout_fun<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">this<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">detach<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u521b\u5efa\u5199\u7ebf\u7a0b\u6c60<\/span><br \/>\n    <span class=\"token keyword\">for<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/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> write_thread_num<span class=\"token punctuation\">;<\/span> i<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u4e3a\u6bcf\u4e2a\u5199\u7ebf\u7a0b\u521b\u5efa\u4e00\u4e2aPollmanager\u5bf9\u8c61<\/span><br \/>\n        write_pollmangers<span class=\"token punctuation\">.<\/span><span class=\"token function\">push_back<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">new<\/span> <span class=\"token function\">Pollmanager<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u542f\u52a8\u5199\u7ebf\u7a0b&#xff0c;\u4f20\u5165\u5199Pollmanager\u548c\u8bfbPollmanager<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">thread<\/span><span class=\"token punctuation\">(<\/span>write_thread_func<span class=\"token punctuation\">,<\/span> write_pollmangers<span class=\"token punctuation\">.<\/span><span class=\"token function\">back<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>read_pollmanger<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">detach<\/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>    <span class=\"token comment\">\/\/ \u83b7\u53d6\u76d1\u542c\u5957\u63a5\u5b57\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> listensock_fd <span class=\"token operator\">&#061;<\/span> listensock<span class=\"token punctuation\">.<\/span><span class=\"token function\">fd<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u5c06\u76d1\u542c\u5957\u63a5\u5b57\u6dfb\u52a0\u5230\u8bfbPollmanager\u4e2d<\/span><br \/>\n    read_pollmanger<span class=\"token punctuation\">.<\/span><span class=\"token function\">add_fd<\/span><span class=\"token punctuation\">(<\/span>listensock_fd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u4e3b\u4e8b\u4ef6\u5faa\u73af<\/span><br \/>\n    <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/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\">\/\/ \u83b7\u53d6\u5f53\u524d\u9700\u8981\u76d1\u542c\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u5feb\u7167<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>vector<span class=\"token operator\">&lt;<\/span>pollfd<span class=\"token operator\">&gt;<\/span> poll_fds <span class=\"token operator\">&#061;<\/span> read_pollmanger<span class=\"token punctuation\">.<\/span><span class=\"token function\">get_snapshot<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u4f7f\u7528poll\u7b49\u5f85\u4e8b\u4ef6&#xff0c;\u8d85\u65f6\u65f6\u95f4\u4e3a10ms<\/span><br \/>\n        <span class=\"token keyword\">int<\/span> n <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">poll<\/span><span class=\"token punctuation\">(<\/span>poll_fds<span class=\"token punctuation\">.<\/span><span class=\"token function\">data<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> poll_fds<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">10<\/span><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><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token comment\">\/\/ poll\u8c03\u7528\u51fa\u9519&#xff0c;\u8bb0\u5f55\u9519\u8bef\u65e5\u5fd7<\/span><br \/>\n            lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>Fatal<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;poll error&#034;<\/span><span class=\"token punctuation\">)<\/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 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><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token comment\">\/\/ poll\u8d85\u65f6&#xff0c;\u6ca1\u6709\u4e8b\u4ef6\u53d1\u751f<\/span><br \/>\n            lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>info<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;poll timeout&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token keyword\">else<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u6709\u4e8b\u4ef6\u53d1\u751f&#xff0c;\u8c03\u7528\u4efb\u52a1\u5904\u7406\u51fd\u6570<\/span><br \/>\n            <span class=\"token function\">handlertask<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>read_pollmanger<span class=\"token punctuation\">,<\/span> poll_fds<span class=\"token punctuation\">)<\/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 punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">private<\/span><span class=\"token operator\">:<\/span><br \/>\n        sock listensock<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">uint16_t<\/span> port<span class=\"token punctuation\">;<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>string ip<span class=\"token punctuation\">;<\/span><br \/>\n        Pollmanager read_pollmanger<span class=\"token punctuation\">{<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>vector<span class=\"token operator\">&lt;<\/span>Pollmanager<span class=\"token operator\">*<\/span><span class=\"token operator\">&gt;<\/span> write_pollmangers<span class=\"token punctuation\">;<\/span><br \/>\n        threadpool<span class=\"token operator\">&amp;<\/span> read_tp<span class=\"token punctuation\">;<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>atomic<span class=\"token operator\">&lt;<\/span>time_t<span class=\"token operator\">&gt;<\/span> last_active_time<span class=\"token punctuation\">[<\/span><span class=\"token number\">65536<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>Poll_Server.cpp:<\/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;Poll_Server.hpp&#034;<\/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\">&#034;log.hpp&#034;<\/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><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;memory&gt;<\/span><\/span><br \/>\n log lg<span class=\"token punctuation\">;<\/span><br \/>\n std<span class=\"token double-colon punctuation\">::<\/span>string path<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;.\/wwwroot&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n std<span class=\"token double-colon punctuation\">::<\/span>string _deafault<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;0.0.0.0&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n std<span class=\"token double-colon punctuation\">::<\/span>mutex send_queues_mtx<span class=\"token punctuation\">;<\/span><br \/>\n std<span class=\"token double-colon punctuation\">::<\/span>unordered_map<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token punctuation\">,<\/span>std<span class=\"token double-colon punctuation\">::<\/span>shared_ptr<span class=\"token operator\">&lt;<\/span>Connection<span class=\"token operator\">&gt;&gt;<\/span> send_queues<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token comment\">\/**<br \/>\n * \u4e3b\u51fd\u6570&#xff0c;\u8d1f\u8d23\u521d\u59cb\u5316\u5e76\u542f\u52a8\u670d\u52a1\u5668<br \/>\n *\/<\/span><br \/>\n<span class=\"token keyword\">int<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u5b9a\u4e49\u4e00\u4e2a\u5b57\u7b26\u6570\u7ec4\u7528\u4e8e\u5b58\u50a8\u89e3\u6790\u540e\u7684\u7edd\u5bf9\u8def\u5f84<\/span><br \/>\n      <span class=\"token keyword\">char<\/span> resolved_path<span class=\"token punctuation\">[<\/span><span class=\"token number\">1024<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u4f7f\u7528realpath\u51fd\u6570\u83b7\u53d6\u6587\u4ef6\u7684\u7edd\u5bf9\u8def\u5f84&#xff0c;\u5982\u679c\u5931\u8d25\u5219\u8bb0\u5f55\u9519\u8bef\u65e5\u5fd7\u5e76\u9000\u51fa<\/span><br \/>\n      <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">realpath<\/span><span class=\"token punctuation\">(<\/span>path<span class=\"token punctuation\">.<\/span><span class=\"token function\">c_str<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>resolved_path<span class=\"token punctuation\">)<\/span><span class=\"token operator\">&#061;&#061;<\/span><span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">)<\/span><br \/>\n      <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u8bb0\u5f55\u81f4\u547d\u9519\u8bef\u65e5\u5fd7<\/span><br \/>\n        lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>Fatal<span class=\"token punctuation\">,<\/span><span class=\"token string\">&#034;realpath error&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u8fd4\u56de\u9519\u8bef\u72b6\u6001\u7801<\/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\">\/\/ \u5c06\u89e3\u6790\u540e\u7684\u7edd\u5bf9\u8def\u5f84\u8d4b\u503c\u7ed9path\u53d8\u91cf<\/span><br \/>\n      path<span class=\"token operator\">&#061;<\/span>resolved_path<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u521b\u5efa\u4e00\u4e2aPoll_Server\u667a\u80fd\u6307\u9488\u5b9e\u4f8b&#xff0c;\u76d1\u542c8888\u7aef\u53e3<\/span><br \/>\n      std<span class=\"token double-colon punctuation\">::<\/span>unique_ptr<span class=\"token operator\">&lt;<\/span>Poll_Server<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">server<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">new<\/span> <span class=\"token function\">Poll_Server<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">8888<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u521d\u59cb\u5316\u670d\u52a1\u5668&#xff0c;\u5982\u679c\u5931\u8d25\u5219\u8bb0\u5f55\u9519\u8bef\u65e5\u5fd7\u5e76\u9000\u51fa<\/span><br \/>\n      <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span><span class=\"token punctuation\">(<\/span>server<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">init<\/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 punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u8bb0\u5f55\u81f4\u547d\u9519\u8bef\u65e5\u5fd7<\/span><br \/>\n        lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>Fatal<span class=\"token punctuation\">,<\/span><span class=\"token string\">&#034;server init error&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u8fd4\u56de\u9519\u8bef\u72b6\u6001\u7801<\/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\">\/\/ \u542f\u52a8\u670d\u52a1\u5668<\/span><br \/>\n      server<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">start<\/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>Pollmanager.hpp:<\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">pragma<\/span> <span class=\"token expression\">once<\/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;mutex&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;poll.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;sys\/types.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;vector&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;memory&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;unistd.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;unordered_map&gt;<\/span><\/span><br \/>\n<span class=\"token comment\">\/**<br \/>\n *  Pollmanager\u7c7b\u662f\u4e00\u4e2a\u57fa\u4e8epoll\u7684\u4e8b\u4ef6\u7ba1\u7406\u5668&#xff0c;\u7528\u4e8e\u7ba1\u7406\u6587\u4ef6\u63cf\u8ff0\u7b26(fd)\u53ca\u5176\u4e8b\u4ef6<br \/>\n *\/<\/span><br \/>\n<span class=\"token keyword\">class<\/span> <span class=\"token class-name\">Pollmanager<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">public<\/span><span class=\"token operator\">:<\/span><br \/>\n    <span class=\"token comment\">\/**<br \/>\n     _event \u6307\u5b9a\u8981\u76d1\u542c\u7684\u4e8b\u4ef6\u7c7b\u578b&#xff0c;1\u8868\u793aPOLLIN(\u53ef\u8bfb)&#xff0c;2\u8868\u793aPOLLOUT(\u53ef\u5199)<br \/>\n     *\/<\/span><br \/>\n    <span class=\"token function\">Pollmanager<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> _event<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token operator\">:<\/span><span class=\"token function\">event<\/span><span class=\"token punctuation\">(<\/span>_event<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><\/p>\n<p>    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token comment\">\/**<br \/>\n     * \u6dfb\u52a0\u6587\u4ef6\u63cf\u8ff0\u7b26\u5230poll\u7ba1\u7406\u5668<br \/>\n     *\/<\/span><br \/>\n    <span class=\"token keyword\">void<\/span> <span class=\"token function\">add_fd<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> fd<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n       <span class=\"token comment\">\/\/ \u4f7f\u7528std::lock_guard\u81ea\u52a8\u7ba1\u7406\u4e92\u65a5\u9501<\/span><br \/>\n       std<span class=\"token double-colon punctuation\">::<\/span>lock_guard<span class=\"token operator\">&lt;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>mutex<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">lock<\/span><span class=\"token punctuation\">(<\/span>mtx<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n       <span class=\"token comment\">\/\/ \u68c0\u67e5fd\u662f\u5426\u5df2\u7ecf\u5b58\u5728&#xff0c;\u5b58\u5728\u5219\u76f4\u63a5\u8fd4\u56de<\/span><br \/>\n       <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>fd_index_map<span class=\"token punctuation\">.<\/span><span class=\"token function\">find<\/span><span class=\"token punctuation\">(<\/span>fd<span class=\"token punctuation\">)<\/span><span class=\"token operator\">!&#061;<\/span>fd_index_map<span class=\"token punctuation\">.<\/span><span class=\"token function\">end<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n       <span class=\"token punctuation\">{<\/span><br \/>\n             <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><br \/>\n       <span class=\"token punctuation\">}<\/span><br \/>\n       <span class=\"token comment\">\/\/ \u521b\u5efa\u65b0\u7684pollfd\u7ed3\u6784\u4f53<\/span><br \/>\n       pollfd pfd<span class=\"token punctuation\">;<\/span><br \/>\n       pfd<span class=\"token punctuation\">.<\/span>fd<span class=\"token operator\">&#061;<\/span>fd<span class=\"token punctuation\">;<\/span><br \/>\n       <span class=\"token comment\">\/\/ \u6839\u636e\u6784\u9020\u51fd\u6570\u4f20\u5165\u7684event\u53c2\u6570\u8bbe\u7f6e\u4e8b\u4ef6\u7c7b\u578b<\/span><br \/>\n       <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>event<span class=\"token operator\">&#061;&#061;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><br \/>\n       <span class=\"token punctuation\">{<\/span><br \/>\n         pfd<span class=\"token punctuation\">.<\/span>events<span class=\"token operator\">&#061;<\/span>POLLIN<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u8bbe\u7f6e\u4e3a\u53ef\u8bfb\u4e8b\u4ef6<\/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>event<span class=\"token operator\">&#061;&#061;<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><br \/>\n       <span class=\"token punctuation\">{<\/span><br \/>\n        pfd<span class=\"token punctuation\">.<\/span>events<span class=\"token operator\">&#061;<\/span>POLLOUT<span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u8bbe\u7f6e\u4e3a\u53ef\u5199\u4e8b\u4ef6<\/span><br \/>\n       <span class=\"token punctuation\">}<\/span><br \/>\n       pfd<span class=\"token punctuation\">.<\/span>revents<span class=\"token operator\">&#061;<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span>       <span class=\"token comment\">\/\/ \u521d\u59cb\u5316revents\u4e3a0<\/span><br \/>\n       <span class=\"token comment\">\/\/ \u5c06pollfd\u7ed3\u6784\u4f53\u6dfb\u52a0\u5230vector\u4e2d<\/span><br \/>\n       pollfds<span class=\"token punctuation\">.<\/span><span class=\"token function\">push_back<\/span><span class=\"token punctuation\">(<\/span>pfd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n       <span class=\"token comment\">\/\/ \u66f4\u65b0fd\u5230\u7d22\u5f15\u7684\u6620\u5c04\u5173\u7cfb<\/span><br \/>\n       fd_index_map<span class=\"token punctuation\">[<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token operator\">&#061;<\/span>pollfds<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/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\">\/**<br \/>\n * \u4ecepollfds\u96c6\u5408\u4e2d\u5220\u9664\u6307\u5b9a\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26<br \/>\n *\/<\/span><br \/>\n    <span class=\"token keyword\">bool<\/span> <span class=\"token function\">del_fd<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> fd<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u4f7f\u7528\u4e92\u65a5\u9501\u786e\u4fdd\u7ebf\u7a0b\u5b89\u5168<\/span><br \/>\n       std<span class=\"token double-colon punctuation\">::<\/span>lock_guard<span class=\"token operator\">&lt;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>mutex<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">lock<\/span><span class=\"token punctuation\">(<\/span>mtx<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u68c0\u67e5\u6587\u4ef6\u63cf\u8ff0\u7b26\u662f\u5426\u5b58\u5728<\/span><br \/>\n       <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>fd_index_map<span class=\"token punctuation\">.<\/span><span class=\"token function\">find<\/span><span class=\"token punctuation\">(<\/span>fd<span class=\"token punctuation\">)<\/span><span class=\"token operator\">&#061;&#061;<\/span>fd_index_map<span class=\"token punctuation\">.<\/span><span class=\"token function\">end<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n       <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u6587\u4ef6\u63cf\u8ff0\u7b26\u4e0d\u5b58\u5728&#xff0c;\u8fd4\u56defalse<\/span><br \/>\n         <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n       <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u83b7\u53d6\u6587\u4ef6\u63cf\u8ff0\u7b26\u5728pollfds\u4e2d\u7684\u7d22\u5f15\u4f4d\u7f6e<\/span><br \/>\n       <span class=\"token keyword\">int<\/span> index<span class=\"token operator\">&#061;<\/span>fd_index_map<span class=\"token punctuation\">[<\/span>fd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u5982\u679c\u8981\u5220\u9664\u7684\u662f\u6700\u540e\u4e00\u4e2a\u5143\u7d20<\/span><br \/>\n       <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>index<span class=\"token operator\">&#061;&#061;<\/span>pollfds<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/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\">\/\/ \u76f4\u63a5\u5220\u9664\u6700\u540e\u4e00\u4e2a\u5143\u7d20<\/span><br \/>\n           pollfds<span class=\"token punctuation\">.<\/span><span class=\"token function\">pop_back<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u4ece\u6620\u5c04\u8868\u4e2d\u5220\u9664\u8be5\u6587\u4ef6\u63cf\u8ff0\u7b26<\/span><br \/>\n           fd_index_map<span class=\"token punctuation\">.<\/span><span class=\"token function\">erase<\/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 boolean\">true<\/span><span class=\"token punctuation\">;<\/span><br \/>\n       <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u5982\u679c\u8981\u5220\u9664\u7684\u4e0d\u662f\u6700\u540e\u4e00\u4e2a\u5143\u7d20<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u83b7\u53d6\u6700\u540e\u4e00\u4e2a\u5143\u7d20\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26<\/span><br \/>\n       <span class=\"token keyword\">int<\/span> last_fd<span class=\"token operator\">&#061;<\/span>pollfds<span class=\"token punctuation\">.<\/span><span class=\"token function\">back<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>fd<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u5c06\u6700\u540e\u4e00\u4e2a\u5143\u7d20\u79fb\u52a8\u5230\u8981\u5220\u9664\u7684\u4f4d\u7f6e<\/span><br \/>\n       pollfds<span class=\"token punctuation\">[<\/span>index<span class=\"token punctuation\">]<\/span><span class=\"token operator\">&#061;<\/span>pollfds<span class=\"token punctuation\">.<\/span><span class=\"token function\">back<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u5220\u9664\u6700\u540e\u4e00\u4e2a\u5143\u7d20<\/span><br \/>\n       pollfds<span class=\"token punctuation\">.<\/span><span class=\"token function\">pop_back<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u66f4\u65b0\u88ab\u79fb\u52a8\u5143\u7d20\u7684\u7d22\u5f15\u6620\u5c04<\/span><br \/>\n       fd_index_map<span class=\"token punctuation\">[<\/span>last_fd<span class=\"token punctuation\">]<\/span><span class=\"token operator\">&#061;<\/span>index<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u5220\u9664\u539f\u6587\u4ef6\u63cf\u8ff0\u7b26\u7684\u6620\u5c04<\/span><br \/>\n       fd_index_map<span class=\"token punctuation\">.<\/span><span class=\"token function\">erase<\/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 boolean\">true<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token comment\">\/**<br \/>\n * \u83b7\u53d6\u5f53\u524dpollfd\u96c6\u5408\u7684\u5feb\u7167<br \/>\n * \u8be5\u51fd\u6570\u4f1a\u83b7\u53d6\u5f53\u524dpollfd\u96c6\u5408\u7684\u526f\u672c&#xff0c;\u7ebf\u7a0b\u5b89\u5168<br \/>\n *\/<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>vector<span class=\"token operator\">&lt;<\/span>pollfd<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">get_snapshot<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>lock_guard<span class=\"token operator\">&lt;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>mutex<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">lock<\/span><span class=\"token punctuation\">(<\/span>mtx<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u4f7f\u7528\u4e92\u65a5\u9501\u786e\u4fdd\u7ebf\u7a0b\u5b89\u5168<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> pollfds<span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u8fd4\u56depollfd\u96c6\u5408\u7684\u526f\u672c<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">private<\/span><span class=\"token operator\">:<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>mutex mtx<span class=\"token punctuation\">;<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>vector<span class=\"token operator\">&lt;<\/span>pollfd<span class=\"token operator\">&gt;<\/span> pollfds<span class=\"token punctuation\">;<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>unordered_map<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token punctuation\">,<\/span><span class=\"token keyword\">int<\/span><span class=\"token operator\">&gt;<\/span> fd_index_map<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> event<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>Socket.hpp:<\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">pragma<\/span> <span class=\"token expression\">once<\/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;arpa\/inet.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;netinet\/in.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;fcntl.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;unistd.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;string&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;cstring&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;cstdlib&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\">&#034;log.hpp&#034;<\/span><\/span><br \/>\n<span class=\"token keyword\">extern<\/span> log lg<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">const<\/span> <span class=\"token keyword\">int<\/span> MAXCONNNUM <span class=\"token operator\">&#061;<\/span><span class=\"token number\">500<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">enum<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    Socket_Error <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    Bind_Error<span class=\"token punctuation\">,<\/span><br \/>\n    Listen_Error<span class=\"token punctuation\">,<\/span><br \/>\n    Accept_Error<span class=\"token punctuation\">,<\/span><br \/>\n    Connect_Error<span class=\"token punctuation\">,<\/span><br \/>\n    Usage_Error<span class=\"token punctuation\">,<\/span><br \/>\n    Setnonblock_Error<span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">sock<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">public<\/span><span class=\"token operator\">:<\/span><br \/>\n    <span class=\"token function\">sock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token operator\">:<\/span><span class=\"token function\">socketfd<\/span><span class=\"token punctuation\">(<\/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><br \/>\n    <span class=\"token operator\">~<\/span><span class=\"token function\">sock<\/span><span class=\"token punctuation\">(<\/span><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>socketfd <span class=\"token operator\">&gt;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">close<\/span><span class=\"token punctuation\">(<\/span>socketfd<span class=\"token punctuation\">)<\/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\">int<\/span> <span class=\"token function\">fd<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> socketfd<span class=\"token punctuation\">;<\/span><br \/>\n   <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token comment\">\/**<br \/>\n * \u521b\u5efa\u4e00\u4e2aTCP\u5957\u63a5\u5b57\u5e76\u8bbe\u7f6e\u91cd\u7528\u5730\u5740\u548c\u7aef\u53e3\u9009\u9879<br \/>\n * \u5982\u679c\u521b\u5efa\u5931\u8d25&#xff0c;\u8bb0\u5f55\u9519\u8bef\u65e5\u5fd7\u5e76\u9000\u51fa\u7a0b\u5e8f<br \/>\n *\/<\/span><br \/>\n    <span class=\"token keyword\">void<\/span> <span class=\"token function\">socket<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u521b\u5efaTCP\u5957\u63a5\u5b57&#xff0c;\u4f7f\u7528IPv4\u5730\u5740\u65cf\u548c\u6d41\u5f0f\u5957\u63a5\u5b57<\/span><br \/>\n        socketfd <span class=\"token operator\">&#061;<\/span> <span class=\"token double-colon punctuation\">::<\/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 comment\">\/\/ \u68c0\u67e5\u5957\u63a5\u5b57\u662f\u5426\u521b\u5efa\u6210\u529f<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>socketfd <span class=\"token operator\">&lt;<\/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\">\/\/ \u8bb0\u5f55\u81f4\u547d\u9519\u8bef\u65e5\u5fd7<\/span><br \/>\n            lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>Fatal<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;socket error&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u8bbe\u7f6e\u5957\u63a5\u5b57\u63cf\u8ff0\u7b26\u4e3a\u65e0\u6548\u503c<\/span><br \/>\n            socketfd <span class=\"token operator\">&#061;<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u9000\u51fa\u7a0b\u5e8f&#xff0c;\u9519\u8bef\u7801\u4e3aSocket_Error<\/span><br \/>\n            <span class=\"token function\">exit<\/span><span class=\"token punctuation\">(<\/span>Socket_Error<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u8bbe\u7f6e\u5957\u63a5\u5b57\u9009\u9879&#xff0c;\u5141\u8bb8\u91cd\u7528\u5730\u5740\u548c\u7aef\u53e3<\/span><br \/>\n        <span class=\"token keyword\">int<\/span> opt <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">setsockopt<\/span><span class=\"token punctuation\">(<\/span>socketfd<span class=\"token punctuation\">,<\/span> SOL_SOCKET<span class=\"token punctuation\">,<\/span> SO_REUSEADDR <span class=\"token operator\">|<\/span> SO_REUSEPORT<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>opt<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>opt<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u8bb0\u5f55\u4fe1\u606f\u65e5\u5fd7&#xff0c;\u8868\u660e\u5957\u63a5\u5b57\u521b\u5efa\u6210\u529f<\/span><br \/>\n        lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>info<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;socket successfully&#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 comment\">\/**<br \/>\n * \u7ed1\u5b9aIP\u5730\u5740\u548c\u7aef\u53e3\u53f7\u5230\u5957\u63a5\u5b57<br \/>\n *\/<\/span><br \/>\n    <span class=\"token keyword\">void<\/span> <span class=\"token function\">bind<\/span><span class=\"token punctuation\">(<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string ip<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">uint16_t<\/span> port<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u68c0\u67e5\u5957\u63a5\u5b57\u662f\u5426\u6709\u6548<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>socketfd <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>Fatal<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;socket not created&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>    <span class=\"token comment\">\/\/ \u8bb0\u5f55\u81f4\u547d\u9519\u8bef&#xff1a;\u5957\u63a5\u5b57\u672a\u521b\u5efa<\/span><br \/>\n            <span class=\"token function\">exit<\/span><span class=\"token punctuation\">(<\/span>Socket_Error<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>   <span class=\"token comment\">\/\/ \u9000\u51fa\u7a0b\u5e8f&#xff0c;\u5957\u63a5\u5b57\u9519\u8bef<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u521b\u5efa\u670d\u52a1\u5668\u5730\u5740\u7ed3\u6784\u4f53<\/span><br \/>\n        <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sockaddr_in<\/span> server<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">memset<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>server<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>server<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>    <span class=\"token comment\">\/\/ \u5c06\u5730\u5740\u7ed3\u6784\u4f53\u6e05\u96f6<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u8bbe\u7f6e\u5730\u5740\u65cf\u4e3aIPv4<\/span><br \/>\n        server<span class=\"token punctuation\">.<\/span>sin_family <span class=\"token operator\">&#061;<\/span> AF_INET<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u5c06\u7aef\u53e3\u53f7\u4ece\u4e3b\u673a\u5b57\u8282\u5e8f\u8f6c\u6362\u4e3a\u7f51\u7edc\u5b57\u8282\u5e8f<\/span><br \/>\n        server<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><br \/>\n    <span class=\"token comment\">\/\/ \u5904\u7406IP\u5730\u5740<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>ip <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;0.0.0.0&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u7ed1\u5b9a\u5230\u6240\u6709\u53ef\u7528\u7684\u7f51\u7edc\u63a5\u53e3<\/span><br \/>\n            server<span class=\"token punctuation\">.<\/span>sin_addr<span class=\"token punctuation\">.<\/span>s_addr <span class=\"token operator\">&#061;<\/span> INADDR_ANY<span class=\"token punctuation\">;<\/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><span class=\"token function\">inet_pton<\/span><span class=\"token punctuation\">(<\/span>AF_INET<span class=\"token punctuation\">,<\/span> ip<span class=\"token punctuation\">.<\/span><span class=\"token function\">c_str<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>server<span class=\"token punctuation\">.<\/span>sin_addr<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&#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\">\/\/ \u5c06IP\u5730\u5740\u5b57\u7b26\u4e32\u8f6c\u6362\u4e3a\u7f51\u7edc\u5730\u5740\u683c\u5f0f\u5931\u8d25<\/span><br \/>\n            lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>Fatal<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;inet_pton fail&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>    <span class=\"token comment\">\/\/ \u8bb0\u5f55\u81f4\u547d\u9519\u8bef&#xff1a;IP\u5730\u5740\u8f6c\u6362\u5931\u8d25<\/span><br \/>\n            <span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">close<\/span><span class=\"token punctuation\">(<\/span>socketfd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>    <span class=\"token comment\">\/\/ \u5173\u95ed\u5957\u63a5\u5b57<\/span><br \/>\n            socketfd <span class=\"token operator\">&#061;<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span>    <span class=\"token comment\">\/\/ \u91cd\u7f6e\u5957\u63a5\u5b57\u63cf\u8ff0\u7b26<\/span><br \/>\n            <span class=\"token function\">exit<\/span><span class=\"token punctuation\">(<\/span>Bind_Error<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>    <span class=\"token comment\">\/\/ \u9000\u51fa\u7a0b\u5e8f&#xff0c;\u7ed1\u5b9a\u9519\u8bef<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u83b7\u53d6\u670d\u52a1\u5668\u5730\u5740\u7ed3\u6784\u4f53\u7684\u957f\u5ea6<\/span><br \/>\n        socklen_t serverlen <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>server<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u7ed1\u5b9a\u5957\u63a5\u5b57\u5230\u6307\u5b9a\u5730\u5740\u548c\u7aef\u53e3<\/span><br \/>\n        <span class=\"token keyword\">int<\/span> n <span class=\"token operator\">&#061;<\/span> <span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">bind<\/span><span class=\"token punctuation\">(<\/span>socketfd<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>server<span class=\"token punctuation\">,<\/span> serverlen<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u68c0\u67e5\u7ed1\u5b9a\u662f\u5426\u6210\u529f<\/span><br \/>\n        <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><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>Fatal<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;bind error&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>    <span class=\"token comment\">\/\/ \u8bb0\u5f55\u81f4\u547d\u9519\u8bef&#xff1a;\u7ed1\u5b9a\u5931\u8d25<\/span><br \/>\n            <span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">close<\/span><span class=\"token punctuation\">(<\/span>socketfd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>    <span class=\"token comment\">\/\/ \u5173\u95ed\u5957\u63a5\u5b57<\/span><br \/>\n            socketfd <span class=\"token operator\">&#061;<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span>    <span class=\"token comment\">\/\/ \u91cd\u7f6e\u5957\u63a5\u5b57\u63cf\u8ff0\u7b26<\/span><br \/>\n            <span class=\"token function\">exit<\/span><span class=\"token punctuation\">(<\/span>Bind_Error<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>    <span class=\"token comment\">\/\/ \u9000\u51fa\u7a0b\u5e8f&#xff0c;\u7ed1\u5b9a\u9519\u8bef<\/span><\/p>\n<p>        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u8bb0\u5f55\u7ed1\u5b9a\u6210\u529f\u4fe1\u606f<\/span><br \/>\n        lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>info<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;bind successfully&#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 comment\">\/**<br \/>\n * \u76d1\u542c\u51fd\u6570&#xff0c;\u7528\u4e8e\u4f7f\u5957\u63a5\u5b57\u8fdb\u5165\u76d1\u542c\u72b6\u6001&#xff0c;\u51c6\u5907\u63a5\u53d7\u5ba2\u6237\u7aef\u8fde\u63a5<br \/>\n * \u5982\u679c\u5957\u63a5\u5b57\u672a\u521b\u5efa\u6216\u76d1\u542c\u5931\u8d25&#xff0c;\u4f1a\u8bb0\u5f55\u9519\u8bef\u4fe1\u606f\u5e76\u9000\u51fa\u7a0b\u5e8f<br \/>\n *\/<\/span><br \/>\n    <span class=\"token keyword\">void<\/span> <span class=\"token function\">listen<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u68c0\u67e5\u5957\u63a5\u5b57\u662f\u5426\u6709\u6548&#xff08;\u662f\u5426\u5df2\u521b\u5efa&#xff09;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>socketfd <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u8bb0\u5f55\u81f4\u547d\u9519\u8bef&#xff1a;\u5957\u63a5\u5b57\u672a\u521b\u5efa<\/span><br \/>\n            lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>Fatal<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;socket not created&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u9000\u51fa\u7a0b\u5e8f&#xff0c;\u9519\u8bef\u4ee3\u7801\u4e3aSocket_Error<\/span><br \/>\n            <span class=\"token function\">exit<\/span><span class=\"token punctuation\">(<\/span>Socket_Error<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u8c03\u7528\u7cfb\u7edflisten\u51fd\u6570\u5f00\u59cb\u76d1\u542c&#xff0c;\u6700\u5927\u8fde\u63a5\u6570\u4e3aMAXCONNNUM<\/span><br \/>\n        <span class=\"token keyword\">int<\/span> n <span class=\"token operator\">&#061;<\/span> <span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">listen<\/span><span class=\"token punctuation\">(<\/span>socketfd<span class=\"token punctuation\">,<\/span> MAXCONNNUM<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u68c0\u67e5listen\u51fd\u6570\u662f\u5426\u6210\u529f\u6267\u884c<\/span><br \/>\n        <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><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u8bb0\u5f55\u81f4\u547d\u9519\u8bef&#xff1a;\u76d1\u542c\u5931\u8d25<\/span><br \/>\n            lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>Fatal<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;listen error&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u5173\u95ed\u5957\u63a5\u5b57<\/span><br \/>\n            <span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">close<\/span><span class=\"token punctuation\">(<\/span>socketfd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u5c06\u5957\u63a5\u5b57\u63cf\u8ff0\u7b26\u91cd\u7f6e\u4e3a\u65e0\u6548\u503c<\/span><br \/>\n            socketfd <span class=\"token operator\">&#061;<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u9000\u51fa\u7a0b\u5e8f&#xff0c;\u9519\u8bef\u4ee3\u7801\u4e3aListen_Error<\/span><br \/>\n            <span class=\"token function\">exit<\/span><span class=\"token punctuation\">(<\/span>Listen_Error<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u8bb0\u5f55\u4fe1\u606f&#xff1a;\u76d1\u542c\u6210\u529f<\/span><br \/>\n        lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>info<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;listen successfully&#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 comment\">\/**<br \/>\n *  \u5c06socketfd\u8bbe\u7f6e\u4e3a\u975e\u963b\u585e\u6a21\u5f0f<br \/>\n *<br \/>\n * \u8be5\u51fd\u6570\u901a\u8fc7fcntl\u7cfb\u7edf\u8c03\u7528\u4fee\u6539\u6587\u4ef6\u63cf\u8ff0\u7b26\u7684\u6807\u5fd7\u4f4d&#xff0c;<br \/>\n * \u6dfb\u52a0O_NONBLOCK\u6807\u5fd7&#xff0c;\u4f7fsocket\u64cd\u4f5c\u53d8\u4e3a\u975e\u963b\u585e\u6a21\u5f0f\u3002<br \/>\n * \u5728\u975e\u963b\u585e\u6a21\u5f0f\u4e0b&#xff0c;I\/O\u64cd\u4f5c\u4e0d\u4f1a\u963b\u585e\u8fdb\u7a0b&#xff0c;\u800c\u662f\u7acb\u5373\u8fd4\u56de\u3002<br \/>\n *\/<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">setnonblock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u83b7\u53d6\u5f53\u524d\u6587\u4ef6\u63cf\u8ff0\u7b26\u7684\u72b6\u6001\u6807\u5fd7<\/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>socketfd<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><\/p>\n<p>    <span class=\"token comment\">\/\/ \u68c0\u67e5\u83b7\u53d6\u6807\u5fd7\u662f\u5426\u6210\u529f<\/span><br \/>\n    <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>flags <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u8bb0\u5f55\u9519\u8bef\u65e5\u5fd7<\/span><br \/>\n        lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>Fatal<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;fcntl error&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u9000\u51fa\u7a0b\u5e8f&#xff0c;\u8fd4\u56de\u9519\u8bef\u7801<\/span><br \/>\n        <span class=\"token function\">exit<\/span><span class=\"token punctuation\">(<\/span>Setnonblock_Error<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u6dfb\u52a0\u975e\u963b\u585e\u6807\u5fd7<\/span><br \/>\n    flags <span class=\"token operator\">|&#061;<\/span> O_NONBLOCK<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u8bbe\u7f6e\u65b0\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u6807\u5fd7<\/span><br \/>\n    <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">fcntl<\/span><span class=\"token punctuation\">(<\/span>socketfd<span class=\"token punctuation\">,<\/span> F_SETFL<span class=\"token punctuation\">,<\/span> flags<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u8bb0\u5f55\u9519\u8bef\u65e5\u5fd7<\/span><br \/>\n        lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>Fatal<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;fcntl error&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u9000\u51fa\u7a0b\u5e8f&#xff0c;\u8fd4\u56de\u9519\u8bef\u7801<\/span><br \/>\n        <span class=\"token function\">exit<\/span><span class=\"token punctuation\">(<\/span>Setnonblock_Error<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/**\u63a5\u53d7\u5ba2\u6237\u7aef\u8fde\u63a5\u8bf7\u6c42<br \/>\n *<br \/>\n * \u8be5\u51fd\u6570\u5c01\u88c5\u4e86\u7cfb\u7edf\u8c03\u7528accept&#xff0c;\u7528\u4e8e\u63a5\u53d7\u5ba2\u6237\u7aef\u7684\u8fde\u63a5\u8bf7\u6c42\u3002<br \/>\n * \u5b83\u4f1a\u68c0\u67e5socket\u72b6\u6001&#xff0c;\u5904\u7406\u975e\u963b\u585e\u6a21\u5f0f\u4e0b\u7684EAGAIN\u9519\u8bef&#xff0c;<br \/>\n * \u5e76\u8bb0\u5f55\u8fde\u63a5\u5efa\u7acb\u6216\u5931\u8d25\u7684\u65e5\u5fd7\u3002<br \/>\n *\/<\/span><br \/>\n<span class=\"token keyword\">int<\/span> <span class=\"token function\">accept<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sockaddr_in<\/span><span class=\"token operator\">*<\/span> client<span class=\"token punctuation\">,<\/span> socklen_t<span class=\"token operator\">*<\/span> clientlen<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u68c0\u67e5\u76d1\u542csocket\u662f\u5426\u6709\u6548<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>socketfd <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u8bb0\u5f55\u9519\u8bef\u65e5\u5fd7&#xff1a;socket\u672a\u521b\u5efa<\/span><br \/>\n        lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>Fatal<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;socket not created&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u9000\u51fa\u7a0b\u5e8f&#xff0c;\u8fd4\u56desocket\u9519\u8bef\u7801<\/span><br \/>\n        <span class=\"token function\">exit<\/span><span class=\"token punctuation\">(<\/span>Socket_Error<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u8c03\u7528\u7cfb\u7edfaccept\u51fd\u6570\u63a5\u53d7\u5ba2\u6237\u7aef\u8fde\u63a5<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> client_fd <span class=\"token operator\">&#061;<\/span> <span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">accept<\/span><span class=\"token punctuation\">(<\/span>socketfd<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>client<span class=\"token punctuation\">,<\/span> clientlen<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u68c0\u67e5accept\u662f\u5426\u6210\u529f<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>client_fd <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u5904\u7406\u975e\u963b\u585e\u6a21\u5f0f\u4e0b\u7684EAGAIN\/EWOULDBLOCK\u9519\u8bef<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u8fd9\u8868\u793a\u5f53\u524d\u6ca1\u6709\u8fde\u63a5\u53ef\u63a5\u53d7&#xff0c;\u4e0d\u662f\u771f\u6b63\u7684\u9519\u8bef<\/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 keyword\">return<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u8fd4\u56de-1\u8868\u793a\u6682\u65f6\u6ca1\u6709\u8fde\u63a5<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u8bb0\u5f55accept\u9519\u8bef\u65e5\u5fd7<\/span><br \/>\n        lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>Fatal<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;accept 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>  <span class=\"token comment\">\/\/ \u8fd4\u56de-1\u8868\u793aaccept\u5931\u8d25<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u8bb0\u5f55\u6210\u529f\u63a5\u53d7\u8fde\u63a5\u7684\u65e5\u5fd7<\/span><br \/>\n    lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>info<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;accept successfully&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u8fd4\u56de\u65b0\u7684\u5ba2\u6237\u7aefsocket\u6587\u4ef6\u63cf\u8ff0\u7b26<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> client_fd<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/**<br \/>\n * \u8fde\u63a5\u5230\u670d\u52a1\u5668\u7684\u51fd\u6570<br \/>\n *\/<\/span><br \/>\n    <span class=\"token keyword\">void<\/span> <span class=\"token function\">connect<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sockaddr_in<\/span><span class=\"token operator\">*<\/span> server<span class=\"token punctuation\">,<\/span> socklen_t serverlen<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u68c0\u67e5socket\u662f\u5426\u5df2\u521b\u5efa<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>socketfd <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u8bb0\u5f55\u9519\u8bef\u65e5\u5fd7\u5e76\u9000\u51fa\u7a0b\u5e8f<\/span><br \/>\n            lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>Fatal<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;socket not created&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token function\">exit<\/span><span class=\"token punctuation\">(<\/span>Socket_Error<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u5c1d\u8bd5\u8fde\u63a5\u5230\u670d\u52a1\u5668<\/span><br \/>\n        <span class=\"token keyword\">int<\/span> n <span class=\"token operator\">&#061;<\/span> <span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">connect<\/span><span class=\"token punctuation\">(<\/span>socketfd<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>server<span class=\"token punctuation\">,<\/span> serverlen<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u68c0\u67e5\u8fde\u63a5\u662f\u5426\u6210\u529f<\/span><br \/>\n        <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><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u8bb0\u5f55\u9519\u8bef\u65e5\u5fd7&#xff0c;\u5173\u95edsocket&#xff0c;\u91cd\u7f6esocketfd&#xff0c;\u5e76\u9000\u51fa\u7a0b\u5e8f<\/span><br \/>\n            lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>Fatal<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;connect error&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">close<\/span><span class=\"token punctuation\">(<\/span>socketfd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            socketfd <span class=\"token operator\">&#061;<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token function\">exit<\/span><span class=\"token punctuation\">(<\/span>Connect_Error<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u8bb0\u5f55\u8fde\u63a5\u6210\u529f\u7684\u65e5\u5fd7<\/span><br \/>\n        lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>info<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;connect successfully&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">void<\/span> <span class=\"token function\">close<\/span><span class=\"token punctuation\">(<\/span><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>socketfd <span class=\"token operator\">&gt;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">close<\/span><span class=\"token punctuation\">(<\/span>socketfd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            socketfd <span class=\"token operator\">&#061;<\/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><br \/>\n    <span class=\"token function\">sock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> sock<span class=\"token operator\">&amp;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">delete<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    sock<span class=\"token operator\">&amp;<\/span> <span class=\"token keyword\">operator<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> sock<span class=\"token operator\">&amp;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">delete<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">private<\/span><span class=\"token operator\">:<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> socketfd<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>Task.hpp:<\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">pragma<\/span> <span class=\"token expression\">once<\/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;iostream&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;fstream&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;string&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;sys\/types.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;unistd.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;time.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;unordered_map&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\">&#034;protocol.hpp&#034;<\/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\">&#034;log.hpp&#034;<\/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\">&#034;Pollmanager.hpp&#034;<\/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\">BUFFER_SIZE<\/span> <span class=\"token expression\"><span class=\"token number\">1024<\/span><\/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\">RECV_TIMEOUT<\/span> <span class=\"token expression\"><span class=\"token number\">1<\/span><\/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\">RECV_ERROR<\/span> <span class=\"token expression\"><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><\/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\">CLIENT_CLOSE<\/span> <span class=\"token expression\"><span class=\"token number\">2<\/span><\/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;queue&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;mutex&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;atomic&gt;<\/span><\/span><br \/>\n<span class=\"token keyword\">extern<\/span> log lg<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">extern<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string path<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">extern<\/span> std<span class=\"token double-colon punctuation\">::<\/span>mutex send_queues_mtx<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">threadpool<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/**<br \/>\n * \u679a\u4e3e\u7c7b\u578b&#xff1a;\u89e3\u6790\u72b6\u6001<br \/>\n * \u7528\u4e8e\u8868\u793a\u5f53\u524d\u89e3\u6790\u8fc7\u7a0b\u6240\u5904\u7684\u9636\u6bb5\u72b6\u6001<br \/>\n *\/<\/span><br \/>\n<span class=\"token keyword\">enum<\/span> <span class=\"token class-name\">ParseState<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    PARSE_HEDER<span class=\"token punctuation\">,<\/span>  <span class=\"token comment\">\/\/ \u89e3\u6790\u5934\u90e8\u72b6\u6001&#xff0c;\u8868\u793a\u5f53\u524d\u6b63\u5728\u89e3\u6790\u6570\u636e\u5934\u90e8\u90e8\u5206<\/span><br \/>\n    PARSE_BODY    <span class=\"token comment\">\/\/ \u89e3\u6790\u4e3b\u4f53\u72b6\u6001&#xff0c;\u8868\u793a\u5f53\u524d\u6b63\u5728\u89e3\u6790\u6570\u636e\u4e3b\u4f53\u90e8\u5206<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/**<br \/>\n * Connection\u7c7b&#xff0c;\u8868\u793a\u4e00\u4e2a\u7f51\u7edc\u8fde\u63a5<br \/>\n * \u8d1f\u8d23\u7ba1\u7406\u8fde\u63a5\u7684\u8bfb\u5199\u7f13\u51b2\u533a\u3001\u89e3\u6790\u72b6\u6001\u4ee5\u53ca\u6587\u4ef6\u63cf\u8ff0\u7b26\u7b49<br \/>\n *\/<\/span><br \/>\n<span class=\"token keyword\">class<\/span> <span class=\"token class-name\">Connection<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n   <span class=\"token keyword\">public<\/span><span class=\"token operator\">:<\/span><br \/>\n   <span class=\"token comment\">\/**<br \/>\n    * Connection\u7c7b\u7684\u6784\u9020\u51fd\u6570<br \/>\n    *  _fd \u6587\u4ef6\u63cf\u8ff0\u7b26&#xff0c;\u7528\u4e8e\u6807\u8bc6\u7f51\u7edc\u8fde\u63a5<br \/>\n    *\/<\/span><br \/>\n<span class=\"token function\">Connection<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> _fd<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token operator\">:<\/span><span class=\"token function\">write_offset<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span>      <span class=\"token comment\">\/\/ \u5199\u504f\u79fb\u91cf&#xff0c;\u521d\u59cb\u5316\u4e3a0<\/span><br \/>\n<span class=\"token punctuation\">,<\/span><span class=\"token function\">should_close<\/span><span class=\"token punctuation\">(<\/span><span class=\"token boolean\">false<\/span><span class=\"token punctuation\">)<\/span>  <span class=\"token comment\">\/\/ \u662f\u5426\u5e94\u8be5\u5173\u95ed\u8fde\u63a5&#xff0c;\u521d\u59cb\u5316\u4e3afalse<\/span><br \/>\n<span class=\"token punctuation\">,<\/span><span class=\"token function\">parse_state<\/span><span class=\"token punctuation\">(<\/span>PARSE_HEDER<span class=\"token punctuation\">)<\/span>  <span class=\"token comment\">\/\/ \u89e3\u6790\u72b6\u6001&#xff0c;\u521d\u59cb\u5316\u4e3a\u89e3\u6790\u5934\u90e8\u72b6\u6001<\/span><br \/>\n<span class=\"token punctuation\">,<\/span><span class=\"token function\">header_length<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span>     <span class=\"token comment\">\/\/ \u5934\u90e8\u957f\u5ea6&#xff0c;\u521d\u59cb\u5316\u4e3a0<\/span><br \/>\n<span class=\"token punctuation\">,<\/span><span class=\"token function\">body_length<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span>       <span class=\"token comment\">\/\/ \u6570\u636e\u4f53\u957f\u5ea6&#xff0c;\u521d\u59cb\u5316\u4e3a0<\/span><br \/>\n<span class=\"token punctuation\">,<\/span><span class=\"token function\">header<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;&#034;<\/span><span class=\"token punctuation\">)<\/span>           <span class=\"token comment\">\/\/ \u5934\u90e8\u5185\u5bb9&#xff0c;\u521d\u59cb\u5316\u4e3a\u7a7a\u5b57\u7b26\u4e32<\/span><br \/>\n<span class=\"token punctuation\">,<\/span><span class=\"token function\">fd<\/span><span class=\"token punctuation\">(<\/span>_fd<span class=\"token punctuation\">)<\/span>              <span class=\"token comment\">\/\/ \u6587\u4ef6\u63cf\u8ff0\u7b26&#xff0c;\u4f7f\u7528\u4f20\u5165\u7684\u53c2\u6570\u521d\u59cb\u5316<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><\/p>\n<p><span class=\"token punctuation\">}<\/span><br \/>\n   <span class=\"token comment\">\/**<br \/>\n    * Connection\u7c7b\u7684\u6790\u6784\u51fd\u6570<br \/>\n    * \u5982\u679c\u6587\u4ef6\u63cf\u8ff0\u7b26\u6709\u6548&#xff08;\u5927\u4e8e0&#xff09;&#xff0c;\u5219\u5173\u95ed\u8fde\u63a5<br \/>\n    *\/<\/span><br \/>\n<span class=\"token operator\">~<\/span><span class=\"token function\">Connection<\/span><span class=\"token punctuation\">(<\/span><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>fd<span class=\"token operator\">&gt;<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span>  <span class=\"token comment\">\/\/ \u68c0\u67e5\u6587\u4ef6\u63cf\u8ff0\u7b26\u662f\u5426\u6709\u6548<\/span><br \/>\n        <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>  <span class=\"token comment\">\/\/ \u5173\u95ed\u6587\u4ef6\u63cf\u8ff0\u7b26&#xff0c;\u91ca\u653e\u8d44\u6e90<\/span><br \/>\n               <span class=\"token punctuation\">}<\/span><br \/>\n   <span class=\"token punctuation\">}<\/span><br \/>\n   <span class=\"token comment\">\/\/ \u8f93\u5165\u7f13\u51b2\u533a&#xff0c;\u7528\u4e8e\u5b58\u50a8\u63a5\u6536\u5230\u7684\u6570\u636e<\/span><br \/>\n   std<span class=\"token double-colon punctuation\">::<\/span>queue<span class=\"token operator\">&lt;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&gt;<\/span> in_buffer<span class=\"token punctuation\">;<\/span><br \/>\n   <span class=\"token comment\">\/\/ \u8f93\u51fa\u7f13\u51b2\u533a&#xff0c;\u7528\u4e8e\u5b58\u50a8\u5f85\u53d1\u9001\u7684\u6570\u636e<\/span><br \/>\n   std<span class=\"token double-colon punctuation\">::<\/span>queue<span class=\"token operator\">&lt;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&gt;<\/span> out_buffer<span class=\"token punctuation\">;<\/span><br \/>\n   <span class=\"token comment\">\/\/ \u4e92\u65a5\u9501&#xff0c;\u7528\u4e8e\u4fdd\u62a4\u5171\u4eab\u8d44\u6e90\u7684\u8bbf\u95ee<\/span><br \/>\n   std<span class=\"token double-colon punctuation\">::<\/span>mutex mtx<span class=\"token punctuation\">;<\/span><br \/>\n   <span class=\"token comment\">\/\/ \u5199\u504f\u79fb\u91cf&#xff0c;\u8bb0\u5f55\u5f53\u524d\u5199\u5165\u4f4d\u7f6e<\/span><br \/>\n   <span class=\"token keyword\">int<\/span> write_offset<span class=\"token punctuation\">;<\/span><br \/>\n   <span class=\"token comment\">\/\/ \u6807\u8bb0\u8fde\u63a5\u662f\u5426\u5e94\u8be5\u88ab\u5173\u95ed<\/span><br \/>\n   <span class=\"token keyword\">bool<\/span> should_close<span class=\"token punctuation\">;<\/span><br \/>\n   <span class=\"token comment\">\/\/ \u89e3\u6790\u72b6\u6001&#xff0c;\u6307\u793a\u5f53\u524d\u89e3\u6790\u7684\u9636\u6bb5&#xff08;\u5934\u90e8\u3001\u6570\u636e\u4f53\u7b49&#xff09;<\/span><br \/>\n   ParseState parse_state<span class=\"token punctuation\">;<\/span><br \/>\n   <span class=\"token comment\">\/\/ \u5df2\u89e3\u6790\u7684\u5934\u90e8\u957f\u5ea6<\/span><br \/>\n   size_t header_length<span class=\"token punctuation\">;<\/span><br \/>\n   <span class=\"token comment\">\/\/ \u6570\u636e\u4f53\u957f\u5ea6<\/span><br \/>\n   size_t body_length<span class=\"token punctuation\">;<\/span><br \/>\n   <span class=\"token comment\">\/\/ \u5b58\u50a8\u5934\u90e8\u5185\u5bb9<\/span><br \/>\n   std<span class=\"token double-colon punctuation\">::<\/span>string header<span class=\"token punctuation\">;<\/span><br \/>\n   <span class=\"token comment\">\/\/ \u6587\u4ef6\u63cf\u8ff0\u7b26&#xff0c;\u6807\u8bc6\u7f51\u7edc\u8fde\u63a5<\/span><br \/>\n   <span class=\"token keyword\">int<\/span> fd<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">extern<\/span> std<span class=\"token double-colon punctuation\">::<\/span>unordered_map<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token punctuation\">,<\/span>std<span class=\"token double-colon punctuation\">::<\/span>shared_ptr<span class=\"token operator\">&lt;<\/span>Connection<span class=\"token operator\">&gt;&gt;<\/span> send_queues<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/**<br \/>\n *  \u4ecesocket\u63a5\u6536\u6570\u636e\u5e76\u89e3\u6790HTTP\u8bf7\u6c42<br \/>\n *<br \/>\n * \u8be5\u51fd\u6570\u8d1f\u8d23\u4ece\u6307\u5b9a\u7684socket\u63a5\u6536\u6570\u636e&#xff0c;\u89e3\u6790HTTP\u8bf7\u6c42\u5934\u548c\u8bf7\u6c42\u4f53&#xff0c;<br \/>\n * \u5e76\u5c06\u89e3\u6790\u7ed3\u679c\u5b58\u50a8\u5728Http_Request\u5bf9\u8c61\u4e2d\u3002\u5b83\u5904\u7406\u975e\u963b\u585eI\/O&#xff0c;<br \/>\n * \u652f\u6301\u5206\u5757\u63a5\u6536\u6570\u636e&#xff0c;\u5e76\u7ef4\u62a4\u8fde\u63a5\u7684\u89e3\u6790\u72b6\u6001\u3002<br \/>\n *<br \/>\n *\/<\/span><br \/>\n<span class=\"token keyword\">int<\/span> <span class=\"token function\">Get_HttpRequest<\/span><span class=\"token punctuation\">(<\/span>size_t socketfd<span class=\"token punctuation\">,<\/span> Http_Request<span class=\"token operator\">&amp;<\/span> hr<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u52a0\u9501\u67e5\u627e\u5bf9\u5e94\u7684\u8fde\u63a5\u5bf9\u8c61<\/span><br \/>\n    send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">lock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>send_queues<span class=\"token punctuation\">.<\/span><span class=\"token function\">find<\/span><span class=\"token punctuation\">(<\/span>socketfd<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&#061;<\/span> send_queues<span class=\"token punctuation\">.<\/span><span class=\"token function\">end<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> RECV_ERROR<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u8fde\u63a5\u4e0d\u5b58\u5728&#xff0c;\u8fd4\u56de\u9519\u8bef<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u83b7\u53d6\u8fde\u63a5\u5bf9\u8c61\u5e76\u89e3\u9501<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>shared_ptr<span class=\"token operator\">&lt;<\/span>Connection<span class=\"token operator\">&gt;<\/span> conn <span class=\"token operator\">&#061;<\/span> send_queues<span class=\"token punctuation\">[<\/span>socketfd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u786e\u4fdd\u8f93\u5165\u7f13\u51b2\u533a\u81f3\u5c11\u6709\u4e00\u4e2a\u8282\u70b9<\/span><br \/>\n    <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>conn<span class=\"token operator\">-&gt;<\/span>in_buffer<span class=\"token punctuation\">.<\/span><span class=\"token function\">empty<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        conn<span class=\"token operator\">-&gt;<\/span>in_buffer<span class=\"token punctuation\">.<\/span><span class=\"token function\">push<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;&#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 comment\">\/\/ \u83b7\u53d6\u7f13\u51b2\u533a\u524d\u7aef\u7684\u5f15\u7528<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> front_node <span class=\"token operator\">&#061;<\/span> conn<span class=\"token operator\">-&gt;<\/span>in_buffer<span class=\"token punctuation\">.<\/span><span class=\"token function\">front<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u4e34\u65f6\u7f13\u51b2\u533a\u7528\u4e8e\u63a5\u6536\u6570\u636e<\/span><br \/>\n    <span class=\"token keyword\">char<\/span> temp_buffer<span class=\"token punctuation\">[<\/span>BUFFER_SIZE<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u5faa\u73af\u63a5\u6536\u6570\u636e&#xff0c;\u76f4\u5230\u9047\u5230EAGAIN\u9519\u8bef<\/span><br \/>\n    <span class=\"token keyword\">while<\/span><span class=\"token punctuation\">(<\/span><span class=\"token boolean\">true<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u975e\u963b\u585e\u63a5\u6536\u6570\u636e<\/span><br \/>\n        <span class=\"token keyword\">int<\/span> read_bytes <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">recv<\/span><span class=\"token punctuation\">(<\/span>socketfd<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>temp_buffer<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> BUFFER_SIZE <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> MSG_DONTWAIT<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>read_bytes <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u68c0\u67e5\u662f\u5426\u662f\u6682\u65f6\u6ca1\u6709\u6570\u636e\u53ef\u8bfb<\/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 punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u9000\u51fa\u63a5\u6536\u5faa\u73af<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u5176\u4ed6\u9519\u8bef&#xff0c;\u8bb0\u5f55\u65e5\u5fd7\u5e76\u8fd4\u56de\u9519\u8bef<\/span><br \/>\n            lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>Fatal<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;recv error&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> RECV_ERROR<span class=\"token punctuation\">;<\/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>read_bytes <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u5ba2\u6237\u7aef\u5173\u95ed\u4e86\u8fde\u63a5<\/span><br \/>\n            lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>info<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;client closed connection, fd:%d&#034;<\/span><span class=\"token punctuation\">,<\/span> socketfd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> CLIENT_CLOSE<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u5c06\u63a5\u6536\u5230\u7684\u6570\u636e\u8ffd\u52a0\u5230\u7f13\u51b2\u533a<\/span><br \/>\n        front_node<span class=\"token punctuation\">.<\/span><span class=\"token function\">append<\/span><span class=\"token punctuation\">(<\/span>temp_buffer<span class=\"token punctuation\">,<\/span> read_bytes<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u89e3\u6790HTTP\u8bf7\u6c42\u5934<\/span><br \/>\n    <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>conn<span class=\"token operator\">-&gt;<\/span>parse_state <span class=\"token operator\">&#061;&#061;<\/span> PARSE_HEDER<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u67e5\u627e\u8bf7\u6c42\u5934\u7ed3\u675f\u6807\u8bb0<\/span><br \/>\n        size_t head_end_pos <span class=\"token operator\">&#061;<\/span> front_node<span class=\"token punctuation\">.<\/span><span class=\"token function\">find<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\\\\r\\\\n\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>head_end_pos <span class=\"token operator\">&#061;&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token double-colon punctuation\">::<\/span>npos<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u8bf7\u6c42\u5934\u4e0d\u5b8c\u6574&#xff0c;\u7b49\u5f85\u66f4\u591a\u6570\u636e<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> RECV_TIMEOUT<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token keyword\">else<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u63d0\u53d6\u8bf7\u6c42\u5934<\/span><br \/>\n            std<span class=\"token double-colon punctuation\">::<\/span>string head <span class=\"token operator\">&#061;<\/span> front_node<span class=\"token punctuation\">.<\/span><span class=\"token function\">substr<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> front_node<span class=\"token punctuation\">.<\/span><span class=\"token function\">find<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\\\\r\\\\n\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">4<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            conn<span class=\"token operator\">-&gt;<\/span>header <span class=\"token operator\">&#061;<\/span> head<span class=\"token punctuation\">;<\/span><br \/>\n            conn<span class=\"token operator\">-&gt;<\/span>header_length <span class=\"token operator\">&#061;<\/span> head<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>            <span class=\"token comment\">\/\/ \u67e5\u627eContent-Length\u5b57\u6bb5<\/span><br \/>\n            size_t pos <span class=\"token operator\">&#061;<\/span> head<span class=\"token punctuation\">.<\/span><span class=\"token function\">find<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Content-Length:&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>pos <span class=\"token operator\">&#061;&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token double-colon punctuation\">::<\/span>npos<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token comment\">\/\/ \u5c1d\u8bd5\u5c0f\u5199\u5f62\u5f0f<\/span><br \/>\n                pos <span class=\"token operator\">&#061;<\/span> head<span class=\"token punctuation\">.<\/span><span class=\"token function\">find<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;content-length:&#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 keyword\">if<\/span><span class=\"token punctuation\">(<\/span>pos <span class=\"token operator\">!&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token double-colon punctuation\">::<\/span>npos<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token comment\">\/\/ \u63d0\u53d6Content-Length\u503c<\/span><br \/>\n                size_t endpos <span class=\"token operator\">&#061;<\/span> head<span class=\"token punctuation\">.<\/span><span class=\"token function\">find<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span> pos<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                std<span class=\"token double-colon punctuation\">::<\/span>string content_length_str <span class=\"token operator\">&#061;<\/span> head<span class=\"token punctuation\">.<\/span><span class=\"token function\">substr<\/span><span class=\"token punctuation\">(<\/span>pos <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">15<\/span><span class=\"token punctuation\">,<\/span> endpos <span class=\"token operator\">&#8211;<\/span> pos <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">15<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                size_t content_length <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">stoi<\/span><span class=\"token punctuation\">(<\/span>content_length_str<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                conn<span class=\"token operator\">-&gt;<\/span>body_length <span class=\"token operator\">&#061;<\/span> content_length<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n            <span class=\"token keyword\">else<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token comment\">\/\/ \u6ca1\u6709Content-Length\u5b57\u6bb5&#xff0c;\u8868\u793a\u6ca1\u6709\u8bf7\u6c42\u4f53<\/span><br \/>\n                conn<span class=\"token operator\">-&gt;<\/span>body_length <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\">\/\/ \u66f4\u65b0\u89e3\u6790\u72b6\u6001<\/span><br \/>\n            conn<span class=\"token operator\">-&gt;<\/span>parse_state <span class=\"token operator\">&#061;<\/span> PARSE_BODY<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u89e3\u6790HTTP\u8bf7\u6c42\u4f53<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>string body<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>conn<span class=\"token operator\">-&gt;<\/span>parse_state <span class=\"token operator\">&#061;&#061;<\/span> PARSE_BODY<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u8ba1\u7b97\u5269\u4f59\u6570\u636e\u91cf<\/span><br \/>\n        size_t remaining <span class=\"token operator\">&#061;<\/span> front_node<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span> conn<span class=\"token operator\">-&gt;<\/span>header_length<span class=\"token punctuation\">;<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>string extra_data <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;&#034;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>remaining <span class=\"token operator\">&lt;<\/span> conn<span class=\"token operator\">-&gt;<\/span>body_length<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u8bf7\u6c42\u4f53\u4e0d\u5b8c\u6574&#xff0c;\u7b49\u5f85\u66f4\u591a\u6570\u636e<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> RECV_TIMEOUT<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token keyword\">else<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u63d0\u53d6\u8bf7\u6c42\u4f53<\/span><br \/>\n            body <span class=\"token operator\">&#061;<\/span> front_node<span class=\"token punctuation\">.<\/span><span class=\"token function\">substr<\/span><span class=\"token punctuation\">(<\/span>conn<span class=\"token operator\">-&gt;<\/span>header_length<span class=\"token punctuation\">,<\/span> conn<span class=\"token operator\">-&gt;<\/span>body_length<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u5904\u7406\u591a\u4f59\u7684\u6570\u636e&#xff08;\u53ef\u80fd\u5305\u542b\u4e0b\u4e00\u4e2a\u8bf7\u6c42\u7684\u5f00\u59cb&#xff09;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>remaining <span class=\"token operator\">&gt;<\/span> conn<span class=\"token operator\">-&gt;<\/span>body_length<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            extra_data <span class=\"token operator\">&#061;<\/span> front_node<span class=\"token punctuation\">.<\/span><span class=\"token function\">substr<\/span><span class=\"token punctuation\">(<\/span>conn<span class=\"token operator\">-&gt;<\/span>header_length <span class=\"token operator\">&#043;<\/span> conn<span class=\"token operator\">-&gt;<\/span>body_length<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u5c06\u591a\u4f59\u7684\u6570\u636e\u653e\u56de\u7f13\u51b2\u533a<\/span><br \/>\n        conn<span class=\"token operator\">-&gt;<\/span>in_buffer<span class=\"token punctuation\">.<\/span><span class=\"token function\">push<\/span><span class=\"token punctuation\">(<\/span>extra_data<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u8bbe\u7f6e\u8bf7\u6c42\u4f53\u5e76\u53cd\u5e8f\u5217\u5316\u8bf7\u6c42\u5934<\/span><br \/>\n        hr<span class=\"token punctuation\">.<\/span>text <span class=\"token operator\">&#061;<\/span> body<span class=\"token punctuation\">;<\/span><br \/>\n        hr<span class=\"token punctuation\">.<\/span><span class=\"token function\">Deserialization<\/span><span class=\"token punctuation\">(<\/span>conn<span class=\"token operator\">-&gt;<\/span>header<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        hr<span class=\"token punctuation\">.<\/span><span class=\"token function\">debugprint<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u79fb\u9664\u5df2\u5904\u7406\u7684\u6570\u636e<\/span><br \/>\n        conn<span class=\"token operator\">-&gt;<\/span>in_buffer<span class=\"token punctuation\">.<\/span><span class=\"token function\">pop<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u91cd\u7f6e\u89e3\u6790\u72b6\u6001<\/span><br \/>\n        conn<span class=\"token operator\">-&gt;<\/span>parse_state <span class=\"token operator\">&#061;<\/span> PARSE_HEDER<span class=\"token punctuation\">;<\/span><br \/>\n        conn<span class=\"token operator\">-&gt;<\/span>header_length <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        conn<span class=\"token operator\">-&gt;<\/span>body_length <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        conn<span class=\"token operator\">-&gt;<\/span>header <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;&#034;<\/span><span class=\"token punctuation\">;<\/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>  <span class=\"token comment\">\/\/ \u6210\u529f\u89e3\u6790\u8bf7\u6c42<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/**<br \/>\n * \u8bfb\u53d6\u6587\u4ef6\u5185\u5bb9\u5e76\u8fd4\u56de\u5b57\u7b26\u4e32<br \/>\n *  file_path \u6587\u4ef6\u8def\u5f84<br \/>\n * return \u6587\u4ef6\u5185\u5bb9\u5b57\u7b26\u4e32&#xff0c;\u5982\u679c\u6587\u4ef6\u4e0d\u5b58\u5728\u5219\u8fd4\u56de\u7a7a\u5b57\u7b26\u4e32<br \/>\n *\/<\/span><br \/>\nstd<span class=\"token double-colon punctuation\">::<\/span>string <span class=\"token function\">read_file<\/span><span class=\"token punctuation\">(<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string file_path<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u4ee5\u4e8c\u8fdb\u5236\u6a21\u5f0f\u6253\u5f00\u6587\u4ef6<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>ifstream <span class=\"token function\">file<\/span><span class=\"token punctuation\">(<\/span>file_path<span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span>ios<span class=\"token double-colon punctuation\">::<\/span>binary<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u68c0\u67e5\u6587\u4ef6\u662f\u5426\u6210\u529f\u6253\u5f00<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>file<span class=\"token punctuation\">.<\/span><span class=\"token function\">is_open<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u8bb0\u5f55\u6587\u4ef6\u672a\u627e\u5230\u7684\u65e5\u5fd7<\/span><br \/>\n        lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>info<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;file not found:%s&#034;<\/span><span class=\"token punctuation\">,<\/span> file_path<span class=\"token punctuation\">.<\/span><span class=\"token function\">c_str<\/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 keyword\">return<\/span> <span class=\"token string\">&#034;&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u83b7\u53d6\u6587\u4ef6\u8d77\u59cb\u4f4d\u7f6e<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>streampos start <span class=\"token operator\">&#061;<\/span> file<span class=\"token punctuation\">.<\/span><span class=\"token function\">tellg<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u5c06\u6587\u4ef6\u6307\u9488\u79fb\u52a8\u5230\u672b\u5c3e<\/span><br \/>\n    file<span class=\"token punctuation\">.<\/span><span class=\"token function\">seekg<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span>ios<span class=\"token double-colon punctuation\">::<\/span>end<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u83b7\u53d6\u6587\u4ef6\u7ed3\u675f\u4f4d\u7f6e<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>streampos end <span class=\"token operator\">&#061;<\/span> file<span class=\"token punctuation\">.<\/span><span class=\"token function\">tellg<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u8ba1\u7b97\u6587\u4ef6\u5927\u5c0f<\/span><br \/>\n    size_t file_size <span class=\"token operator\">&#061;<\/span> end <span class=\"token operator\">&#8211;<\/span> start<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u521b\u5efa\u5b57\u7b26\u4e32\u5e76\u8c03\u6574\u5927\u5c0f\u4ee5\u5bb9\u7eb3\u6587\u4ef6\u5185\u5bb9<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>string content<span class=\"token punctuation\">;<\/span><br \/>\n    content<span class=\"token punctuation\">.<\/span><span class=\"token function\">resize<\/span><span class=\"token punctuation\">(<\/span>file_size<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u5c06\u6587\u4ef6\u6307\u9488\u91cd\u7f6e\u5230\u6587\u4ef6\u5f00\u5934<\/span><br \/>\n    file<span class=\"token punctuation\">.<\/span><span class=\"token function\">seekg<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span>ios<span class=\"token double-colon punctuation\">::<\/span>beg<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u8bfb\u53d6\u6587\u4ef6\u5185\u5bb9\u5230\u5b57\u7b26\u4e32<\/span><br \/>\n    file<span class=\"token punctuation\">.<\/span><span class=\"token function\">read<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>content<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> file_size<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u5173\u95ed\u6587\u4ef6<\/span><br \/>\n    file<span class=\"token punctuation\">.<\/span><span class=\"token function\">close<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> content<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>std<span class=\"token double-colon punctuation\">::<\/span>string <span class=\"token function\">Http_Get_Handler<\/span><span class=\"token punctuation\">(<\/span>Http_Request<span class=\"token operator\">&amp;<\/span> hr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/**<br \/>\n * \u5904\u7406HTTP\u9519\u8bef\u8bf7\u6c42\u7684\u51fd\u6570&#xff0c;\u8fd4\u56de\u4e00\u4e2a400 Bad Request\u7684HTTP\u54cd\u5e94<br \/>\n *  hr HTTP\u8bf7\u6c42\u5bf9\u8c61&#xff0c;\u5305\u542b\u8bf7\u6c42\u5934\u7b49\u4fe1\u606f<br \/>\n * return \u8fd4\u56de\u4e00\u4e2a\u683c\u5f0f\u5316\u7684HTTP\u54cd\u5e94\u5b57\u7b26\u4e32&#xff0c;\u5305\u542b\u72b6\u6001\u884c\u3001\u5934\u90e8\u548c\u5185\u5bb9<br \/>\n *\/<\/span><br \/>\nstd<span class=\"token double-colon punctuation\">::<\/span>string <span class=\"token function\">process_bad_request<\/span><span class=\"token punctuation\">(<\/span>Http_Request<span class=\"token operator\">&amp;<\/span> hr<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u8bb0\u5f55\u9519\u8bef\u65e5\u5fd7&#xff0c;\u7ea7\u522b\u4e3aFatal<\/span><br \/>\n    lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>Fatal<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;bad request body&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u8bbe\u7f6eHTTP\u54cd\u5e94\u72b6\u6001\u884c<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>string headler_line <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;HTTP\/1.0 400 Bad Request\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u521d\u59cb\u5316\u54cd\u5e94\u5934\u5b57\u7b26\u4e32<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>string header<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u6839\u636e\u8bf7\u6c42\u4e2d\u7684Connection\u5934\u51b3\u5b9a\u4fdd\u6301\u8fde\u63a5\u8fd8\u662f\u5173\u95ed\u8fde\u63a5<\/span><br \/>\n    <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>hr<span class=\"token punctuation\">.<\/span>headers<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;Connection&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token operator\">&#061;&#061;<\/span><span class=\"token string\">&#034;close&#034;<\/span><span class=\"token operator\">||<\/span>hr<span class=\"token punctuation\">.<\/span>headers<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;Connection&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token operator\">&#061;&#061;<\/span><span class=\"token string\">&#034;Close&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u8bbe\u7f6eConnection\u5934\u4e3aClose<\/span><br \/>\n           header<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Connection: Close\\\\r\\\\n&#034;<\/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>hr<span class=\"token punctuation\">.<\/span>headers<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;Connection&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token operator\">&#061;&#061;<\/span><span class=\"token string\">&#034;keep-alive&#034;<\/span><span class=\"token operator\">||<\/span>hr<span class=\"token punctuation\">.<\/span>headers<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;Connection&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token operator\">&#061;&#061;<\/span><span class=\"token string\">&#034;Keep-Alive&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u8bbe\u7f6eConnection\u5934\u4e3aKeep-Alive<\/span><br \/>\n         header<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Connection: Keep-Alive\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u8bbe\u7f6e\u54cd\u5e94\u5185\u5bb9<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>string content <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;Bad Request&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u6dfb\u52a0Content-Length\u5934&#xff0c;\u6307\u793a\u54cd\u5e94\u5185\u5bb9\u7684\u957f\u5ea6<\/span><br \/>\n    header <span class=\"token operator\">&#043;&#061;<\/span> <span class=\"token string\">&#034;Content-Length: &#034;<\/span> <span class=\"token operator\">&#043;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">to_string<\/span><span class=\"token punctuation\">(<\/span>content<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token string\">&#034;\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u6dfb\u52a0Content-Type\u5934&#xff0c;\u6307\u793a\u54cd\u5e94\u5185\u5bb9\u7684\u7c7b\u578b\u4e3a\u7eaf\u6587\u672c<\/span><br \/>\n    header <span class=\"token operator\">&#043;&#061;<\/span> <span class=\"token string\">&#034;Content-Type: text\/plain\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u6dfb\u52a0\u7a7a\u884c&#xff0c;\u8868\u793a\u5934\u90e8\u7ed3\u675f<\/span><br \/>\n    header <span class=\"token operator\">&#043;&#061;<\/span> <span class=\"token string\">&#034;\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u8fd4\u56de\u5b8c\u6574\u7684HTTP\u54cd\u5e94&#xff1a;\u72b6\u6001\u884c &#043; \u5934\u90e8 &#043; \u5185\u5bb9<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> headler_line <span class=\"token operator\">&#043;<\/span> header <span class=\"token operator\">&#043;<\/span> content<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token comment\">\/**<br \/>\n * \u6267\u884c\u7b80\u5355\u7684\u56db\u5219\u8fd0\u7b97\u8ba1\u7b97<br \/>\n *<br \/>\n * \u8be5\u51fd\u6570\u4ece\u8f93\u5165\u7684\u53c2\u6570\u6620\u5c04\u4e2d\u63d0\u53d6\u64cd\u4f5c\u6570\u548c\u8fd0\u7b97\u7b26&#xff0c;\u6267\u884c\u76f8\u5e94\u7684\u6570\u5b66\u8fd0\u7b97&#xff0c;<br \/>\n * \u5e76\u5c06\u7ed3\u679c\u5b58\u50a8\u5728\u8f93\u51fa\u53c2\u6570\u4e2d\u3002\u652f\u6301\u5904\u7406URL\u7f16\u7801\u7684\u8fd0\u7b97\u7b26\u3002<br \/>\n *<br \/>\n *  val \u5305\u542b\u8ba1\u7b97\u53c2\u6570\u7684\u952e\u503c\u5bf9\u6620\u5c04&#xff0c;\u952e\u5305\u62ec&#034;a&#034;\u3001&#034;b&#034;\u548c&#034;op&#034;<br \/>\n *  result \u7528\u4e8e\u5b58\u50a8\u8ba1\u7b97\u7ed3\u679c\u7684\u5f15\u7528\u53c2\u6570<br \/>\n * return bool \u8ba1\u7b97\u6210\u529f\u8fd4\u56detrue&#xff0c;\u5931\u8d25\u8fd4\u56defalse<br \/>\n *\/<\/span><br \/>\n<span class=\"token keyword\">bool<\/span> <span class=\"token function\">process_calculation<\/span><span class=\"token punctuation\">(<\/span>std<span class=\"token double-colon punctuation\">::<\/span>unordered_map<span class=\"token operator\">&lt;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&gt;<\/span><span class=\"token operator\">&amp;<\/span> val<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span><span class=\"token operator\">&amp;<\/span> result<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u4ece\u53c2\u6570\u6620\u5c04\u4e2d\u63d0\u53d6\u64cd\u4f5c\u6570a\u548cb&#xff0c;\u5e76\u8f6c\u6362\u4e3a\u6574\u6570<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> a <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">stoi<\/span><span class=\"token punctuation\">(<\/span>val<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;a&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> b <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">stoi<\/span><span class=\"token punctuation\">(<\/span>val<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;b&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u83b7\u53d6\u8fd0\u7b97\u7b26<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>string op <span class=\"token operator\">&#061;<\/span> val<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;op&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u5904\u7406URL\u7f16\u7801\u7684\u8fd0\u7b97\u7b26&#xff0c;\u7edf\u4e00\u8f6c\u6362\u4e3a\u6807\u51c6\u8fd0\u7b97\u7b26<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>op <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;&#043;&#034;<\/span> <span class=\"token operator\">||<\/span> op <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;%2B&#034;<\/span> <span class=\"token operator\">||<\/span> op <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;%2b&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        op <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;&#043;&#034;<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u52a0\u53f7<\/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>op <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;-&#034;<\/span> <span class=\"token operator\">||<\/span> op <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;%2D&#034;<\/span> <span class=\"token operator\">||<\/span> op <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;%2d&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        op <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;-&#034;<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u51cf\u53f7<\/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>op <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;*&#034;<\/span> <span class=\"token operator\">||<\/span> op <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;%2A&#034;<\/span> <span class=\"token operator\">||<\/span> op <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;%2a&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        op <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;*&#034;<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u4e58\u53f7<\/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>op <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;\/&#034;<\/span> <span class=\"token operator\">||<\/span> op <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;%2F&#034;<\/span> <span class=\"token operator\">||<\/span> op <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;%2f&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        op <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;\/&#034;<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u9664\u53f7<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">else<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u4e0d\u652f\u6301\u7684\u8fd0\u7b97\u7b26&#xff0c;\u8bb0\u5f55\u9519\u8bef\u65e5\u5fd7\u5e76\u8fd4\u56defalse<\/span><br \/>\n        lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>Fatal<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;unsupported operator:%s&#034;<\/span><span class=\"token punctuation\">,<\/span> op<span class=\"token punctuation\">.<\/span><span class=\"token function\">c_str<\/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 keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u6839\u636e\u8fd0\u7b97\u7b26\u6267\u884c\u76f8\u5e94\u7684\u8ba1\u7b97<\/span><br \/>\n    <span class=\"token keyword\">switch<\/span> <span class=\"token punctuation\">(<\/span>op<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><br \/>\n        <span class=\"token keyword\">case<\/span> <span class=\"token char\">&#039;&#043;&#039;<\/span><span class=\"token operator\">:<\/span><br \/>\n            result <span class=\"token operator\">&#061;<\/span> a <span class=\"token operator\">&#043;<\/span> b<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u52a0\u6cd5<\/span><br \/>\n            <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">case<\/span> <span class=\"token char\">&#039;-&#039;<\/span><span class=\"token operator\">:<\/span><br \/>\n            result <span class=\"token operator\">&#061;<\/span> a <span class=\"token operator\">&#8211;<\/span> b<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u51cf\u6cd5<\/span><br \/>\n            <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">case<\/span> <span class=\"token char\">&#039;*&#039;<\/span><span class=\"token operator\">:<\/span><br \/>\n            result <span class=\"token operator\">&#061;<\/span> a <span class=\"token operator\">*<\/span> b<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u4e58\u6cd5<\/span><br \/>\n            <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">case<\/span> <span class=\"token char\">&#039;\/&#039;<\/span><span class=\"token operator\">:<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u68c0\u67e5\u9664\u6570\u662f\u5426\u4e3a\u96f6<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>b <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>warning<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;division by zero&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n            result <span class=\"token operator\">&#061;<\/span> a <span class=\"token operator\">\/<\/span> b<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u9664\u6cd5<\/span><br \/>\n            <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u8ba1\u7b97\u6210\u529f&#xff0c;\u8fd4\u56detrue<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/**<br \/>\n * \u5904\u7406HTTP POST\u8bf7\u6c42\u7684\u51fd\u6570<br \/>\n *  hr HTTP\u8bf7\u6c42\u5bf9\u8c61&#xff0c;\u5305\u542b\u8bf7\u6c42\u7684URL\u3001\u5934\u90e8\u4fe1\u606f\u548c\u8bf7\u6c42\u4f53\u7b49<br \/>\n * return \u8fd4\u56de\u5904\u7406\u540e\u7684HTTP\u54cd\u5e94\u5b57\u7b26\u4e32<br \/>\n *\/<\/span><br \/>\nstd<span class=\"token double-colon punctuation\">::<\/span>string <span class=\"token function\">Http_Post_Handler<\/span><span class=\"token punctuation\">(<\/span>Http_Request<span class=\"token operator\">&amp;<\/span> hr<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>string res<span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u7528\u4e8e\u5b58\u50a8\u6700\u7ec8\u7684HTTP\u54cd\u5e94<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>unordered_map<span class=\"token operator\">&lt;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&gt;<\/span>val<span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u5b58\u50a8\u89e3\u6790\u540e\u7684\u952e\u503c\u5bf9<\/span><br \/>\n    size_t start <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u7528\u4e8e\u8bb0\u5f55\u5b57\u7b26\u4e32\u67e5\u627e\u7684\u8d77\u59cb\u4f4d\u7f6e<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u5904\u7406&#034;\/calc&#034;\u8def\u5f84\u7684POST\u8bf7\u6c42<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>hr<span class=\"token punctuation\">.<\/span>url <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;\/calc&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>string body <span class=\"token operator\">&#061;<\/span> hr<span class=\"token punctuation\">.<\/span>text<span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u83b7\u53d6HTTP\u8bf7\u6c42\u4f53<\/span><br \/>\n        size_t pos1 <span class=\"token operator\">&#061;<\/span> body<span class=\"token punctuation\">.<\/span><span class=\"token function\">find<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;&amp;&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u67e5\u627e\u7b2c\u4e00\u4e2a\u5206\u9694\u7b26&#034;&amp;&#034;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>pos1 <span class=\"token operator\">&#061;&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token double-colon punctuation\">::<\/span>npos<span class=\"token punctuation\">)<\/span> <span class=\"token comment\">\/\/ \u5982\u679c\u6ca1\u6709\u627e\u5230\u5206\u9694\u7b26&#xff0c;\u8fd4\u56de\u9519\u8bef\u54cd\u5e94<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token function\">process_bad_request<\/span><span class=\"token punctuation\">(<\/span>hr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u89e3\u6790\u7b2c\u4e00\u4e2a\u952e\u503c\u5bf9<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>string expression <span class=\"token operator\">&#061;<\/span> body<span class=\"token punctuation\">.<\/span><span class=\"token function\">substr<\/span><span class=\"token punctuation\">(<\/span>start<span class=\"token punctuation\">,<\/span> pos1<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        size_t pos2 <span class=\"token operator\">&#061;<\/span> expression<span class=\"token punctuation\">.<\/span><span class=\"token function\">find<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;&#061;&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u67e5\u627e\u952e\u503c\u5206\u9694\u7b26&#034;&#061;&#034;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>pos2 <span class=\"token operator\">&#061;&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token double-colon punctuation\">::<\/span>npos<span class=\"token punctuation\">)<\/span> <span class=\"token comment\">\/\/ \u5982\u679c\u6ca1\u6709\u627e\u5230\u5206\u9694\u7b26&#xff0c;\u8fd4\u56de\u9519\u8bef\u54cd\u5e94<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token function\">process_bad_request<\/span><span class=\"token punctuation\">(<\/span>hr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>string result_key_str <span class=\"token operator\">&#061;<\/span> expression<span class=\"token punctuation\">.<\/span><span class=\"token function\">substr<\/span><span class=\"token punctuation\">(<\/span>start<span class=\"token punctuation\">,<\/span> pos2<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u63d0\u53d6\u952e<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>string result_value_str <span class=\"token operator\">&#061;<\/span> expression<span class=\"token punctuation\">.<\/span><span class=\"token function\">substr<\/span><span class=\"token punctuation\">(<\/span>pos2 <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u63d0\u53d6\u503c<\/span><br \/>\n        val<span class=\"token punctuation\">[<\/span>result_key_str<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> result_value_str<span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u5b58\u50a8\u5230map\u4e2d<\/span><br \/>\n        start <span class=\"token operator\">&#061;<\/span> pos1 <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u66f4\u65b0\u67e5\u627e\u8d77\u59cb\u4f4d\u7f6e<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u89e3\u6790\u7b2c\u4e8c\u4e2a\u952e\u503c\u5bf9<\/span><br \/>\n        pos1 <span class=\"token operator\">&#061;<\/span> body<span class=\"token punctuation\">.<\/span><span class=\"token function\">find<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;&amp;&#034;<\/span><span class=\"token punctuation\">,<\/span> start<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u67e5\u627e\u4e0b\u4e00\u4e2a\u5206\u9694\u7b26<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>pos1 <span class=\"token operator\">&#061;&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token double-colon punctuation\">::<\/span>npos<span class=\"token punctuation\">)<\/span> <span class=\"token comment\">\/\/ \u5982\u679c\u6ca1\u6709\u627e\u5230\u5206\u9694\u7b26&#xff0c;\u8fd4\u56de\u9519\u8bef\u54cd\u5e94<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token function\">process_bad_request<\/span><span class=\"token punctuation\">(<\/span>hr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        pos2 <span class=\"token operator\">&#061;<\/span> body<span class=\"token punctuation\">.<\/span><span class=\"token function\">find<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;&#061;&#034;<\/span><span class=\"token punctuation\">,<\/span> start<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u67e5\u627e\u952e\u503c\u5206\u9694\u7b26<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>pos2 <span class=\"token operator\">&#061;&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token double-colon punctuation\">::<\/span>npos <span class=\"token operator\">||<\/span> pos2 <span class=\"token operator\">&gt;<\/span> pos1<span class=\"token punctuation\">)<\/span> <span class=\"token comment\">\/\/ \u5982\u679c\u683c\u5f0f\u9519\u8bef&#xff0c;\u8fd4\u56de\u9519\u8bef\u54cd\u5e94<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token function\">process_bad_request<\/span><span class=\"token punctuation\">(<\/span>hr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        result_key_str <span class=\"token operator\">&#061;<\/span> body<span class=\"token punctuation\">.<\/span><span class=\"token function\">substr<\/span><span class=\"token punctuation\">(<\/span>start<span class=\"token punctuation\">,<\/span> pos2 <span class=\"token operator\">&#8211;<\/span> start<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u63d0\u53d6\u952e<\/span><br \/>\n        result_value_str <span class=\"token operator\">&#061;<\/span> body<span class=\"token punctuation\">.<\/span><span class=\"token function\">substr<\/span><span class=\"token punctuation\">(<\/span>pos2 <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> pos1 <span class=\"token operator\">&#8211;<\/span> pos2 <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u63d0\u53d6\u503c<\/span><br \/>\n        val<span class=\"token punctuation\">[<\/span>result_key_str<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> result_value_str<span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u5b58\u50a8\u5230map\u4e2d<\/span><br \/>\n        start <span class=\"token operator\">&#061;<\/span> pos1 <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u66f4\u65b0\u67e5\u627e\u8d77\u59cb\u4f4d\u7f6e<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u89e3\u6790\u7b2c\u4e09\u4e2a\u952e\u503c\u5bf9<\/span><br \/>\n        pos2 <span class=\"token operator\">&#061;<\/span> body<span class=\"token punctuation\">.<\/span><span class=\"token function\">find<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;&#061;&#034;<\/span><span class=\"token punctuation\">,<\/span> start<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u67e5\u627e\u952e\u503c\u5206\u9694\u7b26<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>pos2 <span class=\"token operator\">&#061;&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token double-colon punctuation\">::<\/span>npos<span class=\"token punctuation\">)<\/span> <span class=\"token comment\">\/\/ \u5982\u679c\u6ca1\u6709\u627e\u5230\u5206\u9694\u7b26&#xff0c;\u8fd4\u56de\u9519\u8bef\u54cd\u5e94<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token function\">process_bad_request<\/span><span class=\"token punctuation\">(<\/span>hr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        result_key_str <span class=\"token operator\">&#061;<\/span> body<span class=\"token punctuation\">.<\/span><span class=\"token function\">substr<\/span><span class=\"token punctuation\">(<\/span>start<span class=\"token punctuation\">,<\/span> pos2 <span class=\"token operator\">&#8211;<\/span> start<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u63d0\u53d6\u952e<\/span><br \/>\n        result_value_str <span class=\"token operator\">&#061;<\/span> body<span class=\"token punctuation\">.<\/span><span class=\"token function\">substr<\/span><span class=\"token punctuation\">(<\/span>pos2 <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u63d0\u53d6\u503c<\/span><br \/>\n        val<span class=\"token punctuation\">[<\/span>result_key_str<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> result_value_str<span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u5b58\u50a8\u5230map\u4e2d<\/span><br \/>\n        <span class=\"token keyword\">int<\/span> calc_result<span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u5b58\u50a8\u8ba1\u7b97\u7ed3\u679c<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">process_calculation<\/span><span class=\"token punctuation\">(<\/span>val<span class=\"token punctuation\">,<\/span> calc_result<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token comment\">\/\/ \u5982\u679c\u8ba1\u7b97\u5931\u8d25&#xff0c;\u8fd4\u56de\u9519\u8bef\u54cd\u5e94<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token function\">process_bad_request<\/span><span class=\"token punctuation\">(<\/span>hr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u6784\u5efaHTTP\u54cd\u5e94\u5934<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>string headler_line <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;HTTP\/1.0 200 OK\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u72b6\u6001\u884c<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>string header<span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u54cd\u5e94\u5934<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u6839\u636e\u8bf7\u6c42\u5934\u4e2d\u7684Connection\u5b57\u6bb5\u51b3\u5b9a\u8fde\u63a5\u65b9\u5f0f<\/span><br \/>\n        <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>hr<span class=\"token punctuation\">.<\/span>headers<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;Connection&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token operator\">&#061;&#061;<\/span><span class=\"token string\">&#034;close&#034;<\/span><span class=\"token operator\">||<\/span> hr<span class=\"token punctuation\">.<\/span>headers<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;Connection&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token operator\">&#061;&#061;<\/span><span class=\"token string\">&#034;Close&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n             header <span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Connection: Close\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u5173\u95ed\u8fde\u63a5<\/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>hr<span class=\"token punctuation\">.<\/span>headers<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;Connection&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token operator\">&#061;&#061;<\/span><span class=\"token string\">&#034;keep-alive&#034;<\/span><span class=\"token operator\">||<\/span> hr<span class=\"token punctuation\">.<\/span>headers<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;Connection&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token operator\">&#061;&#061;<\/span><span class=\"token string\">&#034;Keep-Alive&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n           header<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Connection: Keep-Alive\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">;<\/span>    <span class=\"token comment\">\/\/ \u4fdd\u6301\u8fde\u63a5<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        header <span class=\"token operator\">&#043;&#061;<\/span> <span class=\"token string\">&#034;Content-Type: text\/html\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u5185\u5bb9\u7c7b\u578b\u4e3aHTML<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u6784\u5efaHTML\u54cd\u5e94\u4f53<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>string content <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;&lt;html&gt;&lt;head&gt;&lt;meta charset&#061;&#039;UTF-8&#039;&gt;&lt;\/head&gt;&lt;body&gt;&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        content <span class=\"token operator\">&#043;&#061;<\/span> <span class=\"token string\">&#034;&lt;h2&gt;\u8ba1\u7b97\u7ed3\u679c\u5c55\u793a&lt;\/h2&gt;&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        content <span class=\"token operator\">&#043;&#061;<\/span> <span class=\"token string\">&#034;&lt;p style&#061;&#039;font-size:24px;&#039;&gt;\u7ed3\u679c\u4e3a: &#034;<\/span> <span class=\"token operator\">&#043;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">to_string<\/span><span class=\"token punctuation\">(<\/span>calc_result<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token string\">&#034;&lt;\/p&gt;&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        content <span class=\"token operator\">&#043;&#061;<\/span> <span class=\"token string\">&#034;&lt;a href&#061;&#039;\/&#039;&gt;\u8fd4\u56de\u9996\u9875&lt;\/a&gt;&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        content <span class=\"token operator\">&#043;&#061;<\/span> <span class=\"token string\">&#034;&lt;\/body&gt;&lt;\/html&gt;&#034;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u5b8c\u6210\u54cd\u5e94\u5934<\/span><br \/>\n        header <span class=\"token operator\">&#043;&#061;<\/span> <span class=\"token string\">&#034;Content-Length: &#034;<\/span> <span class=\"token operator\">&#043;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">to_string<\/span><span class=\"token punctuation\">(<\/span>content<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token string\">&#034;\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u5185\u5bb9\u957f\u5ea6<\/span><br \/>\n        header <span class=\"token operator\">&#043;&#061;<\/span> <span class=\"token string\">&#034;\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u7a7a\u884c&#xff0c;\u8868\u793a\u5934\u90e8\u7ed3\u675f<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u7ec4\u5408\u5b8c\u6574\u7684HTTP\u54cd\u5e94<\/span><br \/>\n        res <span class=\"token operator\">&#061;<\/span> headler_line <span class=\"token operator\">&#043;<\/span> header <span class=\"token operator\">&#043;<\/span> content<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> res<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">else<\/span> <span class=\"token comment\">\/\/ \u5982\u679cURL\u4e0d\u662f&#034;\/calc&#034;&#xff0c;\u8bb0\u5f55\u9519\u8bef\u5e76\u8fd4\u56de\u9519\u8bef\u54cd\u5e94<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>Fatal<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;unsupported post url:%s&#034;<\/span><span class=\"token punctuation\">,<\/span> hr<span class=\"token punctuation\">.<\/span>url<span class=\"token punctuation\">.<\/span><span class=\"token function\">c_str<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u8bb0\u5f55\u9519\u8bef\u65e5\u5fd7<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token function\">process_bad_request<\/span><span class=\"token punctuation\">(<\/span>hr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u8fd4\u56de\u9519\u8bef\u54cd\u5e94<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">class<\/span> <span class=\"token class-name\">Task<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">public<\/span><span class=\"token operator\">:<\/span><br \/>\n    <span class=\"token function\">Task<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token operator\">:<\/span><span class=\"token function\">socketfd<\/span><span class=\"token punctuation\">(<\/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 function\">read_manager<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span><span class=\"token function\">write_manager<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><\/p>\n<p>    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token comment\">\/**<br \/>\n *  Task\u7c7b\u7684\u6784\u9020\u51fd\u6570<br \/>\n *<br \/>\n * \u521d\u59cb\u5316\u4e00\u4e2a\u4efb\u52a1\u5bf9\u8c61&#xff0c;\u7528\u4e8e\u5904\u7406\u7f51\u7edc\u8fde\u63a5\u76f8\u5173\u7684\u64cd\u4f5c\u3002<br \/>\n * \u8be5\u6784\u9020\u51fd\u6570\u63a5\u6536socket\u6587\u4ef6\u63cf\u8ff0\u7b26\u3001\u8bfb\u5199Pollmanager\u5bf9\u8c61\u548c\u6700\u540e\u6d3b\u8dc3\u65f6\u95f4\u6307\u9488&#xff0c;<br \/>\n * \u5e76\u5c06\u5b83\u4eec\u5b58\u50a8\u5728\u7c7b\u7684\u6210\u5458\u53d8\u91cf\u4e2d&#xff0c;\u4f9b\u540e\u7eed\u4f7f\u7528\u3002<br \/>\n *<br \/>\n *  _socketfd \u5ba2\u6237\u7aef\u8fde\u63a5\u7684socket\u6587\u4ef6\u63cf\u8ff0\u7b26<br \/>\n *  _read_manager \u7528\u4e8e\u7ba1\u7406\u8bfb\u4e8b\u4ef6\u7684Pollmanager\u5bf9\u8c61\u6307\u9488<br \/>\n *  _write_manager \u7528\u4e8e\u7ba1\u7406\u5199\u4e8b\u4ef6\u7684Pollmanager\u5bf9\u8c61\u6307\u9488<br \/>\n *  _last_active_time \u6307\u5411\u539f\u5b50\u65f6\u95f4\u53d8\u91cf\u7684\u6307\u9488&#xff0c;\u7528\u4e8e\u8bb0\u5f55\u8fde\u63a5\u7684\u6700\u540e\u6d3b\u8dc3\u65f6\u95f4<br \/>\n *\/<\/span><br \/>\n<span class=\"token function\">Task<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> _socketfd<span class=\"token punctuation\">,<\/span> Pollmanager<span class=\"token operator\">*<\/span> _read_manager<span class=\"token punctuation\">,<\/span> Pollmanager<span class=\"token operator\">*<\/span> _write_manager<span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span>atomic<span class=\"token operator\">&lt;<\/span>time_t<span class=\"token operator\">&gt;<\/span><span class=\"token operator\">*<\/span> _last_active_time<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token operator\">:<\/span> <span class=\"token function\">socketfd<\/span><span class=\"token punctuation\">(<\/span>_socketfd<span class=\"token punctuation\">)<\/span>          <span class=\"token comment\">\/\/ \u521d\u59cb\u5316socket\u6587\u4ef6\u63cf\u8ff0\u7b26\u6210\u5458\u53d8\u91cf<\/span><br \/>\n    <span class=\"token punctuation\">,<\/span> <span class=\"token function\">read_manager<\/span><span class=\"token punctuation\">(<\/span>_read_manager<span class=\"token punctuation\">)<\/span>  <span class=\"token comment\">\/\/ \u521d\u59cb\u5316\u8bfb\u4e8b\u4ef6\u7ba1\u7406\u5668\u6210\u5458\u53d8\u91cf<\/span><br \/>\n    <span class=\"token punctuation\">,<\/span> <span class=\"token function\">write_manager<\/span><span class=\"token punctuation\">(<\/span>_write_manager<span class=\"token punctuation\">)<\/span> <span class=\"token comment\">\/\/ \u521d\u59cb\u5316\u5199\u4e8b\u4ef6\u7ba1\u7406\u5668\u6210\u5458\u53d8\u91cf<\/span><br \/>\n    <span class=\"token punctuation\">,<\/span> <span class=\"token function\">last_active_time<\/span><span class=\"token punctuation\">(<\/span>_last_active_time<span class=\"token punctuation\">)<\/span> <span class=\"token comment\">\/\/ \u521d\u59cb\u5316\u6700\u540e\u6d3b\u8dc3\u65f6\u95f4\u6210\u5458\u53d8\u91cf<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u6784\u9020\u51fd\u6570\u4f53\u4e3a\u7a7a&#xff0c;\u6240\u6709\u521d\u59cb\u5316\u5df2\u5728\u521d\u59cb\u5316\u5217\u8868\u4e2d\u5b8c\u6210<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/**<br \/>\n * \u5904\u7406\u6587\u4ef6\u540e\u7f00\u540d&#xff0c;\u8fd4\u56de\u5bf9\u5e94\u7684MIME\u7c7b\u578b<br \/>\n *  suffix \u6587\u4ef6\u540e\u7f00\u540d&#xff0c;\u4f8b\u5982 &#034;.html&#034;, &#034;.css&#034; \u7b49<br \/>\n * return \u5bf9\u5e94\u7684MIME\u7c7b\u578b\u5b57\u7b26\u4e32&#xff0c;\u5982\u679c\u627e\u4e0d\u5230\u5219\u8fd4\u56de\u9ed8\u8ba4\u7684 &#034;text\/html&#034;<br \/>\n *\/<\/span><br \/>\n    <span class=\"token keyword\">static<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string <span class=\"token function\">suffix_handler<\/span><span class=\"token punctuation\">(<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string suffix<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u5728map\u4e2d\u67e5\u627e\u7ed9\u5b9a\u7684\u540e\u7f00\u540d<\/span><br \/>\n        <span class=\"token keyword\">auto<\/span> pos <span class=\"token operator\">&#061;<\/span> map<span class=\"token punctuation\">.<\/span><span class=\"token function\">find<\/span><span class=\"token punctuation\">(<\/span>suffix<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u5982\u679c\u627e\u4e0d\u5230\u6307\u5b9a\u7684\u540e\u7f00\u540d<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>pos <span class=\"token operator\">&#061;&#061;<\/span> map<span class=\"token punctuation\">.<\/span><span class=\"token function\">end<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u8fd4\u56de\u9ed8\u8ba4\u7684HTML MIME\u7c7b\u578b<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> map<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;.html&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u8fd4\u56de\u627e\u5230\u7684\u5bf9\u5e94MIME\u7c7b\u578b<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> map<span class=\"token punctuation\">[<\/span>suffix<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token punctuation\">}<\/span><br \/>\n <span class=\"token keyword\">void<\/span> <span class=\"token function\">run<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">private<\/span><span class=\"token operator\">:<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> socketfd<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">static<\/span> std<span class=\"token double-colon punctuation\">::<\/span>unordered_map<span class=\"token operator\">&lt;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&gt;<\/span> map<span class=\"token punctuation\">;<\/span><br \/>\n    Pollmanager<span class=\"token operator\">*<\/span> read_manager<span class=\"token punctuation\">;<\/span><br \/>\n    Pollmanager<span class=\"token operator\">*<\/span> write_manager<span class=\"token punctuation\">;<\/span><br \/>\n   std<span class=\"token double-colon punctuation\">::<\/span>atomic<span class=\"token operator\">&lt;<\/span>time_t<span class=\"token operator\">&gt;<\/span><span class=\"token operator\">*<\/span> last_active_time<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\nstd<span class=\"token double-colon punctuation\">::<\/span>unordered_map<span class=\"token operator\">&lt;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&gt;<\/span> Task<span class=\"token double-colon punctuation\">::<\/span>map <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;.html&#034;<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string\">&#034;text\/html&#034;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;.css&#034;<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string\">&#034;text\/css&#034;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;.png&#034;<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string\">&#034;image\/png&#034;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;.jpg&#034;<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string\">&#034;image\/jpeg&#034;<\/span><span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/**<br \/>\n * \u5904\u7406HTTP GET\u8bf7\u6c42\u5e76\u751f\u6210\u54cd\u5e94<br \/>\n *<br \/>\n * \u8be5\u51fd\u6570\u6839\u636e\u5ba2\u6237\u7aef\u8bf7\u6c42\u7684URL\u8def\u5f84&#xff0c;\u8bfb\u53d6\u76f8\u5e94\u7684\u6587\u4ef6\u5185\u5bb9&#xff0c;<br \/>\n * \u5e76\u751f\u6210\u7b26\u5408HTTP\u534f\u8bae\u7684\u54cd\u5e94\u62a5\u6587\u3002\u652f\u6301\u5904\u7406\u6587\u4ef6\u7c7b\u578b\u5224\u65ad\u3001<br \/>\n * 404\u9519\u8bef\u9875\u9762\u548c\u8fde\u63a5\u7ba1\u7406&#xff08;Keep-Alive\/Close&#xff09;\u3002<br \/>\n *<br \/>\n *  hr \u5305\u542bHTTP\u8bf7\u6c42\u4fe1\u606f\u7684\u5bf9\u8c61<br \/>\n * return std::string \u751f\u6210\u7684HTTP\u54cd\u5e94\u62a5\u6587<br \/>\n *\/<\/span><br \/>\nstd<span class=\"token double-colon punctuation\">::<\/span>string <span class=\"token function\">Http_Get_Handler<\/span><span class=\"token punctuation\">(<\/span>Http_Request<span class=\"token operator\">&amp;<\/span> hr<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u5b58\u50a8\u8bf7\u6c42\u7684\u6587\u4ef6\u8def\u5f84\u3001\u5185\u5bb9\u7c7b\u578b\u548c\u6700\u7ec8\u54cd\u5e94<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>string file_path<span class=\"token punctuation\">;<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>string content_type<span class=\"token punctuation\">;<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>string res<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u5904\u7406\u6839\u8def\u5f84\u548c\u9996\u9875\u8bf7\u6c42<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>hr<span class=\"token punctuation\">.<\/span>url <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;\/&#034;<\/span> <span class=\"token operator\">||<\/span> hr<span class=\"token punctuation\">.<\/span>url <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;\/index.html&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        file_path <span class=\"token operator\">&#061;<\/span> path <span class=\"token operator\">&#043;<\/span> <span class=\"token string\">&#034;\/index.html&#034;<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u8bbe\u7f6e\u4e3a\u9996\u9875\u8def\u5f84<\/span><br \/>\n        content_type <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;text\/html&#034;<\/span><span class=\"token punctuation\">;<\/span>         <span class=\"token comment\">\/\/ \u8bbe\u7f6e\u5185\u5bb9\u7c7b\u578b\u4e3aHTML<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">else<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u5904\u7406\u5176\u4ed6\u8def\u5f84\u8bf7\u6c42<\/span><br \/>\n        file_path <span class=\"token operator\">&#061;<\/span> path <span class=\"token operator\">&#043;<\/span> hr<span class=\"token punctuation\">.<\/span>url<span class=\"token punctuation\">;<\/span>          <span class=\"token comment\">\/\/ \u62fc\u63a5\u5b8c\u6574\u6587\u4ef6\u8def\u5f84<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u67e5\u627e\u6587\u4ef6\u6269\u5c55\u540d\u4ee5\u786e\u5b9a\u5185\u5bb9\u7c7b\u578b<\/span><br \/>\n        ssize_t pos <span class=\"token operator\">&#061;<\/span> file_path<span class=\"token punctuation\">.<\/span><span class=\"token function\">rfind<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;.&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>pos <span class=\"token operator\">&#061;&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token double-colon punctuation\">::<\/span>npos<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u6ca1\u6709\u627e\u5230\u6269\u5c55\u540d&#xff0c;\u9ed8\u8ba4\u4e3aHTML<\/span><br \/>\n            content_type <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;text\/html&#034;<\/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 comment\">\/\/ \u63d0\u53d6\u6269\u5c55\u540d\u5e76\u83b7\u53d6\u5bf9\u5e94\u7684\u5185\u5bb9\u7c7b\u578b<\/span><br \/>\n            std<span class=\"token double-colon punctuation\">::<\/span>string suffix <span class=\"token operator\">&#061;<\/span> file_path<span class=\"token punctuation\">.<\/span><span class=\"token function\">substr<\/span><span class=\"token punctuation\">(<\/span>pos<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            content_type <span class=\"token operator\">&#061;<\/span> <span class=\"token class-name\">Task<\/span><span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">suffix_handler<\/span><span class=\"token punctuation\">(<\/span>suffix<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u8bfb\u53d6\u8bf7\u6c42\u7684\u6587\u4ef6\u5185\u5bb9<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>string body <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">read_file<\/span><span class=\"token punctuation\">(<\/span>file_path<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ HTTP\u54cd\u5e94\u72b6\u6001\u884c\u548c\u5934\u90e8<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>string headler_line<span class=\"token punctuation\">;<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>string header<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u5904\u7406\u6587\u4ef6\u4e0d\u5b58\u5728\u7684\u60c5\u51b5<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>body<span class=\"token punctuation\">.<\/span><span class=\"token function\">empty<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u8bbe\u7f6e404\u72b6\u6001\u884c<\/span><br \/>\n        headler_line <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;HTTP\/1.0 404 Not Found\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u5904\u7406\u8fde\u63a5\u7ba1\u7406\u5934\u90e8<\/span><br \/>\n        <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>hr<span class=\"token punctuation\">.<\/span>headers<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;Connection&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;close&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            header <span class=\"token operator\">&#043;&#061;<\/span> <span class=\"token string\">&#034;Connection: Close\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">;<\/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>hr<span class=\"token punctuation\">.<\/span>headers<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;Connection&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;keep-alive&#034;<\/span> <span class=\"token operator\">||<\/span> hr<span class=\"token punctuation\">.<\/span>headers<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;Connection&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;Keep-Alive&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            header <span class=\"token operator\">&#043;&#061;<\/span> <span class=\"token string\">&#034;Connection: Keep-Alive\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u8bfb\u53d6404\u9519\u8bef\u9875\u9762\u5185\u5bb9<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>string content <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">read_file<\/span><span class=\"token punctuation\">(<\/span>path <span class=\"token operator\">&#043;<\/span> <span class=\"token string\">&#034;\/404.html&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u8bbe\u7f6e\u54cd\u5e94\u5934\u90e8<\/span><br \/>\n        header <span class=\"token operator\">&#043;&#061;<\/span> <span class=\"token string\">&#034;Content-Length: &#034;<\/span> <span class=\"token operator\">&#043;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">to_string<\/span><span class=\"token punctuation\">(<\/span>content<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token string\">&#034;\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        header <span class=\"token operator\">&#043;&#061;<\/span> <span class=\"token string\">&#034;Content-Type: text\/html\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        header <span class=\"token operator\">&#043;&#061;<\/span> <span class=\"token string\">&#034;\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u7ec4\u5408\u5b8c\u6574\u7684\u54cd\u5e94<\/span><br \/>\n        res <span class=\"token operator\">&#061;<\/span> headler_line <span class=\"token operator\">&#043;<\/span> header <span class=\"token operator\">&#043;<\/span> content<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">else<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u6587\u4ef6\u5b58\u5728&#xff0c;\u8bbe\u7f6e200\u72b6\u6001\u884c<\/span><br \/>\n        headler_line <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;HTTP\/1.0 200 OK\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u8bbe\u7f6e\u5185\u5bb9\u957f\u5ea6\u5934\u90e8<\/span><br \/>\n        header <span class=\"token operator\">&#043;&#061;<\/span> <span class=\"token string\">&#034;Content-Length: &#034;<\/span> <span class=\"token operator\">&#043;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">to_string<\/span><span class=\"token punctuation\">(<\/span>body<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token string\">&#034;\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u5904\u7406\u8fde\u63a5\u7ba1\u7406\u5934\u90e8<\/span><br \/>\n        <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>hr<span class=\"token punctuation\">.<\/span>headers<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;Connection&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;close&#034;<\/span> <span class=\"token operator\">||<\/span> hr<span class=\"token punctuation\">.<\/span>headers<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;Connection&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;Close&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            header <span class=\"token operator\">&#043;&#061;<\/span> <span class=\"token string\">&#034;Connection: Close\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">;<\/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>hr<span class=\"token punctuation\">.<\/span>headers<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;Connection&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;keep-alive&#034;<\/span> <span class=\"token operator\">||<\/span> hr<span class=\"token punctuation\">.<\/span>headers<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;Connection&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;Keep-Alive&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            header <span class=\"token operator\">&#043;&#061;<\/span> <span class=\"token string\">&#034;Connection: Keep-Alive\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u8bbe\u7f6e\u5185\u5bb9\u7c7b\u578b\u5934\u90e8<\/span><br \/>\n        header <span class=\"token operator\">&#043;&#061;<\/span> <span class=\"token string\">&#034;Content-type: &#034;<\/span> <span class=\"token operator\">&#043;<\/span> content_type <span class=\"token operator\">&#043;<\/span> <span class=\"token string\">&#034;\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        header <span class=\"token operator\">&#043;&#061;<\/span> <span class=\"token string\">&#034;\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u7ec4\u5408\u5b8c\u6574\u7684\u54cd\u5e94<\/span><br \/>\n        res <span class=\"token operator\">&#061;<\/span> headler_line <span class=\"token operator\">&#043;<\/span> header <span class=\"token operator\">&#043;<\/span> body<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u8fd4\u56de\u5b8c\u6574\u7684HTTP\u54cd\u5e94<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> res<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/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;Threadpool.h&#034;<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/**<br \/>\n *  \u6267\u884cHTTP\u8bf7\u6c42\u5904\u7406\u4efb\u52a1<br \/>\n *<br \/>\n * \u8be5\u51fd\u6570\u662fTask\u7c7b\u7684\u6838\u5fc3\u65b9\u6cd5&#xff0c;\u8d1f\u8d23\u5904\u7406HTTP\u8bf7\u6c42\u7684\u6574\u4e2a\u6d41\u7a0b&#xff1a;<br \/>\n * 1. \u63a5\u6536\u5e76\u89e3\u6790HTTP\u8bf7\u6c42<br \/>\n * 2. \u6839\u636e\u8bf7\u6c42\u65b9\u6cd5(GET\/POST)\u8c03\u7528\u76f8\u5e94\u7684\u5904\u7406\u51fd\u6570<br \/>\n * 3. \u751f\u6210HTTP\u54cd\u5e94\u5e76\u53d1\u9001\u7ed9\u5ba2\u6237\u7aef<br \/>\n * 4. \u7ba1\u7406\u8fde\u63a5\u72b6\u6001(Keep-Alive\/Close)<br \/>\n * 5. \u66f4\u65b0\u8fde\u63a5\u7684\u6700\u540e\u6d3b\u8dc3\u65f6\u95f4<br \/>\n *<br \/>\n * \u8be5\u51fd\u6570\u5904\u7406\u4e86\u5404\u79cd\u9519\u8bef\u60c5\u51b5&#xff0c;\u5305\u62ec\u63a5\u6536\u8d85\u65f6\u3001\u5ba2\u6237\u7aef\u5173\u95ed\u8fde\u63a5\u3001<br \/>\n * \u4e0d\u652f\u6301\u7684\u8bf7\u6c42\u65b9\u6cd5\u7b49&#xff0c;\u5e76\u786e\u4fdd\u7ebf\u7a0b\u5b89\u5168\u5730\u8bbf\u95ee\u5171\u4eab\u8d44\u6e90\u3002<br \/>\n *\/<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token class-name\">Task<\/span><span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">run<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u521b\u5efaHTTP\u8bf7\u6c42\u5bf9\u8c61<\/span><br \/>\n    Http_Request hr<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u83b7\u53d6HTTP\u8bf7\u6c42<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> get_result <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">Get_HttpRequest<\/span><span class=\"token punctuation\">(<\/span>socketfd<span class=\"token punctuation\">,<\/span> hr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u68c0\u67e5\u83b7\u53d6\u8bf7\u6c42\u7ed3\u679c<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>get_result <span class=\"token operator\">!&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u5904\u7406\u63a5\u6536\u8d85\u65f6\u60c5\u51b5<\/span><br \/>\n        <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>get_result <span class=\"token operator\">&#061;&#061;<\/span> RECV_TIMEOUT<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u52a0\u9501\u4fdd\u62a4\u53d1\u9001\u961f\u5217<\/span><br \/>\n            send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">lock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u68c0\u67e5socket\u662f\u5426\u5728\u53d1\u9001\u961f\u5217\u4e2d<\/span><br \/>\n            <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>send_queues<span class=\"token punctuation\">.<\/span><span class=\"token function\">find<\/span><span class=\"token punctuation\">(<\/span>socketfd<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&#061;<\/span> send_queues<span class=\"token punctuation\">.<\/span><span class=\"token function\">end<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><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 punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u83b7\u53d6\u8fde\u63a5\u5bf9\u8c61<\/span><br \/>\n            std<span class=\"token double-colon punctuation\">::<\/span>shared_ptr<span class=\"token operator\">&lt;<\/span>Connection<span class=\"token operator\">&gt;<\/span> conn <span class=\"token operator\">&#061;<\/span> send_queues<span class=\"token punctuation\">[<\/span>socketfd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>            <span class=\"token comment\">\/\/ \u52a0\u9501\u4fdd\u62a4\u8fde\u63a5\u5bf9\u8c61<\/span><br \/>\n            conn<span class=\"token operator\">-&gt;<\/span>mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">lock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u5c06socket\u6dfb\u52a0\u5230\u8bfb\u53d6\u7ba1\u7406\u5668&#xff0c;\u7ee7\u7eed\u7b49\u5f85\u6570\u636e<\/span><br \/>\n            read_manager<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">add_fd<\/span><span class=\"token punctuation\">(<\/span>socketfd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            conn<span class=\"token operator\">-&gt;<\/span>mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>            <span class=\"token comment\">\/\/ \u66f4\u65b0\u6700\u540e\u6d3b\u52a8\u65f6\u95f4<\/span><br \/>\n            last_active_time<span class=\"token punctuation\">[<\/span>socketfd<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">time<\/span><span class=\"token punctuation\">(<\/span><span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u5904\u7406\u5ba2\u6237\u7aef\u5173\u95ed\u8fde\u63a5\u60c5\u51b5<\/span><br \/>\n        <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>get_result <span class=\"token operator\">&#061;&#061;<\/span> CLIENT_CLOSE<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">lock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>send_queues<span class=\"token punctuation\">.<\/span><span class=\"token function\">find<\/span><span class=\"token punctuation\">(<\/span>socketfd<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&#061;<\/span> send_queues<span class=\"token punctuation\">.<\/span><span class=\"token function\">end<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><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 punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n            std<span class=\"token double-colon punctuation\">::<\/span>shared_ptr<span class=\"token operator\">&lt;<\/span>Connection<span class=\"token operator\">&gt;<\/span> conn <span class=\"token operator\">&#061;<\/span> send_queues<span class=\"token punctuation\">[<\/span>socketfd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>            conn<span class=\"token operator\">-&gt;<\/span>mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">lock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u4ece\u8bfb\u53d6\u7ba1\u7406\u5668\u79fb\u9664socket&#xff0c;\u4e0d\u518d\u76d1\u542c\u8bfb\u4e8b\u4ef6<\/span><br \/>\n            read_manager<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">del_fd<\/span><span class=\"token punctuation\">(<\/span>socketfd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u6807\u8bb0\u8fde\u63a5\u9700\u8981\u5173\u95ed<\/span><br \/>\n            conn<span class=\"token operator\">-&gt;<\/span>should_close <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u5c06socket\u6dfb\u52a0\u5230\u5199\u5165\u7ba1\u7406\u5668&#xff0c;\u53d1\u9001\u5269\u4f59\u6570\u636e\u540e\u5173\u95ed<\/span><br \/>\n            write_manager<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">add_fd<\/span><span class=\"token punctuation\">(<\/span>socketfd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            conn<span class=\"token operator\">-&gt;<\/span>mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><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 punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u8bb0\u5f55\u83b7\u53d6HTTP\u8bf7\u6c42\u9519\u8bef\u7684\u4e25\u91cd\u65e5\u5fd7<\/span><br \/>\n        lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>Fatal<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;get http request error&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">lock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>send_queues<span class=\"token punctuation\">.<\/span><span class=\"token function\">find<\/span><span class=\"token punctuation\">(<\/span>socketfd<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&#061;<\/span> send_queues<span class=\"token punctuation\">.<\/span><span class=\"token function\">end<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><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 punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>shared_ptr<span class=\"token operator\">&lt;<\/span>Connection<span class=\"token operator\">&gt;<\/span> conn <span class=\"token operator\">&#061;<\/span> send_queues<span class=\"token punctuation\">[<\/span>socketfd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        conn<span class=\"token operator\">-&gt;<\/span>mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">lock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u8bbe\u7f6e\u8fde\u63a5\u5934\u4e3a\u5173\u95ed<\/span><br \/>\n        hr<span class=\"token punctuation\">.<\/span>headers<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;Connection&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;Close&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u5c06\u9519\u8bef\u7684\u8bf7\u6c42\u5904\u7406\u7ed3\u679c\u6dfb\u52a0\u5230\u8f93\u51fa\u7f13\u51b2\u533a<\/span><br \/>\n        conn<span class=\"token operator\">-&gt;<\/span>out_buffer<span class=\"token punctuation\">.<\/span><span class=\"token function\">push<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">process_bad_request<\/span><span class=\"token punctuation\">(<\/span>hr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u6807\u8bb0\u8fde\u63a5\u9700\u8981\u5173\u95ed<\/span><br \/>\n        conn<span class=\"token operator\">-&gt;<\/span>should_close <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u4ece\u8bfb\u53d6\u7ba1\u7406\u5668\u79fb\u9664socket<\/span><br \/>\n        read_manager<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">del_fd<\/span><span class=\"token punctuation\">(<\/span>socketfd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u5c06socket\u6dfb\u52a0\u5230\u5199\u5165\u7ba1\u7406\u5668<\/span><br \/>\n        write_manager<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">add_fd<\/span><span class=\"token punctuation\">(<\/span>socketfd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        conn<span class=\"token operator\">-&gt;<\/span>mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><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 punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u5b9a\u4e49\u54cd\u5e94\u5b57\u7b26\u4e32<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>string res<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u5904\u7406GET\u8bf7\u6c42<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>hr<span class=\"token punctuation\">.<\/span>method <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;GET&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        res <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">Http_Get_Handler<\/span><span class=\"token punctuation\">(<\/span>hr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u5904\u7406POST\u8bf7\u6c42<\/span><br \/>\n    <span class=\"token keyword\">else<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>hr<span class=\"token punctuation\">.<\/span>method <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;POST&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        res <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">Http_Post_Handler<\/span><span class=\"token punctuation\">(<\/span>hr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u5904\u7406\u4e0d\u652f\u6301\u7684\u8bf7\u6c42\u65b9\u6cd5<\/span><br \/>\n    <span class=\"token keyword\">else<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>warning<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;unsupported method:%s&#034;<\/span><span class=\"token punctuation\">,<\/span> hr<span class=\"token punctuation\">.<\/span>method<span class=\"token punctuation\">.<\/span><span class=\"token function\">c_str<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">lock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>send_queues<span class=\"token punctuation\">.<\/span><span class=\"token function\">find<\/span><span class=\"token punctuation\">(<\/span>socketfd<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&#061;<\/span> send_queues<span class=\"token punctuation\">.<\/span><span class=\"token function\">end<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><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 punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>shared_ptr<span class=\"token operator\">&lt;<\/span>Connection<span class=\"token operator\">&gt;<\/span> conn <span class=\"token operator\">&#061;<\/span> send_queues<span class=\"token punctuation\">[<\/span>socketfd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        conn<span class=\"token operator\">-&gt;<\/span>mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">lock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u8bbe\u7f6e\u8fde\u63a5\u5934\u4e3a\u5173\u95ed<\/span><br \/>\n        hr<span class=\"token punctuation\">.<\/span>headers<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;Connection&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;Close&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u5c06\u9519\u8bef\u7684\u8bf7\u6c42\u5904\u7406\u7ed3\u679c\u6dfb\u52a0\u5230\u8f93\u51fa\u7f13\u51b2\u533a<\/span><br \/>\n        conn<span class=\"token operator\">-&gt;<\/span>out_buffer<span class=\"token punctuation\">.<\/span><span class=\"token function\">push<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">process_bad_request<\/span><span class=\"token punctuation\">(<\/span>hr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u6807\u8bb0\u8fde\u63a5\u9700\u8981\u5173\u95ed<\/span><br \/>\n        conn<span class=\"token operator\">-&gt;<\/span>should_close <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u5c06socket\u6dfb\u52a0\u5230\u5199\u5165\u7ba1\u7406\u5668<\/span><br \/>\n        write_manager<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">add_fd<\/span><span class=\"token punctuation\">(<\/span>socketfd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        conn<span class=\"token operator\">-&gt;<\/span>mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><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 punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u52a0\u9501\u4fdd\u62a4\u53d1\u9001\u961f\u5217<\/span><br \/>\n    send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">lock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>send_queues<span class=\"token punctuation\">.<\/span><span class=\"token function\">find<\/span><span class=\"token punctuation\">(<\/span>socketfd<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&#061;<\/span> send_queues<span class=\"token punctuation\">.<\/span><span class=\"token function\">end<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><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 punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>shared_ptr<span class=\"token operator\">&lt;<\/span>Connection<span class=\"token operator\">&gt;<\/span> conn <span class=\"token operator\">&#061;<\/span> send_queues<span class=\"token punctuation\">[<\/span>socketfd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    send_queues_mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    conn<span class=\"token operator\">-&gt;<\/span>mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">lock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u5c06\u54cd\u5e94\u7ed3\u679c\u6dfb\u52a0\u5230\u8f93\u51fa\u7f13\u51b2\u533a<\/span><br \/>\n    conn<span class=\"token operator\">-&gt;<\/span>out_buffer<span class=\"token punctuation\">.<\/span><span class=\"token function\">push<\/span><span class=\"token punctuation\">(<\/span>res<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u68c0\u67e5\u8fde\u63a5\u662f\u5426\u9700\u8981\u5173\u95ed<\/span><br \/>\n    <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>hr<span class=\"token punctuation\">.<\/span>headers<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;Connection&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;close&#034;<\/span> <span class=\"token operator\">||<\/span> hr<span class=\"token punctuation\">.<\/span>headers<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;Connection&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;Close&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u6807\u8bb0\u8fde\u63a5\u9700\u8981\u5173\u95ed<\/span><br \/>\n        conn<span class=\"token operator\">-&gt;<\/span>should_close <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">else<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u8fde\u63a5\u4fdd\u6301\u6d3b\u8dc3&#xff0c;\u68c0\u67e5\u8f93\u5165\u7f13\u51b2\u533a\u662f\u5426\u6709\u5269\u4f59\u6570\u636e<\/span><br \/>\n        <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>conn<span class=\"token operator\">-&gt;<\/span>in_buffer<span class=\"token punctuation\">.<\/span><span class=\"token function\">empty<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&amp;&amp;<\/span> <span class=\"token operator\">!<\/span>conn<span class=\"token operator\">-&gt;<\/span>in_buffer<span class=\"token punctuation\">.<\/span><span class=\"token function\">front<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">empty<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u6709\u5269\u4f59\u6570\u636e&#xff0c;\u9700\u8981\u7ee7\u7eed\u5904\u7406<\/span><br \/>\n            write_manager<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">add_fd<\/span><span class=\"token punctuation\">(<\/span>socketfd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            conn<span class=\"token operator\">-&gt;<\/span>mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>            <span class=\"token comment\">\/\/ \u521b\u5efa\u65b0\u4efb\u52a1\u5904\u7406\u5269\u4f59\u6570\u636e<\/span><br \/>\n            Task <span class=\"token function\">t<\/span><span class=\"token punctuation\">(<\/span>socketfd<span class=\"token punctuation\">,<\/span> read_manager<span class=\"token punctuation\">,<\/span> write_manager<span class=\"token punctuation\">,<\/span> last_active_time<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            last_active_time<span class=\"token punctuation\">[<\/span>socketfd<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">time<\/span><span class=\"token punctuation\">(<\/span><span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            threadpool<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">getinstance<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">push<\/span><span class=\"token punctuation\">(<\/span>t<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token keyword\">else<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u6ca1\u6709\u5269\u4f59\u6570\u636e&#xff0c;\u7ee7\u7eed\u76d1\u542c\u8bfb\u4e8b\u4ef6<\/span><br \/>\n            read_manager<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">add_fd<\/span><span class=\"token punctuation\">(<\/span>socketfd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u5c06socket\u6dfb\u52a0\u5230\u5199\u5165\u7ba1\u7406\u5668&#xff0c;\u51c6\u5907\u53d1\u9001\u54cd\u5e94<\/span><br \/>\n    write_manager<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">add_fd<\/span><span class=\"token punctuation\">(<\/span>socketfd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    conn<span class=\"token operator\">-&gt;<\/span>mtx<span class=\"token punctuation\">.<\/span><span class=\"token function\">unlock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u66f4\u65b0\u6700\u540e\u6d3b\u52a8\u65f6\u95f4<\/span><br \/>\n    last_active_time<span class=\"token punctuation\">[<\/span>socketfd<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">time<\/span><span class=\"token punctuation\">(<\/span><span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>protocol.hpp:<\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">pragma<\/span> <span class=\"token expression\">once<\/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\">&#034;log.hpp&#034;<\/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;iostream&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;vector&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;string&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;sstream&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;unordered_map&gt;<\/span><\/span><br \/>\n<span class=\"token keyword\">extern<\/span> log lg<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">class<\/span> <span class=\"token class-name\">Http_Request<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">public<\/span><span class=\"token operator\">:<\/span><br \/>\n<span class=\"token comment\">\/**<br \/>\n *  \u53cd\u5e8f\u5217\u5316HTTP\u5934\u4fe1\u606f<br \/>\n *  head \u5305\u542bHTTP\u5934\u4fe1\u606f\u7684\u5b57\u7b26\u4e32<br \/>\n * return \u53cd\u5e8f\u5217\u5316\u6210\u529f\u8fd4\u56detrue&#xff0c;\u5931\u8d25\u8fd4\u56defalse<br \/>\n *\/<\/span><br \/>\n    <span class=\"token keyword\">bool<\/span> <span class=\"token function\">Deserialization<\/span><span class=\"token punctuation\">(<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> head<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u521d\u59cb\u5316\u8d77\u59cb\u4f4d\u7f6e<\/span><br \/>\n        size_t start <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u5b58\u50a8\u89e3\u6790\u51fa\u7684HTTP\u5934\u4fe1\u606f\u884c<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>vector<span class=\"token operator\">&lt;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&gt;<\/span>_header<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u5faa\u73af\u89e3\u6790HTTP\u5934\u4fe1\u606f\u7684\u6bcf\u4e00\u884c<\/span><br \/>\n        <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token boolean\">true<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            std<span class=\"token double-colon punctuation\">::<\/span>string line<span class=\"token punctuation\">;<\/span>      <span class=\"token comment\">\/\/ \u5b58\u50a8\u5f53\u524d\u884c\u7684\u5185\u5bb9<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u67e5\u627e\u884c\u7ed3\u675f\u7b26&#034;\\\\r\\\\n&#034;\u7684\u4f4d\u7f6e<\/span><br \/>\n            size_t end <span class=\"token operator\">&#061;<\/span> head<span class=\"token punctuation\">.<\/span><span class=\"token function\">find<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span> start<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u5982\u679c\u627e\u4e0d\u5230\u884c\u7ed3\u675f\u7b26&#xff0c;\u8bf4\u660e\u683c\u5f0f\u9519\u8bef<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>end <span class=\"token operator\">&#061;&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token double-colon punctuation\">::<\/span>npos<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u63d0\u53d6\u5f53\u524d\u884c\u7684\u5185\u5bb9<\/span><br \/>\n            line <span class=\"token operator\">&#061;<\/span> head<span class=\"token punctuation\">.<\/span><span class=\"token function\">substr<\/span><span class=\"token punctuation\">(<\/span>start<span class=\"token punctuation\">,<\/span> end <span class=\"token operator\">&#8211;<\/span> start<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u5982\u679c\u9047\u5230\u7a7a\u884c&#xff0c;\u8bf4\u660eHTTP\u5934\u90e8\u5206\u7ed3\u675f<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>line<span class=\"token punctuation\">.<\/span><span class=\"token function\">empty<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <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 comment\">\/\/ \u66f4\u65b0\u8d77\u59cb\u4f4d\u7f6e\u5230\u4e0b\u4e00\u884c\u7684\u5f00\u59cb<\/span><br \/>\n            start <span class=\"token operator\">&#061;<\/span> end <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">2<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u5c06\u5f53\u524d\u884c\u6dfb\u52a0\u5230\u5934\u4fe1\u606f\u5217\u8868\u4e2d<\/span><br \/>\n            _header<span class=\"token punctuation\">.<\/span><span class=\"token function\">push_back<\/span><span class=\"token punctuation\">(<\/span>line<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u68c0\u67e5\u81f3\u5c11\u6709\u4e00\u884c\u5934\u4fe1\u606f&#xff08;\u8bf7\u6c42\u884c&#xff09;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>_header<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u89e3\u6790\u5934\u4fe1\u606f\u7684\u6bcf\u4e00\u884c&#xff08;\u9664\u4e86\u7b2c\u4e00\u884c\u8bf7\u6c42\u884c&#xff09;<\/span><br \/>\n        <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span>size_t i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> _header<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> i<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            std<span class=\"token double-colon punctuation\">::<\/span>string line <span class=\"token operator\">&#061;<\/span> _header<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u67e5\u627e\u952e\u503c\u5206\u9694\u7b26&#034;:&#034;\u7684\u4f4d\u7f6e<\/span><br \/>\n            ssize_t pos <span class=\"token operator\">&#061;<\/span> line<span class=\"token punctuation\">.<\/span><span class=\"token function\">find<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;:&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u5982\u679c\u627e\u4e0d\u5230\u5206\u9694\u7b26&#xff0c;\u8bf4\u660e\u683c\u5f0f\u9519\u8bef<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>pos <span class=\"token operator\">&#061;&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token double-colon punctuation\">::<\/span>npos<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u63d0\u53d6\u952e<\/span><br \/>\n            std<span class=\"token double-colon punctuation\">::<\/span>string key <span class=\"token operator\">&#061;<\/span> line<span class=\"token punctuation\">.<\/span><span class=\"token function\">substr<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> pos<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u8df3\u8fc7\u5206\u9694\u7b26\u540e\u7684\u7a7a\u767d\u5b57\u7b26<\/span><br \/>\n            size_t val_start <span class=\"token operator\">&#061;<\/span> pos <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span>val_start <span class=\"token operator\">&lt;<\/span> line<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&amp;&amp;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">isspace<\/span><span class=\"token punctuation\">(<\/span>line<span class=\"token punctuation\">[<\/span>val_start<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                val_start<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u63d0\u53d6\u503c<\/span><br \/>\n            std<span class=\"token double-colon punctuation\">::<\/span>string value <span class=\"token operator\">&#061;<\/span> line<span class=\"token punctuation\">.<\/span><span class=\"token function\">substr<\/span><span class=\"token punctuation\">(<\/span>val_start<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u5c06\u952e\u503c\u5bf9\u5b58\u50a8\u5230headers\u6620\u5c04\u4e2d<\/span><br \/>\n            headers<span class=\"token punctuation\">[<\/span>key<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> value<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u89e3\u6790\u7b2c\u4e00\u884c&#xff08;\u8bf7\u6c42\u884c&#xff09;<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>string first_line <span class=\"token operator\">&#061;<\/span> _header<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>stringstream <span class=\"token function\">ss<\/span><span class=\"token punctuation\">(<\/span>first_line<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u4ece\u8bf7\u6c42\u884c\u4e2d\u63d0\u53d6\u65b9\u6cd5\u3001URL\u548cHTTP\u7248\u672c<\/span><br \/>\n        ss <span class=\"token operator\">&gt;&gt;<\/span> method <span class=\"token operator\">&gt;&gt;<\/span> url <span class=\"token operator\">&gt;&gt;<\/span> http_version<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/**<br \/>\n *  \u8c03\u8bd5\u6253\u5370\u51fd\u6570&#xff0c;\u7528\u4e8e\u8f93\u51faHTTP\u8bf7\u6c42\u7684\u8be6\u7ec6\u4fe1\u606f<br \/>\n * \u8be5\u51fd\u6570\u4f1a\u6253\u5370HTTP\u65b9\u6cd5\u3001URL\u3001HTTP\u7248\u672c\u3001\u5934\u90e8\u4fe1\u606f\u548c\u8bf7\u6c42\u4f53\u6587\u672c<br \/>\n *\/<\/span><br \/>\n    <span class=\"token keyword\">void<\/span> <span class=\"token function\">debugprint<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u6253\u5370\u4e00\u4e2a\u7a7a\u884c&#xff0c;\u7528\u4e8e\u5206\u9694\u4e0d\u540c\u90e8\u5206\u7684\u8f93\u51fa<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u6253\u5370HTTP\u65b9\u6cd5\u3001URL\u548cHTTP\u7248\u672c<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> method <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034; &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> url <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034; &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> http_version <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u904d\u5386\u5e76\u6253\u5370\u6240\u6709\u7684HTTP\u5934\u90e8\u4fe1\u606f<\/span><br \/>\n        <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">auto<\/span> it <span class=\"token operator\">&#061;<\/span> headers<span class=\"token punctuation\">.<\/span><span class=\"token function\">begin<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> it <span class=\"token operator\">!&#061;<\/span> headers<span class=\"token punctuation\">.<\/span><span class=\"token function\">end<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> it<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> it<span class=\"token operator\">-&gt;<\/span>first <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;: &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> it<span class=\"token operator\">-&gt;<\/span>second <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u6253\u5370\u4e00\u4e2a\u7a7a\u884c&#xff0c;\u7528\u4e8e\u5206\u9694\u5934\u90e8\u548c\u8bf7\u6c42\u4f53<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u6253\u5370\u8bf7\u6c42\u4f53\u7684\u6587\u672c\u5185\u5bb9<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> text <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u6253\u5370\u4e00\u4e2a\u7a7a\u884c&#xff0c;\u4f5c\u4e3a\u8f93\u51fa\u7ed3\u675f\u7684\u6807\u5fd7<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">public<\/span><span class=\"token operator\">:<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>unordered_map<span class=\"token operator\">&lt;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&gt;<\/span> headers<span class=\"token punctuation\">;<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>string text<span class=\"token punctuation\">;<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>string method<span class=\"token punctuation\">;<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>string url<span class=\"token punctuation\">;<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>string http_version<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>daemon.hpp:<\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">pragma<\/span> <span class=\"token expression\">once<\/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><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&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;cstdlib&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;signal.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;fcntl.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\">&#034;log.hpp&#034;<\/span><\/span><br \/>\n<span class=\"token keyword\">extern<\/span> log lg<span class=\"token punctuation\">;<\/span><br \/>\nstd<span class=\"token double-colon punctuation\">::<\/span>string filename <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;\/dev\/null&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\nstd<span class=\"token double-colon punctuation\">::<\/span>string workingdirectory<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;\/&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">class<\/span> <span class=\"token class-name\">Daemon<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">public<\/span><span class=\"token operator\">:<\/span><br \/>\n        <span class=\"token comment\">\/**<br \/>\n *  \u5c06\u5f53\u524d\u8fdb\u7a0b\u8f6c\u6362\u4e3a\u5b88\u62a4\u8fdb\u7a0b<br \/>\n *<br \/>\n * \u8be5\u51fd\u6570\u6267\u884c\u521b\u5efa\u5b88\u62a4\u8fdb\u7a0b\u7684\u6807\u51c6\u6b65\u9aa4&#xff1a;<br \/>\n * 1. \u5ffd\u7565SIGCHLD\u548cSIGHUP\u4fe1\u53f7<br \/>\n * 2. \u521b\u5efa\u5b50\u8fdb\u7a0b\u5e76\u9000\u51fa\u7236\u8fdb\u7a0b<br \/>\n * 3. \u521b\u5efa\u65b0\u4f1a\u8bdd<br \/>\n * 4. \u91cd\u5b9a\u5411\u6807\u51c6\u8f93\u5165\u3001\u8f93\u51fa\u548c\u9519\u8bef\u5230\u6307\u5b9a\u6587\u4ef6<br \/>\n * 5. \u66f4\u6539\u5de5\u4f5c\u76ee\u5f55<br \/>\n *<br \/>\n * \u5b88\u62a4\u8fdb\u7a0b\u662f\u5728\u540e\u53f0\u8fd0\u884c\u7684\u7279\u6b8a\u8fdb\u7a0b&#xff0c;\u72ec\u7acb\u4e8e\u63a7\u5236\u7ec8\u7aef&#xff0c;<br \/>\n * \u901a\u5e38\u7528\u4e8e\u6267\u884c\u7cfb\u7edf\u670d\u52a1\u6216\u540e\u53f0\u4efb\u52a1\u3002<br \/>\n *\/<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">daemon<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u5ffd\u7565SIGCHLD\u4fe1\u53f7&#xff0c;\u9632\u6b62\u5b50\u8fdb\u7a0b\u6210\u4e3a\u50f5\u5c38\u8fdb\u7a0b<\/span><br \/>\n    <span class=\"token function\">signal<\/span><span class=\"token punctuation\">(<\/span>SIGCHLD<span class=\"token punctuation\">,<\/span> SIG_IGN<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u5ffd\u7565SIGHUP\u4fe1\u53f7&#xff0c;\u9632\u6b62\u7ec8\u7aef\u5173\u95ed\u65f6\u5f71\u54cd\u5b88\u62a4\u8fdb\u7a0b<\/span><br \/>\n    <span class=\"token function\">signal<\/span><span class=\"token punctuation\">(<\/span>SIGHUP<span class=\"token punctuation\">,<\/span> SIG_IGN<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u521b\u5efa\u5b50\u8fdb\u7a0b<\/span><br \/>\n    pid_t id <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">fork<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>id <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ fork\u5931\u8d25&#xff0c;\u8bb0\u5f55\u9519\u8bef\u65e5\u5fd7\u5e76\u9000\u51fa<\/span><br \/>\n        lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>Fatal<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;fork fail&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">exit<\/span><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><br \/>\n    <span class=\"token keyword\">else<\/span> <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>id <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u7236\u8fdb\u7a0b\u9000\u51fa&#xff0c;\u4f7f\u5b50\u8fdb\u7a0b\u6210\u4e3a\u5b64\u513f\u8fdb\u7a0b&#xff0c;\u88abinit\u8fdb\u7a0b\u6536\u517b<\/span><br \/>\n        <span class=\"token function\">exit<\/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 punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u521b\u5efa\u65b0\u4f1a\u8bdd&#xff0c;\u4f7f\u8fdb\u7a0b\u8131\u79bb\u63a7\u5236\u7ec8\u7aef<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> n <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">setsid<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <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><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u521b\u5efa\u4f1a\u8bdd\u5931\u8d25&#xff0c;\u8bb0\u5f55\u9519\u8bef\u65e5\u5fd7\u5e76\u9000\u51fa<\/span><br \/>\n        lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>Fatal<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;setsid fail&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">exit<\/span><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 comment\">\/\/ \u6253\u5f00\u6307\u5b9a\u6587\u4ef6&#xff0c;\u7528\u4e8e\u91cd\u5b9a\u5411\u6807\u51c6\u8f93\u5165\u3001\u8f93\u51fa\u548c\u9519\u8bef<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> fd <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">open<\/span><span class=\"token punctuation\">(<\/span>filename<span class=\"token punctuation\">.<\/span><span class=\"token function\">c_str<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> O_RDWR<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <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><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u6253\u5f00\u6587\u4ef6\u5931\u8d25&#xff0c;\u8bb0\u5f55\u9519\u8bef\u65e5\u5fd7\u5e76\u9000\u51fa<\/span><br \/>\n        lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>Fatal<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;open dev\/null fail&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">exit<\/span><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 comment\">\/\/ \u91cd\u5b9a\u5411\u6807\u51c6\u8f93\u5165\u5230\u6307\u5b9a\u6587\u4ef6<\/span><br \/>\n    <span class=\"token function\">dup2<\/span><span class=\"token punctuation\">(<\/span>fd<span class=\"token punctuation\">,<\/span> STDIN_FILENO<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u91cd\u5b9a\u5411\u6807\u51c6\u8f93\u51fa\u5230\u6307\u5b9a\u6587\u4ef6<\/span><br \/>\n    <span class=\"token function\">dup2<\/span><span class=\"token punctuation\">(<\/span>fd<span class=\"token punctuation\">,<\/span> STDOUT_FILENO<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u91cd\u5b9a\u5411\u6807\u51c6\u9519\u8bef\u5230\u6307\u5b9a\u6587\u4ef6<\/span><br \/>\n    <span class=\"token function\">dup2<\/span><span class=\"token punctuation\">(<\/span>fd<span class=\"token punctuation\">,<\/span> STDERR_FILENO<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u66f4\u6539\u5de5\u4f5c\u76ee\u5f55\u5230\u6307\u5b9a\u76ee\u5f55<\/span><br \/>\n    <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">chdir<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>workingdirectory<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">c_str<\/span><span class=\"token punctuation\">(<\/span><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><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u66f4\u6539\u5de5\u4f5c\u76ee\u5f55\u5931\u8d25&#xff0c;\u8bb0\u5f55\u9519\u8bef\u65e5\u5fd7\u5e76\u9000\u51fa<\/span><br \/>\n        lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>Fatal<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;chdir fail&#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 function\">exit<\/span><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 comment\">\/\/ \u8bb0\u5f55\u6210\u529f\u8f6c\u6362\u4e3a\u5b88\u62a4\u8fdb\u7a0b\u7684\u65e5\u5fd7<\/span><br \/>\n    lg<span class=\"token punctuation\">.<\/span><span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span>info<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;demonize successfully&#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><span class=\"token punctuation\">;<\/span><\/p>\n<p>log.hpp:<\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">pragma<\/span> <span class=\"token expression\">once<\/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;iostream&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;string&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;time.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;unistd.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;stdarg.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;fcntl.h&gt;<\/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\">SIZE<\/span> <span class=\"token expression\"><span class=\"token number\">1024<\/span><\/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\">screen<\/span> <span class=\"token expression\"><span class=\"token number\">0<\/span><\/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\">File<\/span> <span class=\"token expression\"><span class=\"token number\">1<\/span><\/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\">ClassFile<\/span> <span class=\"token expression\"><span class=\"token number\">2<\/span><\/span><\/span><br \/>\n<span class=\"token keyword\">enum<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    info<span class=\"token punctuation\">,<\/span><br \/>\n    debug<span class=\"token punctuation\">,<\/span><br \/>\n    warning<span class=\"token punctuation\">,<\/span><br \/>\n    Fatal<span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">class<\/span> <span class=\"token class-name\">log<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">private<\/span><span class=\"token operator\">:<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>string memssage<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> method<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">public<\/span><span class=\"token operator\">:<\/span><br \/>\n    <span class=\"token function\">log<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> _method <span class=\"token operator\">&#061;<\/span> screen<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token operator\">:<\/span><span class=\"token function\">method<\/span><span class=\"token punctuation\">(<\/span>_method<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><\/p>\n<p>    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">void<\/span> <span class=\"token function\">logmessage<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> leval<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">char<\/span><span class=\"token operator\">*<\/span> format<span class=\"token punctuation\">,<\/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 punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">char<\/span><span class=\"token operator\">*<\/span> _leval<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">switch<\/span> <span class=\"token punctuation\">(<\/span>leval<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">case<\/span> info<span class=\"token operator\">:<\/span><br \/>\n            _leval <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;info&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">case<\/span> debug<span class=\"token operator\">:<\/span><br \/>\n            _leval <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;debug&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">case<\/span> warning<span class=\"token operator\">:<\/span><br \/>\n            _leval <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;warning&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">case<\/span> Fatal<span class=\"token operator\">:<\/span><br \/>\n            _leval <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;Fatal&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">default<\/span><span class=\"token operator\">:<\/span><br \/>\n            _leval<span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;unknow&#034;<\/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 keyword\">char<\/span> timebuffer<span class=\"token punctuation\">[<\/span>SIZE<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        time_t t <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">time<\/span><span class=\"token punctuation\">(<\/span><span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">tm<\/span><span class=\"token operator\">*<\/span> localTime <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">localtime<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>t<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">snprintf<\/span><span class=\"token punctuation\">(<\/span>timebuffer<span class=\"token punctuation\">,<\/span> SIZE<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;[%d-%d-%d-%d:%d]&#034;<\/span><span class=\"token punctuation\">,<\/span> localTime<span class=\"token operator\">-&gt;<\/span>tm_year <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">1900<\/span><span class=\"token punctuation\">,<\/span> localTime<span class=\"token operator\">-&gt;<\/span>tm_mon <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> localTime<span class=\"token operator\">-&gt;<\/span>tm_mday<span class=\"token punctuation\">,<\/span> localTime<span class=\"token operator\">-&gt;<\/span>tm_hour<span class=\"token punctuation\">,<\/span> localTime<span class=\"token operator\">-&gt;<\/span>tm_min<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">char<\/span> rightbuffer<span class=\"token punctuation\">[<\/span>SIZE<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        va_list arg<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">va_start<\/span><span class=\"token punctuation\">(<\/span>arg<span class=\"token punctuation\">,<\/span> format<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">vsnprintf<\/span><span class=\"token punctuation\">(<\/span>rightbuffer<span class=\"token punctuation\">,<\/span> SIZE<span class=\"token punctuation\">,<\/span> format<span class=\"token punctuation\">,<\/span> arg<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">va_end<\/span><span class=\"token punctuation\">(<\/span>arg<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">char<\/span> finalbuffer<span class=\"token punctuation\">[<\/span><span class=\"token number\">2<\/span> <span class=\"token operator\">*<\/span> SIZE<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">int<\/span> len <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">snprintf<\/span><span class=\"token punctuation\">(<\/span>finalbuffer<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>finalbuffer<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;[%s]%s:%s\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span> _leval<span class=\"token punctuation\">,<\/span> timebuffer<span class=\"token punctuation\">,<\/span> rightbuffer<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">int<\/span> fd<span class=\"token operator\">&#061;<\/span><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">switch<\/span> <span class=\"token punctuation\">(<\/span>method<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">case<\/span> screen<span class=\"token operator\">:<\/span><br \/>\n            std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> finalbuffer<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">case<\/span> File<span class=\"token operator\">:<\/span><br \/>\n            fd <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">open<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;log.txt&#034;<\/span><span class=\"token punctuation\">,<\/span> O_WRONLY <span class=\"token operator\">|<\/span> O_CREAT <span class=\"token operator\">|<\/span> O_APPEND<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0666<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>fd <span class=\"token operator\">&gt;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token function\">write<\/span><span class=\"token punctuation\">(<\/span>fd<span class=\"token punctuation\">,<\/span> finalbuffer<span class=\"token punctuation\">,<\/span> len<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 punctuation\">}<\/span><br \/>\n            <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">case<\/span> ClassFile<span class=\"token operator\">:<\/span><br \/>\n            <span class=\"token keyword\">switch<\/span> <span class=\"token punctuation\">(<\/span>leval<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">case<\/span> info<span class=\"token operator\">:<\/span><br \/>\n                fd <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">open<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;log\/info.txt&#034;<\/span><span class=\"token punctuation\">,<\/span> O_WRONLY <span class=\"token operator\">|<\/span> O_CREAT <span class=\"token operator\">|<\/span> O_APPEND<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0666<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">case<\/span> debug<span class=\"token operator\">:<\/span><br \/>\n                fd <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">open<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;log\/debug.txt&#034;<\/span><span class=\"token punctuation\">,<\/span> O_WRONLY <span class=\"token operator\">|<\/span> O_CREAT <span class=\"token operator\">|<\/span> O_APPEND<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0666<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">case<\/span> warning<span class=\"token operator\">:<\/span><br \/>\n                fd <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">open<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;log\/Warning.txt&#034;<\/span><span class=\"token punctuation\">,<\/span> O_WRONLY <span class=\"token operator\">|<\/span> O_CREAT <span class=\"token operator\">|<\/span> O_APPEND<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0666<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">case<\/span> Fatal<span class=\"token operator\">:<\/span><br \/>\n                fd <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">open<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;log\/Fatal.txt&#034;<\/span><span class=\"token punctuation\">,<\/span> O_WRONLY <span class=\"token operator\">|<\/span> O_CREAT <span class=\"token operator\">|<\/span> O_APPEND<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0666<\/span><span class=\"token punctuation\">)<\/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 keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>fd <span class=\"token operator\">&gt;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token function\">write<\/span><span class=\"token punctuation\">(<\/span>fd<span class=\"token punctuation\">,<\/span> finalbuffer<span class=\"token punctuation\">,<\/span> len<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 punctuation\">}<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">extern<\/span> log lg<span class=\"token punctuation\">;<\/span><\/p>\n<p>\u8fd0\u884c\u622a\u56fe&#xff1a; <img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/07\/20260727071703-6a6705ef18522.png\" alt=\"\u5728\u8fd9\u91cc\u63d2\u5165\u56fe\u7247\u63cf\u8ff0\" \/> \u538b\u6d4b\u62a5\u544a\u663e\u793a&#xff0c;\u6211\u4eec\u7684 PollServer \u5c55\u73b0\u51fa\u4e86\u6781\u5176\u527d\u608d\u7684\u6027\u80fd&#xff1a;\u5728 100 \u5e76\u53d1 \u7684\u6781\u9650\u65bd\u538b\u4e0b&#xff0c;\u8dd1\u51fa\u4e86 6113 QPS \u7684\u4f18\u5f02\u6210\u7ee9\u3002<\/p>\n<p>\u66f4\u4ee4\u4eba\u6b23\u6170\u7684\u662f&#xff0c;\u5931\u8d25\u8bf7\u6c42\u6570\u4e3a 0\u3002\u8fd9\u610f\u5473\u7740\u6211\u4eec\u4e3a\u89e3\u51b3 \u68c0\u67e5\u65f6\u523b\u4e0e\u4f7f\u7528\u65f6\u523b\u7684\u65f6\u95f4\u5dee \u8bef\u6740\u6f0f\u6d1e\u6240\u8bbe\u8ba1\u7684\u2018\u539f\u5b50\u62a2\u593a\u2019\u673a\u5236&#xff0c;\u4ee5\u53ca\u4e3a\u9632\u6b62\u91ce\u6307\u9488\u5d29\u6e83\u6240\u5f15\u5165\u7684 shared_ptr \u9632\u7ebf&#xff0c;\u5728 10,000 \u6b21\u5b9e\u6218\u51b2\u51fb\u4e2d\u5c55\u73b0\u51fa\u4e86\u94a2\u94c1\u822c\u7684\u7a33\u5b9a\u6027\u3002\u6bcf\u4e00\u4efd\u5b57\u8282\u7684\u6d41\u52a8&#xff0c;\u90fd\u5728\u6211\u4eec\u7684\u903b\u8f91\u638c\u63a7\u4e4b\u4e2d\u3002 <img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/07\/20260727071704-6a6705f04f004.png\" alt=\"\u5728\u8fd9\u91cc\u63d2\u5165\u56fe\u7247\u63cf\u8ff0\" \/> <img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/07\/20260727071706-6a6705f21eff1.png\" alt=\"\u5728\u8fd9\u91cc\u63d2\u5165\u56fe\u7247\u63cf\u8ff0\" \/> <img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/07\/20260727071707-6a6705f3c73a8.png\" alt=\"\u5728\u8fd9\u91cc\u63d2\u5165\u56fe\u7247\u63cf\u8ff0\" \/><\/p>\n<h2>\u7ed3\u8bed<\/h2>\n<p>\u90a3\u4e48\u8fd9\u5c31\u662f\u672c\u7bc7\u6587\u7ae0\u7684\u5168\u90e8\u5185\u5bb9&#xff0c;\u5e26\u4f60\u5168\u9762\u8ba4\u8bc6\u4ee5\u53ca\u638c\u63e1IO\u591a\u8def\u590d\u7528\u4ee5select\u4ee5\u53caPoll&#xff0c;\u5e76\u4e14\u624b\u5199\u4e86\u4e00\u4e2a\u9ad8\u5e76\u53d1\u7684HTTP\u670d\u52a1\u5668&#xff0c;\u63a5\u4e0b\u6765\u6211\u4f1a\u66f4\u65b0epoll&#xff0c;\u6211\u4f1a\u6301\u7eed\u66f4\u65b0&#xff0c;\u5e0c\u671b\u4f60\u80fd\u591f\u591a\u591a\u5173\u6ce8&#xff0c;\u5982\u679c\u672c\u6587\u6709\u5e2e\u52a9\u5230\u4f60\u7684\u8bdd&#xff0c;\u8fd8\u8bf7\u4e09\u8fde\u52a0\u5173\u6ce8&#xff0c;\u4f60\u7684\u652f\u6301\u5c31\u662f\u6211\u521b\u4f5c\u7684\u6700\u5927\u52a8\u529b&#xff01; <img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/07\/20260727071709-6a6705f54b7df.jpg\" alt=\"\u5728\u8fd9\u91cc\u63d2\u5165\u56fe\u7247\u63cf\u8ff0\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>&#x1f525; \u672c\u6587\u4e13\u680f&#xff1a;Linux\u7f51\u7edc &#x1f338;\u4f5c\u8005\u4e3b\u9875&#xff1a;\u52aa\u529b\u52aa\u529b\u518d\u52aa\u529bwz &#x1f4aa; \u4eca\u65e5\u535a\u5ba2\u52b1\u5fd7\u8bed\u5f55&#xff1a;\u9057\u61be\u662f\u8fc7\u53bb\u7684\u7070\u5c18&#xff0c;\u800c\u5e0c\u671b\u662f\u672a\u6765\u7684\u5149&#xff1b;\u522b\u56e0\u4e3a\u5fd9\u7740\u64e6\u7070&#xff0c;\u800c\u9519\u8fc7\u4e86\u63a8\u5f00\u7a97\u6237\u7684\u673a\u4f1a\u3002 \u2605\u2605\u2605 \u672c\u6587\u524d\u7f6e\u77e5\u8bc6&#xff1a;<br \/>\nHTTP  \u5f15\u5165<br \/>\n\u90a3\u4e48\u6b64\u524d\u6211\u4eec\u5df2\u7ecf\u5b8c\u6210\u4e86\u7f51\u7edc\u539f\u7406\u76f8\u5173\u5185\u5bb9\u7684\u5b66\u4e60&#xff0c;\u5176\u4e2d\u5305\u62ec\u4f7f\u7528\u7f51\u7edc\u7f16\u7a0b&#xff08;\u5373\u901a\u8fc7 TCP \u548c UDP \u7c7b<\/p>\n","protected":false},"author":2,"featured_media":85436,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[55,174,58,43,44],"topic":[],"class_list":["post-85444","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-server","tag-c","tag-linux","tag-43","tag-44"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u3010Linux\u7f51\u7edc\u7cfb\u5217\u3011\u6df1\u5165\u7406\u89e3 I\/O \u591a\u8def\u590d\u7528\uff1a\u4ece select \u75db\u70b9\u5230 poll \u9ad8\u5e76\u53d1\u670d\u52a1\u5668\u843d\u5730\uff0c\u57fa\u4e8e Poll\u3001\u667a\u80fd\u6307\u9488\u4e0e\u975e\u963b\u585e I\/O\u4e0e\u7ebf\u7a0b\u6c60\u624b\u5199\u4e00\u4e2a\u9ad8\u6027\u80fd HTTP \u670d\u52a1\u5668\uff01\uff08\u9644\u6e90\u7801\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\/85444.html\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u3010Linux\u7f51\u7edc\u7cfb\u5217\u3011\u6df1\u5165\u7406\u89e3 I\/O \u591a\u8def\u590d\u7528\uff1a\u4ece select \u75db\u70b9\u5230 poll \u9ad8\u5e76\u53d1\u670d\u52a1\u5668\u843d\u5730\uff0c\u57fa\u4e8e Poll\u3001\u667a\u80fd\u6307\u9488\u4e0e\u975e\u963b\u585e I\/O\u4e0e\u7ebf\u7a0b\u6c60\u624b\u5199\u4e00\u4e2a\u9ad8\u6027\u80fd HTTP \u670d\u52a1\u5668\uff01\uff08\u9644\u6e90\u7801\uff09 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"og:description\" content=\"&#x1f525; \u672c\u6587\u4e13\u680f&#xff1a;Linux\u7f51\u7edc &#x1f338;\u4f5c\u8005\u4e3b\u9875&#xff1a;\u52aa\u529b\u52aa\u529b\u518d\u52aa\u529bwz &#x1f4aa; \u4eca\u65e5\u535a\u5ba2\u52b1\u5fd7\u8bed\u5f55&#xff1a;\u9057\u61be\u662f\u8fc7\u53bb\u7684\u7070\u5c18&#xff0c;\u800c\u5e0c\u671b\u662f\u672a\u6765\u7684\u5149&#xff1b;\u522b\u56e0\u4e3a\u5fd9\u7740\u64e6\u7070&#xff0c;\u800c\u9519\u8fc7\u4e86\u63a8\u5f00\u7a97\u6237\u7684\u673a\u4f1a\u3002 \u2605\u2605\u2605 \u672c\u6587\u524d\u7f6e\u77e5\u8bc6&#xff1a; HTTP \u5f15\u5165 \u90a3\u4e48\u6b64\u524d\u6211\u4eec\u5df2\u7ecf\u5b8c\u6210\u4e86\u7f51\u7edc\u539f\u7406\u76f8\u5173\u5185\u5bb9\u7684\u5b66\u4e60&#xff0c;\u5176\u4e2d\u5305\u62ec\u4f7f\u7528\u7f51\u7edc\u7f16\u7a0b&#xff08;\u5373\u901a\u8fc7 TCP \u548c UDP \u7c7b\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.wsisp.com\/helps\/85444.html\" \/>\n<meta property=\"og:site_name\" content=\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-27T07:17:10+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/07\/20260727071702-6a6705ee7be4c.gif\" \/>\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=\"70 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/85444.html\",\"url\":\"https:\/\/www.wsisp.com\/helps\/85444.html\",\"name\":\"\u3010Linux\u7f51\u7edc\u7cfb\u5217\u3011\u6df1\u5165\u7406\u89e3 I\/O \u591a\u8def\u590d\u7528\uff1a\u4ece select \u75db\u70b9\u5230 poll \u9ad8\u5e76\u53d1\u670d\u52a1\u5668\u843d\u5730\uff0c\u57fa\u4e8e Poll\u3001\u667a\u80fd\u6307\u9488\u4e0e\u975e\u963b\u585e I\/O\u4e0e\u7ebf\u7a0b\u6c60\u624b\u5199\u4e00\u4e2a\u9ad8\u6027\u80fd HTTP \u670d\u52a1\u5668\uff01\uff08\u9644\u6e90\u7801\uff09 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"isPartOf\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\"},\"datePublished\":\"2026-07-27T07:17:10+00:00\",\"dateModified\":\"2026-07-27T07:17:10+00:00\",\"author\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/85444.html#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.wsisp.com\/helps\/85444.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/85444.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.wsisp.com\/helps\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u3010Linux\u7f51\u7edc\u7cfb\u5217\u3011\u6df1\u5165\u7406\u89e3 I\/O \u591a\u8def\u590d\u7528\uff1a\u4ece select \u75db\u70b9\u5230 poll \u9ad8\u5e76\u53d1\u670d\u52a1\u5668\u843d\u5730\uff0c\u57fa\u4e8e Poll\u3001\u667a\u80fd\u6307\u9488\u4e0e\u975e\u963b\u585e I\/O\u4e0e\u7ebf\u7a0b\u6c60\u624b\u5199\u4e00\u4e2a\u9ad8\u6027\u80fd HTTP \u670d\u52a1\u5668\uff01\uff08\u9644\u6e90\u7801\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":"\u3010Linux\u7f51\u7edc\u7cfb\u5217\u3011\u6df1\u5165\u7406\u89e3 I\/O \u591a\u8def\u590d\u7528\uff1a\u4ece select \u75db\u70b9\u5230 poll \u9ad8\u5e76\u53d1\u670d\u52a1\u5668\u843d\u5730\uff0c\u57fa\u4e8e Poll\u3001\u667a\u80fd\u6307\u9488\u4e0e\u975e\u963b\u585e I\/O\u4e0e\u7ebf\u7a0b\u6c60\u624b\u5199\u4e00\u4e2a\u9ad8\u6027\u80fd HTTP \u670d\u52a1\u5668\uff01\uff08\u9644\u6e90\u7801\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\/85444.html","og_locale":"zh_CN","og_type":"article","og_title":"\u3010Linux\u7f51\u7edc\u7cfb\u5217\u3011\u6df1\u5165\u7406\u89e3 I\/O \u591a\u8def\u590d\u7528\uff1a\u4ece select \u75db\u70b9\u5230 poll \u9ad8\u5e76\u53d1\u670d\u52a1\u5668\u843d\u5730\uff0c\u57fa\u4e8e Poll\u3001\u667a\u80fd\u6307\u9488\u4e0e\u975e\u963b\u585e I\/O\u4e0e\u7ebf\u7a0b\u6c60\u624b\u5199\u4e00\u4e2a\u9ad8\u6027\u80fd HTTP \u670d\u52a1\u5668\uff01\uff08\u9644\u6e90\u7801\uff09 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","og_description":"&#x1f525; \u672c\u6587\u4e13\u680f&#xff1a;Linux\u7f51\u7edc &#x1f338;\u4f5c\u8005\u4e3b\u9875&#xff1a;\u52aa\u529b\u52aa\u529b\u518d\u52aa\u529bwz &#x1f4aa; \u4eca\u65e5\u535a\u5ba2\u52b1\u5fd7\u8bed\u5f55&#xff1a;\u9057\u61be\u662f\u8fc7\u53bb\u7684\u7070\u5c18&#xff0c;\u800c\u5e0c\u671b\u662f\u672a\u6765\u7684\u5149&#xff1b;\u522b\u56e0\u4e3a\u5fd9\u7740\u64e6\u7070&#xff0c;\u800c\u9519\u8fc7\u4e86\u63a8\u5f00\u7a97\u6237\u7684\u673a\u4f1a\u3002 \u2605\u2605\u2605 \u672c\u6587\u524d\u7f6e\u77e5\u8bc6&#xff1a; HTTP \u5f15\u5165 \u90a3\u4e48\u6b64\u524d\u6211\u4eec\u5df2\u7ecf\u5b8c\u6210\u4e86\u7f51\u7edc\u539f\u7406\u76f8\u5173\u5185\u5bb9\u7684\u5b66\u4e60&#xff0c;\u5176\u4e2d\u5305\u62ec\u4f7f\u7528\u7f51\u7edc\u7f16\u7a0b&#xff08;\u5373\u901a\u8fc7 TCP \u548c UDP \u7c7b","og_url":"https:\/\/www.wsisp.com\/helps\/85444.html","og_site_name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","article_published_time":"2026-07-27T07:17:10+00:00","og_image":[{"url":"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/07\/20260727071702-6a6705ee7be4c.gif"}],"author":"admin","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"admin","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"70 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.wsisp.com\/helps\/85444.html","url":"https:\/\/www.wsisp.com\/helps\/85444.html","name":"\u3010Linux\u7f51\u7edc\u7cfb\u5217\u3011\u6df1\u5165\u7406\u89e3 I\/O \u591a\u8def\u590d\u7528\uff1a\u4ece select \u75db\u70b9\u5230 poll \u9ad8\u5e76\u53d1\u670d\u52a1\u5668\u843d\u5730\uff0c\u57fa\u4e8e Poll\u3001\u667a\u80fd\u6307\u9488\u4e0e\u975e\u963b\u585e I\/O\u4e0e\u7ebf\u7a0b\u6c60\u624b\u5199\u4e00\u4e2a\u9ad8\u6027\u80fd HTTP \u670d\u52a1\u5668\uff01\uff08\u9644\u6e90\u7801\uff09 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","isPartOf":{"@id":"https:\/\/www.wsisp.com\/helps\/#website"},"datePublished":"2026-07-27T07:17:10+00:00","dateModified":"2026-07-27T07:17:10+00:00","author":{"@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41"},"breadcrumb":{"@id":"https:\/\/www.wsisp.com\/helps\/85444.html#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.wsisp.com\/helps\/85444.html"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.wsisp.com\/helps\/85444.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.wsisp.com\/helps"},{"@type":"ListItem","position":2,"name":"\u3010Linux\u7f51\u7edc\u7cfb\u5217\u3011\u6df1\u5165\u7406\u89e3 I\/O \u591a\u8def\u590d\u7528\uff1a\u4ece select \u75db\u70b9\u5230 poll \u9ad8\u5e76\u53d1\u670d\u52a1\u5668\u843d\u5730\uff0c\u57fa\u4e8e Poll\u3001\u667a\u80fd\u6307\u9488\u4e0e\u975e\u963b\u585e I\/O\u4e0e\u7ebf\u7a0b\u6c60\u624b\u5199\u4e00\u4e2a\u9ad8\u6027\u80fd HTTP \u670d\u52a1\u5668\uff01\uff08\u9644\u6e90\u7801\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\/85444","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=85444"}],"version-history":[{"count":0,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/85444\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media\/85436"}],"wp:attachment":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media?parent=85444"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/categories?post=85444"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/tags?post=85444"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/topic?post=85444"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}