{"id":28254,"date":"2025-04-19T23:31:35","date_gmt":"2025-04-19T15:31:35","guid":{"rendered":"https:\/\/www.wsisp.com\/helps\/28254.html"},"modified":"2025-04-19T23:31:35","modified_gmt":"2025-04-19T15:31:35","slug":"%e5%a4%9a%e7%ba%bf%e7%a8%8b%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%88%86%e6%9e%90-reactor%e7%ba%bf%e7%a8%8b%e6%a8%a1%e5%9e%8b%e5%92%8c%e6%80%a7%e8%83%bd%e5%88%86%e6%9e%90%e4%b8%80","status":"publish","type":"post","link":"https:\/\/www.wsisp.com\/helps\/28254.html","title":{"rendered":"\u591a\u7ebf\u7a0b\u670d\u52a1\u5668\u5206\u6790\u2014\u2014Reactor\u7ebf\u7a0b\u6a21\u578b\u548c\u6027\u80fd\u5206\u6790(\u4e00)"},"content":{"rendered":"<p>\u4e0a\u63a5\u591a\u7ebf\u7a0b\u670d\u52a1\u5668\u5206\u6790\u2014\u2014Reactor\u7ebf\u7a0b\u6a21\u578b\u548c\u6027\u80fd\u5206\u6790(\u5e8f\u7ae0)<\/p>\n<p>\u5728\u5e8f\u7ae0\u4e2d\u7684\u6700\u540e\u63d0\u5230\u4e86\u4e24\u4e2a\u670d\u52a1\u5668\u74f6\u9888\u7684\u539f\u56e0&#xff1a; 1\u3001\u80fd\u591f\u6269\u5c55\u7684\u7ebf\u7a0b\u6570\u91cf\u662f\u6709\u9650\u7684 2\u3001\u963b\u585e\u5f0f\u7684\u7b49\u5f85socket\u4f1a\u8ba9\u7ebf\u7a0b\u4e00\u76f4\u5904\u4e8e\u7a7a\u95f2\u72b6\u6001&#xff08;\u5f53\u7136socket\u53ef\u4ee5\u6362\u6210\u5176\u4ed6\u6587\u4ef6\u63cf\u8ff0\u7b26&#xff09;<\/p>\n<p>\u9488\u5bf9\u95ee\u98981&#xff0c;\u65e2\u7136\u7ebf\u7a0b\u7684\u6570\u91cf\u662f\u6709\u9650\u7684&#xff0c;\u90a3\u6211\u4eec\u5c31\u5c3d\u6700\u5927\u7684\u53ef\u80fd\u53bb\u5229\u7528\u5b83&#xff0c;\u69a8\u5e72\u5b83\u7684\u80fd\u529b&#xff1b;\u9488\u5bf9\u95ee\u98982&#xff0c;\u5219\u53ef\u4ee5\u6362\u4e00\u79cd\u601d\u8def&#xff0c;\u5982\u679c\u5f53\u524d\u7684socket\u6ca1\u6709\u6570\u636e\u4f20\u8f93\u8fc7\u6765&#xff0c;\u90a3\u5c31\u7acb\u5373\u8fd4\u56de\u4e00\u4e2a\u9519\u8bef\u4fe1\u606f&#xff0c;\u5904\u7406\u4e0b\u4e00\u4e2a\u5efa\u7acb\u7684\u8fde\u63a5&#xff0c;\u7136\u540e\u5faa\u73af\u8be2\u95ee\u6240\u6709\u5efa\u7acb\u7684\u8fde\u63a5\u7684socket&#xff0c;\u5982\u679c\u67d0\u4e2asocket\u6709\u6570\u636e\u4f20\u8f93\u8fc7\u6765\u5c31\u7acb\u9a6c\u8fdb\u884c\u5904\u7406&#xff0c;\u8fd9\u5c31\u662f\u975e\u963b\u585e(NIO)\u7684\u601d\u60f3\u3002<\/p>\n<h3>3.3 \u975e\u963b\u585e\u5355\u7ebf\u7a0b\u670d\u52a1\u5668<\/h3>\n<p>\u5728\u4ecb\u7ecd\u975e\u963b\u585e\u7684\u591a\u7ebf\u7a0b\u670d\u52a1\u5668\u4e4b\u524d&#xff0c;\u5148\u4ecb\u7ecd\u51e0\u4e2a\u6982\u5ff5&#xff0c;\u76f8\u4fe1\u8bfb\u8005\u770b\u8fc7\u4e4b\u540e\u4f1a\u5bf9\u6700\u7ec8\u4ecb\u7ecd\u7684\u591a\u7ebf\u7a0b\u670d\u52a1\u5668\u6a21\u578b\u7684\u7406\u89e3\u6709\u5e2e\u52a9\u3002\u8fd9\u91cc\u6211\u4eec\u53c8\u6682\u65f6\u56de\u5230\u4e86\u5355\u7ebf\u7a0b\u670d\u52a1\u5668&#xff0c;\u53ea\u80fd\u5148\u59d4\u5c48\u4e00\u4e0b\u4f60\u7684\u714e\u997c\u679c\u5b50\u644a\u4e86:-)\u3002<\/p>\n<h4>3.3.1 \u975e\u963b\u585eIO<\/h4>\n<p>\u9644\u8fd1\u7684\u516c\u53f8\u5012\u95ed\u4e86&#xff0c;\u4f60\u53ea\u5f97\u53e6\u8d77\u7089\u7076\u6362\u5730\u65b9&#xff0c;\u4e5f\u96c7\u4e0d\u8d77\u6708\u85aa2\u4e07\u7684\u4f19\u8ba1\u4e86&#xff0c;\u4e0d\u8fc7\u4f60\u6709\u4e86\u4e0a\u6b21\u7684\u7ecf\u9a8c&#xff0c;\u5347\u7ea7\u4e86\u714e\u997c\u679c\u5b50&#xff0c;\u53ef\u4ee5\u52a0\u9e21\u6392\u3001\u52a0\u9e21\u86cb&#xff0c;\u52a0\u8fa3\u6761\u7b49\u7b49\u3002\u4f46\u6e10\u6e10\u7684\u4f60\u53d1\u73b0\u4e86\u4e00\u4e2a\u95ee\u9898&#xff0c;\u9762\u5bf9\u8bf8\u591a\u9009\u62e9\u987e\u5ba2\u4eec\u53cd\u800c\u72b9\u8c6b\u4e0d\u51b3&#xff0c;\u4e0d\u77e5\u9053\u8be5\u52a0\u5565&#xff0c;\u7ad9\u5728\u644a\u4f4d\u524d\u9009\u534a\u5929\u624d\u9009\u597d&#xff0c;\u540e\u9762\u6709\u60f3\u597d\u4e70\u4ec0\u4e48\u7684\u987e\u5ba2\u4e5f\u6ca1\u6cd5\u4e70&#xff0c;\u7b49\u4e86\u534a\u5929\u8d70\u4e86\u3002 \u4e8e\u662f\u4f60\u5c31\u81ea\u5df1\u6328\u4e2a\u95ee\u987e\u5ba2&#xff0c;\u9009\u597d\u7684\u987e\u5ba2\u4f1a\u628a\u714e\u997c\u679c\u5b50\u7684\u8981\u6c42\u544a\u8bc9\u4f60&#xff0c;\u4f60\u518d\u628a\u6c47\u603b\u7684\u4fe1\u606f\u62ff\u56de\u644a\u4f4d\u6328\u4e2a\u53bb\u505a&#xff0c;\u8fd9\u6837\u4e00\u6765\u6548\u7387\u5c31\u9ad8\u591a\u4e86\u3002<\/p>\n<p>\u4e0d\u7b49\u5f85\u987e\u5ba2\u63d0\u51fa\u8981\u6c42&#xff0c;\u7c7b\u6bd4\u5230\u4ee3\u7801\u4e0a\u5c31\u662f\u4e0d\u7b49\u5f85\u6587\u4ef6\u63cf\u8ff0\u7b26\u51c6\u5907\u597d\u6570\u636e&#xff0c;\u800c\u662f\u6ca1\u51c6\u5907\u597d\u8fd4\u56de\u300e\u6ca1\u51c6\u5907\u597d\u300f&#xff0c;\u51c6\u5907\u597d\u4e86\u5c31\u8bfb\u6570\u636e\u3002\u5177\u8c61\u5316\u5230socket&#xff0c;\u5f53\u8fdb\u884cread\/recv socket\u7684\u64cd\u4f5c\u65f6&#xff0c;\u6240\u8c13\u7684\u300e\u6ca1\u51c6\u5907\u597d\u300f\u7684\u9519\u8bef\u7801\u5c31\u662fEAGAIN \u6216\u8005 EWOULDBLOCK\u3002<\/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\">&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;sys\/socket.h&gt;<\/span><\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> sockfd <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">socket<\/span><span class=\"token punctuation\">(<\/span>AF_INET<span class=\"token punctuation\">,<\/span> SOCK_STREAM<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u521b\u5efa socket<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u83b7\u53d6 socket \u7684\u5f53\u524d flags<\/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>sockfd<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><br \/>\n<span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>flags <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u5904\u7406\u9519\u8bef<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u8bbe\u7f6e socket \u4e3a\u975e\u963b\u585e\u6a21\u5f0f<\/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>sockfd<span class=\"token punctuation\">,<\/span> F_SETFL<span class=\"token punctuation\">,<\/span> flags <span class=\"token operator\">|<\/span> O_NONBLOCK<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u5904\u7406\u9519\u8bef<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><\/p>\n<p>ssize_t bytes_read <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">read<\/span><span class=\"token punctuation\">(<\/span>sockfd<span class=\"token punctuation\">,<\/span> buffer<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>buffer<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>bytes_read <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>errno <span class=\"token operator\">&#061;&#061;<\/span> EAGAIN <span class=\"token operator\">||<\/span> errno <span class=\"token operator\">&#061;&#061;<\/span> EWOULDBLOCK<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u6ca1\u6709\u6570\u636e\u53ef\u8bfb&#xff0c;\u975e\u963b\u585e\u64cd\u4f5c<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u5728\u8fd9\u91cc\u5904\u7406\u6ca1\u6709\u6570\u636e\u7684\u60c5\u51b5<\/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\">\/\/ \u53d1\u751f\u4e86\u5176\u4ed6\u9519\u8bef<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u4e0a\u9762\u7684\u4ee3\u7801\u5c31\u662f\u8bbe\u7f6esocket\u975e\u963b\u585e\u4ee5\u53ca\u975e\u963b\u585e\u8bfb\u53d6socket\u7684\u8fc7\u7a0b\u3002\u501f\u52a9\u975e\u963b\u585eIO&#xff0c;\u5c31\u53ef\u4ee5\u901a\u8fc7\u4e00\u4e2a\u7ebf\u7a0b\u76d1\u542c\u6240\u6709\u7684socket\u72b6\u6001&#xff0c;\u54ea\u4e2asocket\u51c6\u5907\u597d\u5c31\u5904\u7406\u54ea\u4e2asocket\u3002<\/p>\n<h4>3.3.2 IO\u591a\u8def\u590d\u7528(IO-Multiplexing)<\/h4>\n<p>\u4f60\u89c9\u5f97\u6328\u4e2a\u53bb\u6536\u96c6\u987e\u5ba2\u7684\u8981\u6c42\u6709\u70b9\u6162&#xff0c;\u4e8e\u662f\u4f60\u5efa\u4e86\u4e00\u4e2a\u5fae\u4fe1\u7fa4&#xff0c;\u987e\u5ba2\u76f4\u63a5\u628a\u9700\u6c42\u53d1\u5230\u7fa4\u91cc&#xff0c;\u4f60\u6bcf\u8fc7\u4e00\u4f1a\u513f\u5c31\u53bb\u770b\u4e00\u773c\u5fae\u4fe1\u7fa4&#xff0c;\u628a\u6bcf\u4e2a\u5fae\u4fe1\u53f7\u5bf9\u5e94\u7684\u9700\u6c42\u8bb0\u4e0b\u6765\u5199\u5728\u5c0f\u7eb8\u6761\u4e0a&#xff0c;\u7136\u540e\u505a\u8fd9\u4e9b\u5c0f\u7eb8\u6761\u4e0a\u5199\u597d\u7684\u714e\u997c\u679c\u5b50\u9700\u6c42\u3002<\/p>\n<p>\u6709\u4e86\u975e\u963b\u585eIO&#xff0c;\u670d\u52a1\u5668\u7684\u5904\u7406\u903b\u8f91\u5c31\u53ef\u4ee5\u5c06\u6240\u6709\u5efa\u7acb\u8fde\u63a5\u7684socket\u653e\u5230\u4e00\u4e2a\u5217\u8868\u4e2d&#xff0c;\u63a5\u7740\u5efa\u7acb\u4e00\u4e2a\u5faa\u73af\u904d\u5386\u8fd9\u4e2a\u5217\u8868&#xff0c;\u6bcf\u5f53\u6709socket\u53ef\u8bfb\u65f6\u5c31\u53bb\u5904\u7406&#xff1b;\u4f46\u662f\u5f53\u8bf7\u6c42\u7684\u6570\u91cf\u8d8a\u6765\u8d8a\u591a\u7684\u65f6\u5019&#xff0c;\u7ef4\u62a4\u7684\u5217\u8868\u4e5f\u8d8a\u6765\u8d8a\u957f&#xff0c;\u904d\u5386\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u662f<span class=\"katex--inline\"><span class=\"katex\"><span class=\"katex-mathml\"> <\/p>\n<p>         O <\/p>\n<p>         ( <\/p>\n<p>         n <\/p>\n<p>         ) <\/p>\n<p>        O(n) <\/p>\n<p>    <\/span><span class=\"katex-html\"><span class=\"base\"><span class=\"strut\" style=\"height: 1em;vertical-align: -0.25em\"><\/span><span class=\"mord mathnormal\" style=\"margin-right: 0.0278em\">O<\/span><span class=\"mopen\">(<\/span><span class=\"mord mathnormal\">n<\/span><span class=\"mclose\">)<\/span><\/span><\/span><\/span><\/span>&#xff0c;<span class=\"katex--inline\"><span class=\"katex\"><span class=\"katex-mathml\"> <\/p>\n<p>         n <\/p>\n<p>        n <\/p>\n<p>    <\/span><span class=\"katex-html\"><span class=\"base\"><span class=\"strut\" style=\"height: 0.4306em\"><\/span><span class=\"mord mathnormal\">n<\/span><\/span><\/span><\/span><\/span>\u5c31\u662f\u5217\u8868\u7684\u957f\u5ea6\u3002Linux\u5219\u4e3a\u6211\u4eec\u63d0\u4f9b\u4e86IO\u591a\u8def\u590d\u7528\u8fd9\u4e00\u673a\u5236&#xff0c;\u53ef\u4ee5\u76f4\u63a5\u8fd4\u56de\u76d1\u542c\u5217\u8868\u4e2d\u6240\u6709\u72b6\u6001\u53d1\u751f\u53d8\u5316\u7684socket(\u6216\u8005\u5176\u4ed6file descriptor&#xff0c;\u4ee5\u4e0b\u7b80\u79f0fd)&#xff0c;\u907f\u514d\u4e86\u904d\u5386\u4e00\u904d\u5374\u53ea\u6709\u5f88\u5c11\u751a\u81f3\u6ca1\u6709fd\u53d1\u751f\u53d8\u5316\u7684\u7a98\u5883&#xff0c;\u63d0\u9ad8\u4e86\u6027\u80fd\u3002\u5c31\u50cf\u672c\u8282\u5f00\u5934\u63d0\u5230\u7684\u714e\u997c\u679c\u5b50\u8001\u677f\u7684\u505a\u6cd5&#xff0c;\u76f4\u63a5\u62ff\u5230\u51c6\u5907\u597d\u4e0b\u5355\u987e\u5ba2\u7684\u9700\u6c42&#xff0c;\u800c\u4e0d\u662f\u6328\u4e2a\u8be2\u95ee\u3002 \u7531\u4e8e\u672c\u6587\u4e0d\u662f\u4e3b\u8981\u4ecb\u7ecdIO\u591a\u8def\u590d\u7528\u7684\u6587\u7ae0&#xff0c;\u5728\u8fd9\u91cc\u4e00\u6b65\u5230\u4f4d\u4f7f\u7528epoll\u8fdb\u884c\u76d1\u542c&#xff0c;\u5bf9\u6b64\u4e0d\u592a\u719f\u6089\u7684\u8bfb\u8005\u53ef\u4ee5\u5148\u4e86\u89e3select\u3001poll\u5230epoll\u7684\u53d1\u5c55\u8fc7\u7a0b\u4ee5\u53ca\u5b83\u4eec\u7684\u4f7f\u7528\u65b9\u6cd5\u3002<\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> epoll_fd <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">epoll_create1<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>epoll_fd <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token 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\">int<\/span> listen_sock <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">socket<\/span><span class=\"token punctuation\">(<\/span>AF_INET<span class=\"token punctuation\">,<\/span> SOCK_STREAM<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u8bbe\u7f6e socket \u4e3a\u975e\u963b\u585e\u6a21\u5f0f&#xff08;\u53ef\u9009&#xff09;<\/span><br \/>\n    <span class=\"token function\">fcntl<\/span><span class=\"token punctuation\">(<\/span>listen_sock<span class=\"token punctuation\">,<\/span> F_SETFL<span class=\"token punctuation\">,<\/span> <span class=\"token function\">fcntl<\/span><span class=\"token punctuation\">(<\/span>listen_sock<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 operator\">|<\/span> O_NONBLOCK<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u7ed1\u5b9a\u548c\u76d1\u542csocket<\/span><br \/>\n    <span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><\/p>\n<p>    <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">epoll_event<\/span> ev<span class=\"token punctuation\">,<\/span> events<span class=\"token punctuation\">[<\/span>MAX_EVENTS<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    ev<span class=\"token punctuation\">.<\/span>events <span class=\"token operator\">&#061;<\/span> EPOLLIN<span class=\"token punctuation\">;<\/span><br \/>\n    ev<span class=\"token punctuation\">.<\/span>data<span class=\"token punctuation\">.<\/span>fd <span class=\"token operator\">&#061;<\/span> listen_sock<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u6dfb\u52a0\u76d1\u542c socket \u5230 epoll \u5b9e\u4f8b<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">epoll_ctl<\/span><span class=\"token punctuation\">(<\/span>epoll_fd<span class=\"token punctuation\">,<\/span> EPOLL_CTL_ADD<span class=\"token punctuation\">,<\/span> listen_sock<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>ev<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token 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\">for<\/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\">\/\/ \u7b49\u5f85\u4e8b\u4ef6<\/span><br \/>\n        <span class=\"token keyword\">int<\/span> nfds <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">epoll_wait<\/span><span class=\"token punctuation\">(<\/span>epoll_fd<span class=\"token punctuation\">,<\/span> events<span class=\"token punctuation\">,<\/span> MAX_EVENTS<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u5904\u7406\u4e8b\u4ef6<\/span><br \/>\n        <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> n <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> n <span class=\"token operator\">&lt;<\/span> nfds<span class=\"token punctuation\">;<\/span> <span class=\"token operator\">&#043;&#043;<\/span>n<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>events<span class=\"token punctuation\">[<\/span>n<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>data<span class=\"token punctuation\">.<\/span>fd <span class=\"token operator\">&#061;&#061;<\/span> listen_sock<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token comment\">\/\/ \u63a5\u53d7\u65b0\u8fde\u63a5\u5e76\u52a0\u5165\u76d1\u542c<\/span><br \/>\n                <span class=\"token keyword\">int<\/span> conn_sock <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">accept<\/span><span class=\"token punctuation\">(<\/span>listen_sock<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 punctuation\">;<\/span><br \/>\n                <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><span class=\"token function\">epoll_ctl<\/span><span class=\"token punctuation\">(<\/span>epoll_fd<span class=\"token punctuation\">,<\/span> EPOLL_CTL_ADD<span class=\"token punctuation\">,<\/span> conn_sock<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>ev<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                    <span class=\"token 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> <span class=\"token keyword\">else<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token comment\">\/\/ \u5904\u7406socket\u4e0a\u7684\u53ef\u8bfb\u4e8b\u4ef6&lt;1&gt;<\/span><br \/>\n                <span class=\"token keyword\">char<\/span> buf<span class=\"token punctuation\">[<\/span><span class=\"token number\">512<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                ssize_t count <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">read<\/span><span class=\"token punctuation\">(<\/span>events<span class=\"token punctuation\">[<\/span>n<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>data<span class=\"token punctuation\">.<\/span>fd<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 punctuation\">;<\/span><br \/>\n                <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\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h4>3.3.3 \u5355\u7ebf\u7a0bReactor\u6a21\u578b<\/h4>\n<p>\u3010\u4ee3\u7801&#xff1a;reactor\/single_thread_reactor\u3011 \u7ed3\u54083.3.1\u548c3.3.2\u7684\u5185\u5bb9\u5c31\u662f\u4e00\u4e2a\u6700\u57fa\u7840\u7684\u5355\u7ebf\u7a0breactor&#xff0c;\u5176\u672c\u8d28\u5c31\u662fnon-blocking\u548cIO multiplexing\u3002\u5728\u4e00\u4e2a\u6b7b\u5faa\u73af\u4e2d\u8c03\u7528epoll_wait&#xff0c;\u5f97\u5230\u53ef\u8bfb\u7684socket\u5217\u8868&#xff0c;\u5e76\u4f9d\u6b21\u9488\u5bf9\u8fd9\u4e9bsocket\u6267\u884cread\u64cd\u4f5c&#xff0c;\u5c06read\u51fa\u7684\u6570\u636e\u8fdb\u884c\u5904\u7406\u3002\u5c063.3.2\u4e2d\u7684\u4ee3\u7801\u4e2d\u7684&lt;1&gt;\u5904\u7684read\u6362\u6210handle_request(int fd)&#xff0c;handle_request\u8fd9\u4e2a\u51fd\u6570\u53ef\u4ee5\u66ff\u6362\u6210\u4efb\u610f\u9488\u5bf9\u5ba2\u6237\u7aef\u53d1\u6765\u7684\u6570\u636e\u7684\u5904\u7406\u51fd\u6570&#xff0c;\u4f8b\u5982\u5728tcp server\u7684\u57fa\u7840\u4e0a\u6dfb\u52a0\u4e00\u4e2ahttp\u7684\u5e93\u89e3\u6790\u6765\u81ea\u5ba2\u6237\u7aef\u7684http\u8bf7\u6c42\u3002\u5982\u679c\u9700\u8981\u5bf9\u6bd4\u65f6\u95f4\u4e0a\u7684\u5dee\u5f02&#xff0c;\u4e5f\u53ea\u80fd\u4e0e\u591a\u7ebf\u7a0b\u670d\u52a1\u5668\u5206\u6790\u2014\u2014Reactor\u7ebf\u7a0b\u6a21\u578b\u548c\u6027\u80fd\u5206\u6790(\u5e8f\u7ae0)\u4e2d\u7684\u5355\u7ebf\u7a0b\u963b\u585e\u670d\u52a1\u5668\u8fdb\u884c\u5bf9\u6bd4&#xff0c;\u9700\u8981\u8bfb\u8005\u989d\u5916\u505a\u7684\u662f\u5728client.cc\u7684\u8bf7\u6c42\u51fd\u6570\u4e2d\u5728connect\u4e0e\u670d\u52a1\u7aef\u5efa\u7acb\u8fde\u63a5\u4e4b\u540e\u6dfb\u52a0sleep\u6a21\u62df\u7f51\u7edc\u963b\u585e\u5bfc\u81f4\u6570\u636e\u5230\u8fbe\u670d\u52a1\u7aef\u4e0d\u53ca\u65f6&#xff0c;\u8bfb\u8005\u53ef\u4ee5\u81ea\u884c\u5c1d\u8bd5\u3002 \u5355\u7ebf\u7a0b\u7684reactor\u6267\u884c\u8fc7\u7a0b\u5219\u5982\u4e0b\u56fe\u6240\u793a&#xff1a; <img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/04\/20250419153133-6803c1d5330dc.jpg\" alt=\"\u8bf7\u6dfb\u52a0\u56fe\u7247\u63cf\u8ff0\" \/> \u5728loop\u5faa\u73af\u4e2d\u62ff\u5230\u53ef\u8bfbsocket\u5e76\u6309socket\u5217\u8868\u987a\u5e8f\u6267\u884chandle_request\u8fdb\u884c\u5904\u7406&#xff0c;\u4e00\u53e5\u8bdd\u5c31\u53ef\u4ee5\u6982\u62ec\u6574\u4e2a\u7684\u6267\u884c\u8fc7\u7a0b\u3002\u5728\u5b9e\u8df5\u4e2d&#xff0c;\u6211\u4eec\u901a\u5e38\u4e0d\u4f1a\u8d64\u88f8\u88f8\u7684\u76f4\u63a5\u5bf9socket\u8fdb\u884c\u5904\u7406&#xff0c;\u800c\u662f\u5c06\u300e\u53ef\u8bfb\u300f\u5305\u88c5\u6210\u4e00\u4e2a\u4e8b\u4ef6(Event)&#xff0c;handle_request\u5219\u88ab\u79f0\u4e3a\u4e8b\u4ef6\u56de\u8c03(Event Callback)&#xff0c;\u800cepoll\u6240\u5728\u7684\u5faa\u73af\u88ab\u79f0\u4e3a\u4e8b\u4ef6\u5faa\u73af&#xff0c;\u4ee5\u4e8b\u4ef6\u9a71\u52a8(Event Driven)\u6574\u4e2a\u6a21\u578b\u5b8c\u6210\u4e1a\u52a1\u903b\u8f91\u3002<\/p>\n<h5>3.3.3.1 \u4e8b\u4ef6\u9a71\u52a8(Event Driven)<\/h5>\n<p>\u5728\u8fd9\u91cc\u63d0\u5230\u4e86\u4e8b\u4ef6\u9a71\u52a8&#xff0c;\u8fd9\u4e2a\u6982\u5ff5\u4e5f\u662f\u56f0\u6270\u4e86\u6211\u6bd4\u8f83\u4e45&#xff0c;\u4e3b\u8981\u662f\u5b83\u548c\u6d88\u606f\u9a71\u52a8(Message Driven)\u7684\u533a\u522b\u3002\u5728\u7f51\u4e0a\u641c\u4e86\u5f88\u4e45\u4e5f\u6ca1\u6709\u771f\u6b63\u5f04\u61c2&#xff0c;\u5176\u5b9e\u8fd9\u4e24\u8005\u5728\u5b9e\u73b0\u4e0a\u662f\u975e\u5e38\u63a5\u8fd1\u7684&#xff0c;\u90fd\u53ef\u4ee5\u91c7\u7528\u751f\u4ea7\u8005-\u6d88\u8d39\u8005\u6a21\u578b&#xff0c;\u5373\u7ef4\u62a4\u4e00\u4e2a\u961f\u5217\u5411\u91cc\u9762\u586b\u5145\u4e8b\u4ef6\/\u6d88\u606f&#xff0c;\u53e6\u4e00\u8fb9\u7ebf\u7a0b\u6c60\u4e0d\u65ad\u4ece\u961f\u5217\u4e2d\u53d6\u51fa\u4e8b\u4ef6\/\u6d88\u606f\u5e76\u5904\u7406&#xff0c;\u56e0\u6b64\u4e2a\u4eba\u7406\u89e3\u8fd9\u4e8c\u8005\u7684\u533a\u522b\u66f4\u591a\u7684\u662f\u5728\u7f16\u7a0b\u601d\u60f3\u6216\u8005\u8bbe\u8ba1\u6846\u67b6\u65f6\u7684\u533a\u522b\u3002\u6700\u7ec8\u5728stackoverflow\u4e0a\u627e\u5230\u4e86\u4e24\u4e2a\u7b54\u6848&#xff1a;<\/p>\n<p>A message is an item of data that is sent to a specific destination. An event is a signal emitted by a component upon reaching a given state. In a message-driven system addressable recipients await the arrival of messages and react to them, otherwise lying dormant. In an event-driven system notification listeners are attached to the sources of events such that they are invoked when the event is emitted. This means that an event-driven system focuses on addressable event sources while a message-driven system concentrates on addressable recipients. A message can contain an encoded event as its payload.<\/p>\n<p>\u8fd9\u4e00\u6bb5\u4e3b\u8981\u7684\u610f\u601d\u662f\u6d88\u606f\u9a71\u52a8\u7684\u7cfb\u7edf\u6709\u4e00\u4e2a\u786e\u5b9a\u7684\u63a5\u6536\u65b9&#xff0c;\u7b49\u5f85\u6d88\u606f\u5230\u6765\u5e76\u5904\u7406\u3001\u8fd4\u56de&#xff0c;\u5982\u679c\u6ca1\u6709\u6d88\u606f\u5219\u5904\u4e8e\u4f11\u7720\u72b6\u6001&#xff1b;\u800c\u4e8b\u4ef6\u9a71\u52a8\u5219\u6709\u4e00\u4e2a\u53d1\u9001\u6e90&#xff0c;\u9488\u5bf9\u53d1\u9001\u6e90\u6709\u591a\u4e2a\u8ba2\u9605\u8005&#xff0c;\u5f53\u53d1\u9001\u6e90\u6709\u4e8b\u4ef6\u53d1\u751f\u65f6\u5c31\u4f1a\u5524\u9192\u8ba2\u9605\u8005\u3002 \u5176\u5b9e\u8fd9\u6bb5\u8bdd\u6211\u7684\u4e2a\u4eba\u611f\u89c9\u770b\u7740\u8fd8\u662f\u6709\u70b9\u61f5\u5708&#xff0c;\u4e0b\u9762\u6709\u4e2a\u7b54\u6848\u4e3e\u4e86\u4e2a\u4f8b\u5b50&#xff1a;<\/p>\n<p>Let\u2019s say you are building a Payment service for an eCommerce website. When an order is placed, the Order service will ask your Payment service to authorize the customer\u2019s credit card. Only when the credit card has been authorized will the Order service send the order to the warehouse for packing and shipping. You need to agree with the team working on the Order service on how that request for credit card authorization is sent from their service to yours. There are two options. Message-driven: When an order is placed, the Order service sends an authorization request to your Payment service. Your service processes the request and returns success\/failure to the Order service. The initial request and the result could be sent synchronously or asynchronously. Event-driven: When an order is placed, the Order service publishes a NewOrder event. Your Payment service subscribes to that type of event so it is triggered. Your service processes the request and either publishes an AuthorizationAccepted or an AuthorizationDeclined event. The Order service subscribes to those event types. All events are asynchronous.<\/p>\n<p>\u6709\u4e00\u4e2a\u7f51\u4e0a\u7535\u5546\u7684\u4ed8\u6b3e\u7cfb\u7edf&#xff0c;\u9996\u5148\u8981\u6821\u9a8c\u4f60\u7684\u4fe1\u7528\u5361\u4fe1\u606f\u624d\u80fd\u7ee7\u7eed\u8ba2\u5355\u64cd\u4f5c&#xff0c;\u73b0\u5728\u6839\u636e\u6d88\u606f\u9a71\u52a8\u548c\u4e8b\u4ef6\u9a71\u52a8\u6709\u4e24\u79cd\u5904\u7406\u6821\u9a8c\u7684\u65b9\u5f0f&#xff1a;<\/p>\n<ul>\n<li>\u6d88\u606f\u9a71\u52a8&#xff1a;\u53d1\u9001\u6821\u9a8c\u6d88\u606f\u7ed9\u4ed8\u6b3e\u670d\u52a1\u8fdb\u884c\u6821\u9a8c&#xff0c;\u4ed8\u6b3e\u670d\u52a1\u8fd4\u56de\u7ed9\u4f60\u6821\u9a8c\u6210\u529f\u6216\u8005\u5931\u8d25&#xff0c;\u8fd9\u4e2a\u8fc7\u7a0b\u53ef\u4ee5\u662f\u540c\u6b65\u6216\u8005\u5f02\u6b65\u7684\u3002<\/li>\n<li>\u4e8b\u4ef6\u9a71\u52a8&#xff1a;\u4ea7\u751f\u4e00\u4e2a\u6821\u9a8c\u4e8b\u4ef6&#xff0c;\u8ba2\u9605\u6821\u9a8c\u4e8b\u4ef6\u7684\u4ed8\u6b3e\u670d\u52a1\u62ff\u5230\u8fd9\u4e2a\u4e8b\u4ef6&#xff0c;\u5904\u7406\u4e4b\u540e\u4ea7\u751f\u4e00\u4e2a\u6821\u9a8c\u6210\u529f\u4e8b\u4ef6\u6216\u8005\u68c0\u9a8c\u5931\u8d25\u4e8b\u4ef6&#xff0c;\u7531\u80fd\u5904\u7406\u8fd9\u4e24\u79cd\u4e8b\u4ef6\u7684\u8ba2\u9605\u8005\u8fdb\u884c\u5904\u7406&#xff0c;\u6240\u6709\u7684\u6d88\u606f\u4f20\u9012\u90fd\u662f\u5f02\u6b65\u7684\u3002<\/li>\n<\/ul>\n<p>\u8bfb\u5230\u8fd9\u91cc\u6211\u60f3\u4e86\u4e00\u4e2a\u633a\u597d\u73a9\u7684\u4f8b\u5b50\u6765\u8bf4\u660e&#xff0c;\u5c31\u662f\u56de\u8f6c\u5bff\u53f8\u3002\u5047\u8bbe\u6ca1\u6709\u7ebf\u4e0a\u70b9\u5355\u8fd9\u56de\u4e8b&#xff0c;\u987e\u5ba2\u70b9\u5355\u4e4b\u540e&#xff0c;\u628a\u83dc\u54c1\u5199\u5230\u4e00\u5f20\u7eb8\u4e0a\u5e76\u653e\u5230\u4f20\u9001\u5e26\u4e0a&#xff0c;\u8fd9\u5c31\u53d1\u751f\u4e86\u4e00\u4e2a\u300e\u70b9\u5355\u4e8b\u4ef6\u300f&#xff0c;\u5e08\u5085\u6536\u5230\u70b9\u5355\u4e8b\u4ef6\u5e76\u505a\u597d\u5bff\u53f8\u653e\u5728\u4f20\u9001\u5e26\u4e0a\u3002\u4f46\u662f\u5e08\u5085\u4e0d\u4f1a\u662f\u6536\u5230\u4e00\u4e2a\u8ba2\u5355\u505a\u4e00\u4e2a&#xff0c;\u7136\u540e\u7b49\u8fd9\u4e2a\u987e\u5ba2\u62ff\u5230\u8fd9\u4e2a\u8ba2\u5355\u7684\u5bff\u53f8\u518d\u53bb\u505a\u4e0b\u4e00\u4e2a&#xff0c;\u800c\u662f\u4e00\u6b21\u6027\u505a\u597d\u591a\u8ba2\u5355&#xff0c;\u7136\u540e\u4e00\u8d77\u653e\u5230\u4f20\u9001\u5e26\u4e0a&#xff0c;\u4f20\u9001\u5e26\u8f6c\u5230\u987e\u5ba2\u5c31\u628a\u81ea\u5df1\u8ba2\u5355\u4e0a\u7684\u5bff\u53f8\u62ff\u51fa\u6765\u3002\u4e5f\u53ef\u80fd\u4e0d\u540c\u7684\u5e08\u5085\u8d1f\u8d23\u4e0d\u540c\u7684\u83dc\u54c1&#xff0c;\u53a8\u623f\u91cc\u8fd8\u6709\u751c\u54c1\u5e08\u5085\u3001\u51c9\u83dc\u5e08\u5085&#xff0c;\u4ed6\u4eec\u6536\u5230\u8ba2\u5355\u65f6\u95f4\u5c31\u5f00\u59cb\u505a\u83dc&#xff0c;\u505a\u5b8c\u4e4b\u540e\u4ea7\u751f\u300e\u519b\u8230\u5bff\u53f8\u4e8b\u4ef6\u300f\u3001\u300e\u5c0f\u5e03\u4e01\u4e8b\u4ef6\u300f\u3001\u300e\u82a5\u672b\u7ae0\u9c7c\u4e8b\u4ef6\u300f\u5e76\u653e\u5728\u4f20\u9001\u5e26\u4e0a\u3002\u987e\u5ba2\u5403\u5b8c\u7ed3\u8d26&#xff0c;\u7136\u540e\u628a\u8d26\u5355\u548c\u94b1\u653e\u5230\u4f20\u9001\u5e26\u4e0a&#xff0c;\u4ea7\u751f\u4e86\u4e00\u4e2a\u300e\u4ed8\u6b3e\u4e8b\u4ef6\u300f&#xff0c;\u8001\u677f\u5c31\u5750\u5728\u4f20\u9001\u5e26\u7684\u67d0\u4e2a\u4f4d\u7f6e\u63a5\u6536\u8fd9\u4e9b\u300e\u4ed8\u6b3e\u4e8b\u4ef6\u300f\u3002 \u5982\u679c\u662f\u6d88\u606f\u9a71\u52a8&#xff0c;\u90a3\u4e48\u70b9\u5355\u662f\u4f60\u628a\u5355\u5b50\u7ed9\u670d\u52a1\u5458&#xff0c;\u670d\u52a1\u5458\u7ed9\u53a8\u5e08&#xff0c;\u4ed8\u6b3e\u5219\u662f\u4f60\u628a\u94b1\u7ed9\u8001\u677f&#xff0c;\u4f60\u662f\u660e\u786e\u77e5\u9053\u4f60\u7684\u6bcf\u4e00\u4e2a\u6b65\u9aa4\u9762\u5bf9\u7684\u89d2\u8272\u662f\u8c01&#xff0c;\u4e5f\u5c31\u662f\u4e0a\u9762\u6240\u8bf4\u7684\u6d88\u606f\u9a71\u52a8\u6709\u4e00\u4e2a\u660e\u786e\u7684\u63a5\u6536\u65b9\u3002<\/p>\n<p>\u7c7b\u6bd4\u5230\u5b9e\u8df5\u4e2d\u8bbe\u8ba1\u7cfb\u7edf&#xff0c;\u8fd9\u4e2a\u56de\u8f6c\u53f0\u5c31\u76f8\u5f53\u4e8eevent loop&#xff0c;\u627f\u63a5\u5404\u65b9\u4ea7\u751f\u7684\u4e8b\u4ef6&#xff0c;\u5bf9\u5e94\u7684\u5904\u7406\u65b9\u8ba4\u9886\u81ea\u5df1\u7684\u4e8b\u4ef6\u3002 \u9605\u8bfb\u8fc7\u300aLinux\u591a\u7ebf\u7a0b\u670d\u52a1\u7aef\u7f16\u7a0b\u300b\u6216\u8005\u5728\u5176\u4ed6\u5730\u65b9\u4e86\u89e3\u5230\u4e8b\u4ef6\u5faa\u73af(Event Loop)\u7684\u8bfb\u8005&#xff0c;\u4e00\u5b9a\u542c\u8fc7one loop per thread&#xff0c;\u5b83\u4e5f\u662freactor\u6a21\u5f0f\u7684\u53e6\u4e00\u79cd\u79f0\u547c&#xff0c;\u4e5f\u5c31\u662f\u8bf4\u4e00\u4e2a\u7ebf\u7a0b\u4e2d\u76d1\u542cIO\u4e8b\u4ef6\u7684\u5faa\u73af\u53ea\u6709\u4e00\u4e2a\u3002\u4e2a\u4eba\u8ba4\u4e3a\u5b83\u7684\u597d\u5904\u662f\u6781\u5927\u7684\u6269\u5c55\u4e86\u8fde\u63a5\u7684\u5904\u7406\u80fd\u529b&#xff0c;\u964d\u4f4e\u54cd\u5e94\u65f6\u95f4(\u8fd9\u4e2a\u9700\u8981\u591a\u6dfb\u52a0\u4e00\u4e2aloop\u7528\u4e8e\u5355\u72ec\u5904\u7406\u8fde\u63a5\u4e8b\u4ef6&#xff0c;\u5728\u4e0b\u4e00\u8282\u4f1a\u8fdb\u884c\u4ecb\u7ecd)&#xff0c;\u914d\u5408\u540e\u7aef\u7684\u591a\u7ebf\u7a0b\u6216\u8005\u7ebf\u7a0b\u6c60\u53ef\u4ee5\u8f7b\u6613\u7684\u5c06\u4e8b\u4ef6\u4f20\u9012\u7ed9\u5176\u4ed6\u7ebf\u7a0b\u6765\u505a\u5904\u7406&#xff0c;\u76f8\u4fe1\u8bfb\u8005\u5728\u4e4b\u540e\u7684\u4ecb\u7ecd\u4e2d\u80fd\u9010\u6e10\u4f53\u4f1a\u5230\u8fd9\u6bb5\u8bdd\u7684\u610f\u601d\u3002<\/p>\n<h4>3.3.4 \u4e3b\u4ecereactor\u6a21\u578b<\/h4>\n<p>\u3010\u4ee3\u7801&#xff1a;reactor\/master_slave_reactor\u3011<\/p>\n<p>\u51ed\u501f\u4e0a\u6b21\u7684\u7ecf\u9a8c&#xff0c;\u4f60\u7684\u714e\u997c\u679c\u5b50\u644a\u91cd\u65b0\u7ea2\u706b\u4e86\u8d77\u6765&#xff0c;\u4f60\u6e10\u6e10\u53c8\u5fd9\u4e0d\u8fc7\u6765\u4e86&#xff0c;\u4e8e\u662f\u4f60\u53c8\u96c7\u4e86\u4e00\u4e2a\u4f19\u8ba1&#xff0c;\u540c\u65f6\u4f60\u60f3&#xff0c;\u6211\u90fd\u8f9b\u82e6\u8fd9\u4e48\u591a\u5e74\u4e86\u5c31\u4e0d\u80fd\u4eab\u53d7\u4eab\u53d7\u5417&#xff0c;\u6211\u4e0d\u644a\u714e\u997c\u679c\u5b50\u4e86&#xff0c;\u4e8e\u662f\u4f60\u53ea\u8d1f\u8d23\u6536\u96c6\u5fae\u4fe1\u7fa4\u91cc\u9762\u7684\u987e\u5ba2\u9700\u6c42&#xff0c;\u628a\u5b83\u4eec\u8f6c\u53d1\u7ed9\u4f19\u8ba1\u8ba9\u4f19\u8ba1\u53bb\u505a\u3002<\/p>\n<p>\u57283.3.3\u8282\u4e2d\u63d0\u5230\u7684\u5355\u7ebf\u7a0breactor\u6a21\u578b\u4e2d&#xff0c;\u5904\u7406\u8fde\u63a5\u4e8b\u4ef6\u548c\u5ba2\u6237\u7aef\u7684IO\u4e8b\u4ef6\u90fd\u5728\u4e00\u4e2a\u5faa\u73af\u4e2d\u8fdb\u884c&#xff1a;<\/p>\n<p><span class=\"token keyword\">for<\/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\">\/\/ \u7b49\u5f85\u4e8b\u4ef6<\/span><br \/>\n        <span class=\"token keyword\">int<\/span> nfds <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">epoll_wait<\/span><span class=\"token punctuation\">(<\/span>epoll_fd<span class=\"token punctuation\">,<\/span> events<span class=\"token punctuation\">,<\/span> MAX_EVENTS<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>nfds <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token function\">perror<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;epoll_wait&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> n <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> n <span class=\"token operator\">&lt;<\/span> nfds<span class=\"token punctuation\">;<\/span> <span class=\"token operator\">&#043;&#043;<\/span>n<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>events<span class=\"token punctuation\">[<\/span>n<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>data<span class=\"token punctuation\">.<\/span>fd <span class=\"token operator\">&#061;&#061;<\/span> listen_sock<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token comment\">\/\/ \u63a5\u53d7\u65b0\u8fde\u63a5&#xff0c;\u5904\u7406\u8fde\u63a5\u4e8b\u4ef6<\/span><br \/>\n                <span class=\"token keyword\">int<\/span> conn_sock <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">accept<\/span><span class=\"token punctuation\">(<\/span>listen_sock<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 punctuation\">;<\/span><br \/>\n                <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 punctuation\">{<\/span><br \/>\n                <span class=\"token comment\">\/\/ \u5904\u7406socket\u4e0a\u7684\u53ef\u8bfb\u4e8b\u4ef6&#xff0c;\u4e5f\u5c31\u662f\u5ba2\u6237\u7aef\u4f20\u8fc7\u6765\u7684\u6570\u636e<\/span><br \/>\n                <span class=\"token function\">handle_request<\/span><span class=\"token punctuation\">(<\/span>events<span class=\"token punctuation\">[<\/span>n<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>data<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><\/p>\n<p>\u5f53\u5ba2\u6237\u7aef\u8bf7\u6c42\u5e76\u53d1\u5f88\u9ad8\u7684\u65f6\u5019&#xff0c;\u670d\u52a1\u7aef\u53ef\u80fd\u6765\u4e0d\u53ca\u5904\u7406\u90a3\u4e48\u591a\u7684\u8fde\u63a5&#xff0c;\u56e0\u6b64\u53ef\u4ee5\u4f7f\u7528\u4e00\u4e2a\u7ebf\u7a0b\u91cc\u7684loop\u4e13\u95e8\u5904\u7406\u8fde\u63a5\u5efa\u7acb&#xff0c;\u518d\u5c06\u5efa\u7acb\u597d\u8fde\u63a5\u7684socket\u4f20\u9012\u7ed9\u5176\u4ed6\u7ebf\u7a0b\u7684loop\u8fdb\u884c\u76d1\u542c\u548c\u5904\u7406&#xff0c;\u5b9e\u9645\u7684\u5904\u7406\u6a21\u578b\u5982\u4e0b\u56fe\u6240\u793a&#xff1a; <img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/04\/20250419153133-6803c1d57036f.jpg\" alt=\"\u8bf7\u6dfb\u52a0\u56fe\u7247\u63cf\u8ff0\" \/> \u5728\u4e0a\u9762\u7684\u56fe\u4e2d&#xff0c;main loop\u4e2d\u7684epoll\u53ea\u76d1\u542c\u670d\u52a1\u7aef\u8d1f\u8d23listen\u7684socket&#xff0c;\u5f53\u6709\u8bf7\u6c42\u5230\u8fbe\u76d1\u542c\u961f\u5217\u7684\u65f6\u5019&#xff0c;\u670d\u52a1\u7aeflisten\u7684socket\u5c31\u4f1a\u53ef\u8bfb&#xff0c;epoll\u76d1\u542c\u5230\u53ef\u8bfb\u4e8b\u4ef6\u53d6\u6d88\u963b\u585e&#xff0c;\u670d\u52a1\u7aef\u5c31\u53ef\u4ee5\u6267\u884caccept\u5c06\u8fde\u63a5\u4ece\u76d1\u542c\u961f\u5217\u4e2d\u53d6\u51fa&#xff0c;\u4ea7\u751f\u7684socket\u5c31\u4f20\u9012\u7ed9\u53e6\u4e00\u4e2a\u7ebf\u7a0b\u4e2dloop\u4e2d\u7684epoll\u53bb\u76d1\u542c&#xff0c;\u5269\u4e0b\u7684\u6b65\u9aa4\u4e0e\u4e4b\u524d\u7684\u5355\u7ebf\u7a0b\u670d\u52a1\u5668\u5b8c\u5168\u76f8\u540c&#xff0c;\u76d1\u542c\u5230\u8fde\u63a5\u7684socket\u53ef\u8bfb\u5c06\u5176\u53d6\u51fa\u5e76\u5904\u7406\u8fde\u63a5\u4e0a\u7684\u53ef\u8bfb\u4e8b\u4ef6&#xff0c;\u5373\u5904\u7406\u5ba2\u6237\u7aef\u53d1\u6765\u7684\u8bf7\u6c42\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f&#xff0c;epoll_ctl\u548cepoll_wait\u662f\u7ebf\u7a0b\u5b89\u5168\u7684&#xff0c;\u4e0d\u5fc5\u8003\u8651fd\u5728\u7ebf\u7a0b\u95f4\u4f20\u9012\u4ea7\u751f\u7684race condition&#xff0c;\u4e0d\u8fc7\u5982\u679c\u8981\u5e76\u53d1\u7684\u5bf9socket\u8fdb\u884c\u64cd\u4f5c&#xff0c;\u4f8b\u5982\u8bfb\u53d6\u5ba2\u6237\u7aef\u7684\u6570\u636e\u548cclose\u8fd8\u662f\u8981\u6ce8\u610f\u7684\u3002 \u6309\u7167\u4e0a\u9762\u7684\u8bbe\u8ba1&#xff0c;\u670d\u52a1\u7aef\u7684\u4ee3\u7801\u5c31\u53d8\u6210\u4e24\u4e2a\u7ebf\u7a0b&#xff0c;\u4e3b\u7ebf\u7a0b(main loop)\u8d1f\u8d23\u76d1\u542clisten_socket\u5e76\u4f20\u9012\u7ed9\u4ece\u7ebf\u7a0b(slave loop)&#xff1a;<\/p>\n<p><span class=\"token keyword\">void<\/span> <span class=\"token function\">handle_main_loop<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> main_epoll_fd<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span> slave_epoll_fd<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> listen_sock <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">socket<\/span><span class=\"token punctuation\">(<\/span>AF_INET<span class=\"token punctuation\">,<\/span> SOCK_STREAM<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token comment\">\/\/ listen_socket\u5904\u7406\u7565&#xff0c;\u8be6\u89c1\u4ee3\u7801\u76ee\u5f55<\/span><\/p>\n<p>    <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">epoll_event<\/span> ev<span class=\"token punctuation\">,<\/span> events<span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    ev<span class=\"token punctuation\">.<\/span>events <span class=\"token operator\">&#061;<\/span> EPOLLIN<span class=\"token punctuation\">;<\/span><br \/>\n    ev<span class=\"token punctuation\">.<\/span>data<span class=\"token punctuation\">.<\/span>fd <span class=\"token operator\">&#061;<\/span> listen_sock<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">epoll_ctl<\/span><span class=\"token punctuation\">(<\/span>main_epoll_fd<span class=\"token punctuation\">,<\/span> EPOLL_CTL_ADD<span class=\"token punctuation\">,<\/span> listen_sock<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>ev<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&#061;<\/span> <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\">\/\/ main loop\u76d1\u542clisten socket<\/span><br \/>\n        <span class=\"token function\">perror<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;epoll_ctl: listen_sock&#034;<\/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\">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 keyword\">for<\/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 keyword\">int<\/span> nfds <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">epoll_wait<\/span><span class=\"token punctuation\">(<\/span>main_epoll_fd<span class=\"token punctuation\">,<\/span> events<span class=\"token punctuation\">,<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token 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>events<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>data<span class=\"token punctuation\">.<\/span>fd <span class=\"token operator\">&#061;&#061;<\/span> listen_sock<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> cli_addr<span class=\"token punctuation\">;<\/span><br \/>\n            socklen_t cli_len <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>cli_addr<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> <span class=\"token function\">accept<\/span><span class=\"token punctuation\">(<\/span>listen_sock<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>cli_addr<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>cli_len<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><br \/>\n                ev<span class=\"token punctuation\">.<\/span>events <span class=\"token operator\">&#061;<\/span> EPOLLIN <span class=\"token operator\">|<\/span> EPOLLET<span class=\"token punctuation\">;<\/span><br \/>\n                ev<span class=\"token punctuation\">.<\/span>data<span class=\"token punctuation\">.<\/span>fd <span class=\"token operator\">&#061;<\/span> connfd<span class=\"token punctuation\">;<\/span><\/p>\n<p>                <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">epoll_ctl<\/span><span class=\"token punctuation\">(<\/span>slave_epoll_fd<span class=\"token punctuation\">,<\/span> EPOLL_CTL_ADD<span class=\"token punctuation\">,<\/span> connfd<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>ev<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&#061;<\/span> <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\">\/\/ \u52a0\u5165\u5230slave loop\u7684epoll\u76d1\u542c<\/span><br \/>\n                    <span class=\"token function\">perror<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;epoll_ctl: conn_sock&#034;<\/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\">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 punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            std<span class=\"token double-colon punctuation\">::<\/span><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 punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u4ece\u7ebf\u7a0b(slave loop)\u63a5\u6536\u6765\u81ea\u4e3b\u7ebf\u7a0b\u4f20\u9012\u7684socket\u5e76\u76d1\u542c\u53ef\u8bfb\u4e8b\u4ef6&#xff0c;\u4ea7\u751f\u53ef\u8bfb\u4e8b\u4ef6\u540e\u8fdb\u884c\u5904\u7406&#xff1a;<\/p>\n<p><span class=\"token keyword\">void<\/span> <span class=\"token function\">handle_slave_loop<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> slave_epoll_fd<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">epoll_event<\/span> events<span class=\"token punctuation\">[<\/span>MAX_EVENTS<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 punctuation\">;<\/span><span class=\"token punctuation\">;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">int<\/span> nfds <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">epoll_wait<\/span><span class=\"token punctuation\">(<\/span>slave_epoll_fd<span class=\"token punctuation\">,<\/span> events<span class=\"token punctuation\">,<\/span> MAX_EVENTS<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>nfds <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token function\">perror<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;epoll_wait&#034;<\/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\">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 keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> n <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> n <span class=\"token operator\">&lt;<\/span> nfds<span class=\"token punctuation\">;<\/span> <span class=\"token operator\">&#043;&#043;<\/span>n<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token function\">handle_request<\/span><span class=\"token punctuation\">(<\/span>events<span class=\"token punctuation\">[<\/span>n<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>data<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><\/p>\n<p>\u7136\u540e\u8d77\u4e24\u4e2a\u7ebf\u7a0b&#xff1a;<\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> global_main_epoll_fd <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">epoll_create1<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>global_main_epoll_fd <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">perror<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;epoll_create1&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">int<\/span> global_slave_epoll_fd <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">epoll_create1<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>global_slave_epoll_fd <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">perror<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;epoll_create1&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">auto<\/span> main_loop <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">bind<\/span><span class=\"token punctuation\">(<\/span>handle_main_loop<span class=\"token punctuation\">,<\/span> global_main_epoll_fd<span class=\"token punctuation\">,<\/span> global_slave_epoll_fd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">auto<\/span> slave_loop <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">bind<\/span><span class=\"token punctuation\">(<\/span>handle_slave_loop<span class=\"token punctuation\">,<\/span> global_slave_epoll_fd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    std<span class=\"token double-colon punctuation\">::<\/span>thread <span class=\"token function\">t_main<\/span><span class=\"token punctuation\">(<\/span>main_loop<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>thread <span class=\"token function\">t_slave<\/span><span class=\"token punctuation\">(<\/span>slave_loop<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    t_main<span class=\"token punctuation\">.<\/span><span class=\"token function\">join<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ unreachable<\/span><br \/>\n    t_slave<span class=\"token punctuation\">.<\/span><span class=\"token function\">join<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u6211\u4eec\u53ef\u4ee5\u7b80\u5355\u5bf9\u6bd4\u4e00\u4e0b&#xff0c;\u4f7f\u7528\u4e86\u4e3b\u4eceloop\u7ebf\u7a0b\u7684\u670d\u52a1\u7aef\u548c\u6240\u6709\u76d1\u542c\u90fd\u5728\u4e00\u4e2aloop\u7ebf\u7a0b\u7684\u670d\u52a1\u7aef&#xff0c;\u670d\u52a1\u7aef\u7684\u5904\u7406\u51fd\u6570\u4f9d\u7136\u4e0e\u591a\u7ebf\u7a0b\u670d\u52a1\u5668\u5206\u6790\u2014\u2014Reactor\u7ebf\u7a0b\u6a21\u578b\u548c\u6027\u80fd\u5206\u6790(\u5e8f\u7ae0)\u4e2d\u7684handle_request\u76f8\u540c&#xff0c;\u90fd\u662f\u6253\u5370\u6765\u81ea\u5ba2\u6237\u7aef\u7684\u5b57\u7b26\u4e32&#xff0c;\u4f11\u77201\u6beb\u79d2&#xff0c;\u7136\u540e\u8fd4\u56de&#034;hello world&#034;\u3002 \u9996\u5148\u628a\u76d1\u542c\u961f\u5217&#xff0c;\u4e5f\u5c31\u662fTCP\u7684\u5168\u8fde\u63a5\u961f\u5217\u8bbe\u7f6e\u4e3a1024&#xff0c;\u65b9\u4fbf\u89c2\u5bdf\u3002\u4e0d\u8fc7\u8fd9\u4e2a\u961f\u5217\u4f1a\u53d7\u5230SOMAXCONN\u7684\u9650\u5236&#xff0c;\u5177\u4f53\u6839\u636e\u4e0d\u540c\u7684\u64cd\u4f5c\u7cfb\u7edf\u6709\u6240\u4e0d\u540c&#xff0c;\u5982\u679c\u8bbe\u7f6e\u7684\u503c\u5b83\u5927&#xff0c;\u4f1a\u81ea\u52a8\u622a\u65ad\u4e3aSOMAXCONN&#xff1a;<\/p>\n<p><span class=\"token function\">listen<\/span><span class=\"token punctuation\">(<\/span>listen_sock<span class=\"token punctuation\">,<\/span> <span class=\"token number\">1024<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>\u5f53\u5ba2\u6237\u7aef\u7684\u5e76\u53d1\u8bbe\u7f6e\u4e3a1000\u65f6&#xff0c;\u5bf9\u6bd4&#xff1a; \u8bbf\u95ee\u5355reactor\u670d\u52a1\u5668\u8017\u65f6&#xff1a; <img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/04\/20250419153133-6803c1d5c758f.png\" alt=\"\u5728\u8fd9\u91cc\u63d2\u5165\u56fe\u7247\u63cf\u8ff0\" \/> \u8bbf\u95ee\u4e3b\u4ecereactor\u670d\u52a1\u5668\u8017\u65f6&#xff1a; <img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/04\/20250419153133-6803c1d5e8d8e.png\" alt=\"\u5728\u8fd9\u91cc\u63d2\u5165\u56fe\u7247\u63cf\u8ff0\" \/> \u53ef\u4ee5\u53d1\u73b0\u4e8c\u8005\u6d88\u8017\u7684\u65f6\u95f4\u51e0\u4e4e\u6ca1\u4ec0\u4e48\u533a\u522b\u3002 \u5f53\u628a\u5ba2\u6237\u7aef\u8bf7\u6c42\u7684\u5e76\u53d1\u63d0\u9ad8\u81f310000&#xff0c;\u5bf9\u6bd4&#xff1a; \u8bbf\u95ee\u4e3b\u4ecereactor\u670d\u52a1\u5668\u8017\u65f6&#xff1a; <img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/04\/20250419153134-6803c1d614ea3.png\" alt=\"\u5728\u8fd9\u91cc\u63d2\u5165\u56fe\u7247\u63cf\u8ff0\" \/> \u8017\u65f6\u57fa\u672c\u4e0a\u662f1000\u5e76\u53d1\u768410\u500d&#xff0c;\u8fd9\u4e5f\u662f\u7b26\u5408\u9884\u671f\u7684&#xff0c;\u76ee\u524d\u5bf9\u4e8e\u6570\u636e\u7684\u5904\u7406&#xff0c;\u4f9d\u65e7\u662f\u5355\u7ebf\u7a0b\u7684\u3002 \u518d\u6765\u770b\u5355reactor\u7684\u8868\u73b0&#xff1a; <img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/04\/20250419153134-6803c1d637d5a.png\" alt=\"\u5728\u8fd9\u91cc\u63d2\u5165\u56fe\u7247\u63cf\u8ff0\" \/> \u5728\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\u51fa\u73b0\u4e86Connection reset by peer\u8fd9\u4e2a\u9519\u8bef&#xff0c;\u8fd9\u662f\u7531\u4e8e\u670d\u52a1\u7aef\u8fd4\u56de\u4e86\u4e00\u4e2aReset\u4fe1\u53f7\u91cd\u7f6e\u8fde\u63a5\u5bfc\u81f4\u7684&#xff0c;\u901a\u5e38\u5f15\u8d77\u8fd9\u79cd\u73b0\u8c61\u7684\u539f\u56e0\u662f\u670d\u52a1\u7aef\u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u6536\u5230\u7684\u8bf7\u6c42\u5927\u4e8e\u5b83\u81ea\u8eab\u7684\u5904\u7406\u80fd\u529b&#xff0c;\u5b9e\u9645\u4e0a\u5c31\u662fTCP\u7684\u5168\u8fde\u63a5\u961f\u5217\u63a5\u6536\u7684\u8bf7\u6c42\u5927\u4e8eSOMAXCONN\u4e86&#xff0c;\u800c\u8fd4\u56deReset\u4fe1\u53f7\u4e5f\u662f\u7531\u5185\u6838\u4e2d\u7684\/proc\/sys\/net\/ipv4\/tcp_abort_on_overflow\u53c2\u6570\u51b3\u5b9a&#xff0c;cat \/proc\/sys\/net\/ipv4\/tcp_abort_on_overflow\u770b\u4e00\u4e0b\u8fd9\u4e2a\u53c2\u6570&#xff0c;\u5982\u679c\u662f0\u8868\u793a\u4e22\u5f03&#xff0c;1\u5219\u8868\u793a\u8fd4\u56deReset&#xff0c;\u4e5f\u5c31\u662f\u4e0a\u9762\u5c55\u793a\u7684\u8868\u73b0\u3002 \u901a\u8fc7\u4e0a\u9762\u7684\u5bf9\u6bd4&#xff0c;\u53ef\u4ee5\u53d1\u73b0\u867d\u7136\u4e3b\u4ecereactor\u670d\u52a1\u5668\u4e0d\u80fd\u63d0\u9ad8\u54cd\u5e94\u901f\u5ea6&#xff0c;\u4f46\u53ef\u4ee5\u63d0\u9ad8\u5904\u7406\u5e76\u53d1\u8fde\u63a5\u7684\u80fd\u529b\u3002<\/p>\n<h4>3.3.5 \u672c\u7ae0\u5c0f\u7ed3<\/h4>\n<p>\u5728\u8fd9\u4e00\u7bc7\u6211\u4eec\u8be6\u7ec6\u770b\u4e86\u975e\u963b\u585e\u7684\u5355\u7ebf\u7a0b\u670d\u52a1\u5668&#xff0c;\u4e5f\u4e86\u89e3\u4e86reactor\u6a21\u578b\u7684\u57fa\u672c\u6846\u67b6\u548c\u4e8b\u4ef6\u9a71\u52a8\u7684\u57fa\u672c\u6982\u5ff5&#xff0c;\u4e3a\u4ec0\u4e48\u628a\u4e3b\u4ecereactor\u4e5f\u653e\u5230\u8fd9\u4e00\u7ae0\u6765\u8bb2\u89e3\u5462&#xff1f;\u4e2a\u4eba\u89c9\u5f97\u5e7f\u4e49\u4e0a\u7684\u591a\u7ebf\u7a0b\u670d\u52a1\u5668\u662f\u6307\u5728\u4e1a\u52a1\u7684\u5904\u7406\u903b\u8f91\u4e0a\u91c7\u7528\u591a\u7ebf\u7a0b\u7684\u5f62\u5f0f&#xff0c;\u4e0d\u8fc7\u4e3b\u4ecereactor\u79f0\u4e3a\u591a\u7ebf\u7a0b\u670d\u52a1\u5668\u4e5f\u5b8c\u5168\u6ca1\u6709\u95ee\u9898&#xff0c;\u751a\u81f3\u53ef\u4ee5\u91c7\u7528\u591a\u4e2aslave loop&#xff0c;main loop\u63a5\u6536\u5230socket\u4e4b\u540e\u8f6e\u8be2\u7684\u5c06socket\u4f20\u9012\u7ed9\u6bcf\u4e2aslave loop\u3002 \u5728\u672c\u6587\u6700\u5f00\u5934&#xff0c;\u63d0\u4e86\u4e24\u4e2a\u95ee\u9898&#xff1a; 1\u3001\u80fd\u591f\u6269\u5c55\u7684\u7ebf\u7a0b\u6570\u91cf\u662f\u6709\u9650\u7684 2\u3001\u963b\u585e\u5f0f\u7684\u7b49\u5f85socket\u4f1a\u8ba9\u7ebf\u7a0b\u4e00\u76f4\u5904\u4e8e\u7a7a\u95f2\u72b6\u6001&#xff08;\u5f53\u7136socket\u53ef\u4ee5\u6362\u6210\u5176\u4ed6\u6587\u4ef6\u63cf\u8ff0\u7b26&#xff09; \u7b2c\u4e8c\u4e2a\u95ee\u9898\u5df2\u7ecf\u901a\u8fc7\u975e\u963b\u585e\u76f8\u5173\u7684\u5185\u5bb9\u89e3\u7b54\u5b8c\u6bd5&#xff0c;\u7b2c\u4e00\u4e2a\u95ee\u9898\u5728\u5f00\u5934\u8bf4\u8fc7\u9700\u8981\u5c3d\u53ef\u80fd\u7684\u69a8\u53d6\u6709\u9650\u7ebf\u7a0b\u7684\u80fd\u529b&#xff0c;\u8fd9\u5c31\u6d89\u53ca\u5230\u4e86\u5982\u4f55\u4f7f\u7528\u591a\u7ebf\u7a0b\u7684\u95ee\u9898&#xff0c;\u662f\u50cf\u591a\u7ebf\u7a0b\u670d\u52a1\u5668\u5206\u6790\u2014\u2014Reactor\u7ebf\u7a0b\u6a21\u578b\u548c\u6027\u80fd\u5206\u6790(\u5e8f\u7ae0)\u4e2d\u7684\u4e00\u6837\u6bcf\u4e2asocket\u5360\u7528\u4e00\u4e2a\u7ebf\u7a0b\u5417&#xff1f;\u63a5\u4e0b\u6765&#xff0c;\u5c06\u7ed3\u5408\u300aLinux\u591a\u7ebf\u7a0b\u670d\u52a1\u7aef\u7f16\u7a0b\u300b\u8fd9\u672c\u4e66&#xff08;\u6ca1\u770b\u8fc7\u6ca1\u5173\u7cfb&#xff0c;\u53ea\u662f\u4f1a\u5f15\u8ff0\u4e66\u4e2d\u7684\u4e00\u4e9b\u539f\u6587\u6765\u89e3\u91ca\u4e00\u4e9b\u6982\u5ff5&#xff09;\u4ee5\u53ca\u4e00\u4e2a\u5b9e\u9645\u7684\u4e1a\u52a1\u573a\u666f\u6765\u548c\u8bfb\u8005\u4e00\u8d77\u8ba8\u8bba\u591a\u7ebf\u7a0b\u7684\u4e00\u4e9b\u4f7f\u7528\u65b9\u6cd5\u3002<\/p>\n<p>\u4e0b\u4e00\u7ae0\u94fe\u63a5&#xff1a;\u591a\u7ebf\u7a0b\u670d\u52a1\u5668\u5206\u6790\u2014\u2014Reactor\u7ebf\u7a0b\u6a21\u578b\u548c\u6027\u80fd\u5206\u6790(\u4e8c)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u6587\u7ae0\u6d4f\u89c8\u9605\u8bfb919\u6b21\uff0c\u70b9\u8d5e16\u6b21\uff0c\u6536\u85cf11\u6b21\u3002\u4e0a\u63a5\u5728\u5e8f\u7ae0\u4e2d\u7684\u6700\u540e\u63d0\u5230\u4e86\u4e24\u4e2a\u670d\u52a1\u5668\u74f6\u9888\u7684\u539f\u56e0\uff1a1\u3001\u80fd\u591f\u6269\u5c55\u7684\u7ebf\u7a0b\u6570\u91cf\u662f\u6709\u9650\u76842\u3001\u963b\u585e\u5f0f\u7684\u7b49\u5f85socket\u4f1a\u8ba9\u7ebf\u7a0b\u4e00\u76f4\u5904\u4e8e\u7a7a\u95f2\u72b6\u6001\uff08\u5f53\u7136socket\u53ef\u4ee5\u6362\u6210\u5176\u4ed6\u6587\u4ef6\u63cf\u8ff0\u7b26\uff09\u9488\u5bf9\u95ee\u98981\uff0c\u65e2\u7136\u7ebf\u7a0b\u7684\u6570\u91cf\u662f\u6709\u9650\u7684\uff0c\u90a3\u6211\u4eec\u5c31\u5c3d\u6700\u5927\u7684\u53ef\u80fd\u53bb\u5229\u7528\u5b83\uff0c\u69a8\u5e72\u5b83\u7684\u80fd\u529b\uff1b\u9488\u5bf9\u95ee\u98982\uff0c\u5219\u53ef\u4ee5\u6362\u4e00\u79cd\u601d\u8def\uff0c\u5982\u679c\u5f53\u524d\u7684socket\u6ca1\u6709\u6570\u636e\u4f20\u8f93\u8fc7\u6765\uff0c\u90a3\u5c31\u7acb\u5373\u8fd4\u56de\u4e00\u4e2a\u9519\u8bef\u4fe1\u606f\uff0c\u5904\u7406\u4e0b\u4e00\u4e2a\u5efa\u7acb\u7684\u8fde\u63a5\uff0c\u7136\u540e\u5faa\u73af\u8be2\u95ee\u6240\u6709\u5efa\u7acb\u7684\u8fde\u63a5\u7684socket\uff0c\u5982\u679c\u67d0\u4e2asocket\u6709\u6570\u636e\u4f20\u8f93\u8fc7\u6765\u5c31\u7acb\u9a6c\u8fdb\u884c\u5904\u7406\uff0c\u8fd9\u5c31\u662f\u975e\u963b\u585e(NIO)\u7684\u601d\u60f3\u3002_\u4f7f\u7528 epoll \u591a\u7ebf\u7a0b \u7ebf\u7a0b\u6c60 reactor \u6a21\u578b<\/p>\n","protected":false},"author":2,"featured_media":28248,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[55,252,43],"topic":[],"class_list":["post-28254","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-server","tag-c","tag-252","tag-43"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u591a\u7ebf\u7a0b\u670d\u52a1\u5668\u5206\u6790\u2014\u2014Reactor\u7ebf\u7a0b\u6a21\u578b\u548c\u6027\u80fd\u5206\u6790(\u4e00) - \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\/28254.html\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u591a\u7ebf\u7a0b\u670d\u52a1\u5668\u5206\u6790\u2014\u2014Reactor\u7ebf\u7a0b\u6a21\u578b\u548c\u6027\u80fd\u5206\u6790(\u4e00) - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"og:description\" content=\"\u6587\u7ae0\u6d4f\u89c8\u9605\u8bfb919\u6b21\uff0c\u70b9\u8d5e16\u6b21\uff0c\u6536\u85cf11\u6b21\u3002\u4e0a\u63a5\u5728\u5e8f\u7ae0\u4e2d\u7684\u6700\u540e\u63d0\u5230\u4e86\u4e24\u4e2a\u670d\u52a1\u5668\u74f6\u9888\u7684\u539f\u56e0\uff1a1\u3001\u80fd\u591f\u6269\u5c55\u7684\u7ebf\u7a0b\u6570\u91cf\u662f\u6709\u9650\u76842\u3001\u963b\u585e\u5f0f\u7684\u7b49\u5f85socket\u4f1a\u8ba9\u7ebf\u7a0b\u4e00\u76f4\u5904\u4e8e\u7a7a\u95f2\u72b6\u6001\uff08\u5f53\u7136socket\u53ef\u4ee5\u6362\u6210\u5176\u4ed6\u6587\u4ef6\u63cf\u8ff0\u7b26\uff09\u9488\u5bf9\u95ee\u98981\uff0c\u65e2\u7136\u7ebf\u7a0b\u7684\u6570\u91cf\u662f\u6709\u9650\u7684\uff0c\u90a3\u6211\u4eec\u5c31\u5c3d\u6700\u5927\u7684\u53ef\u80fd\u53bb\u5229\u7528\u5b83\uff0c\u69a8\u5e72\u5b83\u7684\u80fd\u529b\uff1b\u9488\u5bf9\u95ee\u98982\uff0c\u5219\u53ef\u4ee5\u6362\u4e00\u79cd\u601d\u8def\uff0c\u5982\u679c\u5f53\u524d\u7684socket\u6ca1\u6709\u6570\u636e\u4f20\u8f93\u8fc7\u6765\uff0c\u90a3\u5c31\u7acb\u5373\u8fd4\u56de\u4e00\u4e2a\u9519\u8bef\u4fe1\u606f\uff0c\u5904\u7406\u4e0b\u4e00\u4e2a\u5efa\u7acb\u7684\u8fde\u63a5\uff0c\u7136\u540e\u5faa\u73af\u8be2\u95ee\u6240\u6709\u5efa\u7acb\u7684\u8fde\u63a5\u7684socket\uff0c\u5982\u679c\u67d0\u4e2asocket\u6709\u6570\u636e\u4f20\u8f93\u8fc7\u6765\u5c31\u7acb\u9a6c\u8fdb\u884c\u5904\u7406\uff0c\u8fd9\u5c31\u662f\u975e\u963b\u585e(NIO)\u7684\u601d\u60f3\u3002_\u4f7f\u7528 epoll \u591a\u7ebf\u7a0b \u7ebf\u7a0b\u6c60 reactor \u6a21\u578b\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.wsisp.com\/helps\/28254.html\" \/>\n<meta property=\"og:site_name\" content=\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"article:published_time\" content=\"2025-04-19T15:31:35+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/04\/20250419153133-6803c1d5330dc.jpg\" \/>\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=\"7 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/28254.html\",\"url\":\"https:\/\/www.wsisp.com\/helps\/28254.html\",\"name\":\"\u591a\u7ebf\u7a0b\u670d\u52a1\u5668\u5206\u6790\u2014\u2014Reactor\u7ebf\u7a0b\u6a21\u578b\u548c\u6027\u80fd\u5206\u6790(\u4e00) - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"isPartOf\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\"},\"datePublished\":\"2025-04-19T15:31:35+00:00\",\"dateModified\":\"2025-04-19T15:31:35+00:00\",\"author\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/28254.html#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.wsisp.com\/helps\/28254.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/28254.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.wsisp.com\/helps\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u591a\u7ebf\u7a0b\u670d\u52a1\u5668\u5206\u6790\u2014\u2014Reactor\u7ebf\u7a0b\u6a21\u578b\u548c\u6027\u80fd\u5206\u6790(\u4e00)\"}]},{\"@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":"\u591a\u7ebf\u7a0b\u670d\u52a1\u5668\u5206\u6790\u2014\u2014Reactor\u7ebf\u7a0b\u6a21\u578b\u548c\u6027\u80fd\u5206\u6790(\u4e00) - \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\/28254.html","og_locale":"zh_CN","og_type":"article","og_title":"\u591a\u7ebf\u7a0b\u670d\u52a1\u5668\u5206\u6790\u2014\u2014Reactor\u7ebf\u7a0b\u6a21\u578b\u548c\u6027\u80fd\u5206\u6790(\u4e00) - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","og_description":"\u6587\u7ae0\u6d4f\u89c8\u9605\u8bfb919\u6b21\uff0c\u70b9\u8d5e16\u6b21\uff0c\u6536\u85cf11\u6b21\u3002\u4e0a\u63a5\u5728\u5e8f\u7ae0\u4e2d\u7684\u6700\u540e\u63d0\u5230\u4e86\u4e24\u4e2a\u670d\u52a1\u5668\u74f6\u9888\u7684\u539f\u56e0\uff1a1\u3001\u80fd\u591f\u6269\u5c55\u7684\u7ebf\u7a0b\u6570\u91cf\u662f\u6709\u9650\u76842\u3001\u963b\u585e\u5f0f\u7684\u7b49\u5f85socket\u4f1a\u8ba9\u7ebf\u7a0b\u4e00\u76f4\u5904\u4e8e\u7a7a\u95f2\u72b6\u6001\uff08\u5f53\u7136socket\u53ef\u4ee5\u6362\u6210\u5176\u4ed6\u6587\u4ef6\u63cf\u8ff0\u7b26\uff09\u9488\u5bf9\u95ee\u98981\uff0c\u65e2\u7136\u7ebf\u7a0b\u7684\u6570\u91cf\u662f\u6709\u9650\u7684\uff0c\u90a3\u6211\u4eec\u5c31\u5c3d\u6700\u5927\u7684\u53ef\u80fd\u53bb\u5229\u7528\u5b83\uff0c\u69a8\u5e72\u5b83\u7684\u80fd\u529b\uff1b\u9488\u5bf9\u95ee\u98982\uff0c\u5219\u53ef\u4ee5\u6362\u4e00\u79cd\u601d\u8def\uff0c\u5982\u679c\u5f53\u524d\u7684socket\u6ca1\u6709\u6570\u636e\u4f20\u8f93\u8fc7\u6765\uff0c\u90a3\u5c31\u7acb\u5373\u8fd4\u56de\u4e00\u4e2a\u9519\u8bef\u4fe1\u606f\uff0c\u5904\u7406\u4e0b\u4e00\u4e2a\u5efa\u7acb\u7684\u8fde\u63a5\uff0c\u7136\u540e\u5faa\u73af\u8be2\u95ee\u6240\u6709\u5efa\u7acb\u7684\u8fde\u63a5\u7684socket\uff0c\u5982\u679c\u67d0\u4e2asocket\u6709\u6570\u636e\u4f20\u8f93\u8fc7\u6765\u5c31\u7acb\u9a6c\u8fdb\u884c\u5904\u7406\uff0c\u8fd9\u5c31\u662f\u975e\u963b\u585e(NIO)\u7684\u601d\u60f3\u3002_\u4f7f\u7528 epoll \u591a\u7ebf\u7a0b \u7ebf\u7a0b\u6c60 reactor \u6a21\u578b","og_url":"https:\/\/www.wsisp.com\/helps\/28254.html","og_site_name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","article_published_time":"2025-04-19T15:31:35+00:00","og_image":[{"url":"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/04\/20250419153133-6803c1d5330dc.jpg"}],"author":"admin","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"admin","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"7 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.wsisp.com\/helps\/28254.html","url":"https:\/\/www.wsisp.com\/helps\/28254.html","name":"\u591a\u7ebf\u7a0b\u670d\u52a1\u5668\u5206\u6790\u2014\u2014Reactor\u7ebf\u7a0b\u6a21\u578b\u548c\u6027\u80fd\u5206\u6790(\u4e00) - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","isPartOf":{"@id":"https:\/\/www.wsisp.com\/helps\/#website"},"datePublished":"2025-04-19T15:31:35+00:00","dateModified":"2025-04-19T15:31:35+00:00","author":{"@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41"},"breadcrumb":{"@id":"https:\/\/www.wsisp.com\/helps\/28254.html#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.wsisp.com\/helps\/28254.html"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.wsisp.com\/helps\/28254.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.wsisp.com\/helps"},{"@type":"ListItem","position":2,"name":"\u591a\u7ebf\u7a0b\u670d\u52a1\u5668\u5206\u6790\u2014\u2014Reactor\u7ebf\u7a0b\u6a21\u578b\u548c\u6027\u80fd\u5206\u6790(\u4e00)"}]},{"@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\/28254","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=28254"}],"version-history":[{"count":0,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/28254\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media\/28248"}],"wp:attachment":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media?parent=28254"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/categories?post=28254"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/tags?post=28254"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/topic?post=28254"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}