{"id":45242,"date":"2025-06-23T07:26:48","date_gmt":"2025-06-22T23:26:48","guid":{"rendered":"https:\/\/www.wsisp.com\/helps\/45242.html"},"modified":"2025-06-23T07:26:48","modified_gmt":"2025-06-22T23:26:48","slug":"%e3%80%90%e9%a1%b9%e7%9b%ae%e3%80%91%e4%bb%bfmuduo%e5%ba%93one-thread-one-loop%e5%bc%8f%e5%b9%b6%e5%8f%91%e6%9c%8d%e5%8a%a1%e5%99%a8server%e6%a8%a1%e5%9d%97%ef%bc%88%e4%b8%8b%ef%bc%89","status":"publish","type":"post","link":"https:\/\/www.wsisp.com\/helps\/45242.html","title":{"rendered":"\u3010\u9879\u76ee\u3011\u4effmuduo\u5e93one thread one loop\u5f0f\u5e76\u53d1\u670d\u52a1\u5668SERVER\u6a21\u5757\uff08\u4e0b\uff09"},"content":{"rendered":"<p><span style=\"color:#0d0016\">&#x1f4da;\u00a0\u535a\u4e3b\u7684\u4e13\u680f<\/span><\/p>\n<p>&#x1f427;\u00a0Linux\u00a0\u00a0\u00a0|\u00a0\u00a0 &#x1f5a5;\ufe0f\u00a0C&#043;&#043;\u00a0\u00a0\u00a0|\u00a0\u00a0 &#x1f4ca;\u00a0\u6570\u636e\u7ed3\u6784\u00a0\u00a0|\u00a0&#x1f4a1;C&#043;&#043; \u7b97\u6cd5\u00a0|\u00a0&#x1f152;\u00a0C \u8bed\u8a00\u00a0 |\u00a0&#x1f310;\u00a0\u8ba1\u7b97\u673a\u7f51\u7edc\u00a0|&#x1f5c3;\ufe0f\u00a0mysql<\/p>\n<p><span style=\"color:#0d0016\">\u9879\u76ee\u6587\u7ae0&#xff1a;<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u4effmuduo\u5e93one thread one loop\u5f0f\u5e76\u53d1\u670d\u52a1\u5668\u524d\u7f6e\u77e5\u8bc6\u51c6\u5907<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u4effmuduo\u5e93one thread one loop\u5f0f\u5e76\u53d1\u670d\u52a1\u5668\u524d\u7f6e&#xff08;\u4e0a&#xff09;<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u4e0a\u7bc7\u6587\u7ae0\u8be6\u7ec6\u4ecb\u7ecd\u4e86EventLoop\u7b80\u5355\u670d\u52a1\u5668\u7684\u5b9e\u73b0&#xff0c;\u6db5\u76d6\u4e86Buffer\u7f13\u51b2\u533a\u6a21\u5757\u3001Socket\u5957\u63a5\u5b57\u6a21\u5757\u3001Channel\u4e8b\u4ef6\u7ba1\u7406\u6a21\u5757\u3001Poller\u63cf\u8ff0\u7b26\u76d1\u63a7\u6a21\u5757\u3001EventLoop\u4e8b\u4ef6\u5faa\u73af\u6a21\u5757\u4ee5\u53caTimerWheel\u5b9a\u65f6\u5668\u6a21\u5757\u3002\u672c\u6587\u5c06\u5ef6\u7eed\u8fd9\u4e00\u9879\u76ee&#xff0c;\u7ee7\u7eed\u8bb2\u89e3\u5176\u4ed6\u6a21\u5757\u7684\u5b9e\u73b0\u3002<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u672c\u6587\u6458\u8981&#xff1a;<\/span><span style=\"color:#0d0016\">\u6587\u7ae0\u9996\u5148\u8bb2\u89e3\u4e86Connection\u6a21\u5757\u7684\u529f\u80fd\u8bbe\u8ba1\u3001\u7c7b\u63a5\u53e3\u5b9e\u73b0\u548c\u8c03\u8bd5\u8fc7\u7a0b&#xff0c;\u5305\u62ec\u5957\u63a5\u5b57\u7ba1\u7406\u3001\u4e8b\u4ef6\u76d1\u63a7\u3001\u7f13\u51b2\u533a\u64cd\u4f5c\u7b49\u6838\u5fc3\u529f\u80fd\u3002\u63a5\u7740\u9610\u8ff0\u4e86Acceptor\u6a21\u5757\u5bf9\u76d1\u542c\u5957\u63a5\u5b57\u7684\u7ba1\u7406\u673a\u5236&#xff0c;\u4ee5\u53caLoopThread\u548cLoopThreadPool\u6a21\u5757\u7684\u7ebf\u7a0b\u6c60\u5b9e\u73b0\u3002\u6700\u540e\u6574\u5408\u4e3aTcpServer\u6a21\u5757&#xff0c;\u5b9e\u73b0\u4e86\u5b8c\u6574\u7684\u670d\u52a1\u5668\u6846\u67b6&#xff0c;\u5e76\u5728\u6b64\u57fa\u7840\u4e0a\u6784\u5efa\u4e86\u56de\u663e\u670d\u52a1\u5668EchoServer\u3002\u6587\u7ae0\u8fd8\u63d0\u4f9b\u4e86WebBench\u6027\u80fd\u6d4b\u8bd5\u65b9\u6cd5\u548c\u670d\u52a1\u5668\u56de\u8c03\u6d41\u7a0b\u56fe&#xff0c;\u5168\u9762\u5c55\u793a\u4e86\u9ad8\u5e76\u53d1\u670d\u52a1\u5668\u7684\u5f00\u53d1\u8fc7\u7a0b\u4e0e\u5173\u952e\u6280\u672f\u3002<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u5efa\u8bae\u5148\u9605\u8bfb\u603b\u6a21\u5757\u56de\u8c03\u6d41\u7a0b\u56fe&#xff0c;\u4ee5\u5e2e\u52a9\u7406\u89e3\u672c\u6587\u7684\u5b9e\u73b0\u903b\u8f91\u3002<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"2601\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/06\/20250622232638-6858912e91154.png\" width=\"3317\" \/><\/p>\n<p id=\"main-toc\">\u76ee\u5f55<\/p>\n<p id=\"%E5%85%AB%E3%80%81Connection%E6%A8%A1%E5%9D%97-toc\" style=\"margin-left:0px\">\u516b\u3001Connection\u6a21\u5757<\/p>\n<p id=\"8.1%20Connection%E6%A8%A1%E5%9D%97%E5%8A%9F%E8%83%BD%E6%80%9D%E6%83%B3-toc\" style=\"margin-left:40px\">8.1 Connection\u6a21\u5757\u529f\u80fd\u601d\u60f3<\/p>\n<p id=\"8.2%20Connection%E6%A8%A1%E5%9D%97%E7%B1%BB%E8%AE%BE%E8%AE%A1-toc\" style=\"margin-left:40px\">8.2 Connection\u6a21\u5757\u7c7b\u8bbe\u8ba1<\/p>\n<p id=\"8.3%20Connection%E6%A8%A1%E5%9D%97%E7%B1%BB%E6%8E%A5%E5%8F%A3%E5%AE%9E%E7%8E%B0%E3%80%81%E7%BC%96%E8%AF%91%E9%80%9A%E8%BF%87-toc\" style=\"margin-left:40px\">8.3 Connection\u6a21\u5757\u7c7b\u63a5\u53e3\u5b9e\u73b0\u3001\u7f16\u8bd1\u901a\u8fc7<\/p>\n<p id=\"8.4%20Connection%E6%A8%A1%E5%9D%97%E7%B1%BB%E5%8A%9F%E8%83%BD%E8%81%94%E8%B0%83-toc\" style=\"margin-left:40px\">8.4 Connection\u6a21\u5757\u7c7b\u529f\u80fd\u8054\u8c03<\/p>\n<p id=\"%E4%B9%9D%E3%80%81Acceptor%E6%A8%A1%E5%9D%97-toc\" style=\"margin-left:0px\">\u4e5d\u3001Acceptor\u6a21\u5757<\/p>\n<p id=\"9.1%20Acceptor%E6%A8%A1%E5%9D%97%E7%B1%BB%E5%8A%9F%E8%83%BD%E6%80%9D%E6%83%B3-toc\" style=\"margin-left:40px\">9.1 Acceptor\u6a21\u5757\u7c7b\u529f\u80fd\u601d\u60f3<\/p>\n<p id=\"9.2%20Acceptor%E6%A8%A1%E5%9D%97%E7%B1%BB%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0-toc\" style=\"margin-left:40px\">9.2 Acceptor\u6a21\u5757\u7c7b\u8bbe\u8ba1\u4e0e\u5b9e\u73b0<\/p>\n<p id=\"9.3%20Acceptor%E6%A8%A1%E5%9D%97%E7%B1%BB%E5%8A%9F%E8%83%BD%E8%81%94%E8%B0%83-toc\" style=\"margin-left:40px\">9.3 Acceptor\u6a21\u5757\u7c7b\u529f\u80fd\u8054\u8c03<\/p>\n<p id=\"%E5%8D%81%E3%80%81LoopThread%EF%BC%88%E5%BE%AA%E7%8E%AF%E7%BA%BF%E7%A8%8B%EF%BC%89%E6%A8%A1%E5%9D%97-toc\" style=\"margin-left:0px\">\u5341\u3001LoopThread&#xff08;\u5faa\u73af\u7ebf\u7a0b&#xff09;\u6a21\u5757<\/p>\n<p id=\"10.1%20LoopThread%E6%A8%A1%E5%9D%97%E7%B1%BB%E5%8A%9F%E8%83%BD%E6%80%9D%E6%83%B3-toc\" style=\"margin-left:40px\">10.1 LoopThread\u6a21\u5757\u7c7b\u529f\u80fd\u601d\u60f3<\/p>\n<p id=\"10.2%20LoopThread%E6%A8%A1%E5%9D%97%E7%B1%BB%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0-toc\" style=\"margin-left:40px\">10.2 LoopThread\u6a21\u5757\u7c7b\u8bbe\u8ba1\u4e0e\u5b9e\u73b0<\/p>\n<p id=\"10.3%20LoopThread%E6%A8%A1%E5%9D%97%E7%B1%BB%E8%B0%83%E8%AF%95-toc\" style=\"margin-left:40px\">10.3 LoopThread\u6a21\u5757\u7c7b\u8c03\u8bd5<\/p>\n<p id=\"%E5%8D%81%E4%B8%80%E3%80%81LoopThreadPool%E6%A8%A1%E5%9D%97-toc\" style=\"margin-left:0px\">\u5341\u4e00\u3001LoopThreadPool\u6a21\u5757<\/p>\n<p id=\"11.1%20LoopThreadPool%E6%A8%A1%E5%9D%97%E7%B1%BB%E5%8A%9F%E8%83%BD%E6%80%9D%E6%83%B3-toc\" style=\"margin-left:40px\">11.1 LoopThreadPool\u6a21\u5757\u7c7b\u529f\u80fd\u601d\u60f3<\/p>\n<p id=\"11.2%C2%A0LoopThreadPool%E6%A8%A1%E5%9D%97%E7%B1%BB%E8%AE%BE%E8%AE%A1-toc\" style=\"margin-left:40px\">11.2\u00a0LoopThreadPool\u6a21\u5757\u7c7b\u8bbe\u8ba1<\/p>\n<p id=\"11.3%20LoopThreadPool%E6%A8%A1%E5%9D%97%E7%B1%BB%E5%AE%9E%E7%8E%B0-toc\" style=\"margin-left:40px\">11.3 LoopThreadPool\u6a21\u5757\u7c7b\u5b9e\u73b0<\/p>\n<p id=\"11.4%20LoopThreadPool%E6%A8%A1%E5%9D%97%E7%B1%BB%E8%B0%83%E8%AF%95-toc\" style=\"margin-left:40px\">11.4 LoopThreadPool\u6a21\u5757\u7c7b\u8c03\u8bd5<\/p>\n<p id=\"%E5%8D%81%E4%BA%8C%E3%80%81TcpServer%E6%A8%A1%E5%9D%97-toc\" style=\"margin-left:0px\">\u5341\u4e8c\u3001TcpServer\u6a21\u5757<\/p>\n<p id=\"12.1%20TcpServer%E6%A8%A1%E5%9D%97%E7%B1%BB%E5%8A%9F%E8%83%BD%E6%80%9D%E6%83%B3-toc\" style=\"margin-left:40px\">12.1 TcpServer\u6a21\u5757\u7c7b\u529f\u80fd\u601d\u60f3<\/p>\n<p id=\"12.2%20TcpServer%E6%A8%A1%E5%9D%97%E7%B1%BB%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0-toc\" style=\"margin-left:40px\">12.2 TcpServer\u6a21\u5757\u7c7b\u8bbe\u8ba1\u4e0e\u5b9e\u73b0<\/p>\n<p id=\"12.3%20TcpServer%E6%A8%A1%E5%9D%97%E7%B1%BB%E8%B0%83%E8%AF%95%E8%BF%90%E8%A1%8C-toc\" style=\"margin-left:40px\">12.3 TcpServer\u6a21\u5757\u7c7b\u8c03\u8bd5\u8fd0\u884c<\/p>\n<p id=\"%E5%8D%81%E4%B8%89%E3%80%81%E5%9F%BA%E4%BA%8ETcpServer%E5%AE%9E%E7%8E%B0%E5%9B%9E%E6%98%BE%E6%9C%8D%E5%8A%A1%E5%99%A8-toc\" style=\"margin-left:0px\">\u5341\u4e09\u3001\u57fa\u4e8eTcpServer\u5b9e\u73b0\u56de\u663e\u670d\u52a1\u5668<\/p>\n<p id=\"13.1%20EchoServer%E7%B1%BB%E6%A8%A1%E5%9D%97%EF%BC%9A-toc\" style=\"margin-left:40px\">13.1 EchoServer\u7c7b\u6a21\u5757&#xff1a;<\/p>\n<p id=\"13.2%20%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95-WebBench-toc\" style=\"margin-left:40px\">13.2 \u6027\u80fd\u6d4b\u8bd5-WebBench<\/p>\n<p id=\"13.3%20EchoServer%E6%80%BB%E4%BD%93%E5%9B%9E%E8%B0%83%E6%A8%A1%E5%9D%97%E6%B5%81%E7%A8%8B%E5%85%B3%E7%B3%BB%E5%9B%BE-toc\" style=\"margin-left:40px\">13.3 EchoServer\u603b\u4f53\u56de\u8c03\u6a21\u5757\u6d41\u7a0b\u5173\u7cfb\u56fe<\/p>\n<hr id=\"hr-toc\" \/>\n<h2 id=\"%E5%85%AB%E3%80%81Connection%E6%A8%A1%E5%9D%97\"><span style=\"color:#0d0016\">\u516b\u3001Connection\u6a21\u5757<\/span><\/h2>\n<h3 id=\"8.1%20Connection%E6%A8%A1%E5%9D%97%E5%8A%9F%E8%83%BD%E6%80%9D%E6%83%B3\"><span style=\"color:#0d0016\">8.1 Connection\u6a21\u5757\u529f\u80fd\u601d\u60f3<\/span><\/h3>\n<p><span style=\"color:#0d0016\">\u76ee\u7684&#xff1a;\u5bf9\u8fde\u63a5\u8fdb\u884c\u5168\u65b9\u4f4d\u7684\u7ba1\u7406&#xff0c;\u5bf9\u901a\u4fe1\u8fde\u63a5\u7684\u6240\u6709\u64cd\u4f5c\u90fd\u662f\u901a\u8fc7\u8fd9\u4e2a\u6a21\u5757\u63d0\u4f9b\u7684\u529f\u80fd\u5b8c\u6210<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u529f\u80fd\u8bbe\u8ba1&#xff08;\u4ece\u6574\u4f53\u6d41\u7a0b\u51fa\u53d1&#xff09;&#xff1a;<\/span><\/p>\n<p><span style=\"color:#0d0016\">1.\u5957\u63a5\u5b57\u7684\u7ba1\u7406&#xff1a;\u80fd\u591f\u8fdb\u884c\u5957\u63a5\u5b57\u7684\u64cd\u4f5c<\/span><\/p>\n<p><span style=\"color:#0d0016\">2.\u8fde\u63a5\u4e8b\u4ef6\u7684\u7ba1\u7406&#xff1a;\u53ef\u8bfb\u3001\u53ef\u5199\u3001\u9519\u8bef\u3001\u6302\u65ad\u3001\u4efb\u610f\u4e8b\u4ef6<\/span><\/p>\n<p><span style=\"color:#0d0016\">3.\u7f13\u51b2\u533a\u7684\u7ba1\u7406&#xff1a;\u4fbf\u4e8esocket\u6570\u636e\u7684\u63a5\u6536\u548c\u53d1\u9001<\/span><\/p>\n<p><span style=\"color:#0d0016\">4.\u534f\u8bae\u4e0a\u4e0b\u6587\u7684\u7ba1\u7406&#xff1a;\u8bb0\u5f55\u8bf7\u6c42\u6570\u636e\u7684\u5904\u7406\u8fc7\u7a0b&#xff08;\u63a5\u6536\u548c\u89e3\u6790\u7684\u8fc7\u7a0b&#xff09;<\/span><\/p>\n<p><span style=\"color:#0d0016\"><span style=\"color:#0d0016\">5.\u56de\u8c03\u51fd\u6570\u7684\u7ba1\u7406&#xff1a;<\/span><\/span><\/p>\n<p><span style=\"color:#0d0016\">\u56e0\u4e3a\u8fde\u63a5 \u63a5\u6536\u5230\u6570\u636e\u4e4b\u540e\u8be5\u5982\u4f55\u5904\u7406&#xff0c;\u9700\u8981\u7531\u7528\u6237\u51b3\u5b9a&#xff0c;\u56e0\u6b64\u5fc5\u987b\u6709\u4e1a\u52a1\u5904\u7406\u56de\u8c03\u51fd\u6570<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u4e00\u4e2a\u8fde\u63a5\u5efa\u7acb\u6210\u529f\u540e&#xff1a;\u8be5\u5982\u4f55\u62a4\u7406&#xff0c;\u7531\u7528\u6237\u51b3\u5b9a\u3002\u56e0\u6b64\u5fc5\u6709\u8fde\u63a5\u5efa\u7acb\u6210\u529f\u7684\u56de\u8c03\u51fd\u6570<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u4e00\u4e2a\u8fde\u63a5\u5173\u95ed\u524d&#xff1a;\u8be5\u5982\u4f55\u5904\u7406&#xff0c;\u7531\u7528\u6237\u51b3\u5b9a\u3002\u56e0\u6b64\u5fc5\u6709\u5173\u95ed\u8fde\u63a5\u7684\u56de\u8c03\u51fd\u6570<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u4efb\u610f\u4e8b\u4ef6\u7684\u4ea7\u751f&#xff1a;\u6709\u6ca1\u6709\u67d0\u4e9b\u5904\u7406&#xff0c;\u7531\u7528\u6237\u51b3\u5b9a&#xff0c;\u56e0\u6b64\u5fc5\u987b\u6709\u4efb\u610f\u4e8b\u4ef6\u7684\u56de\u8c03\u51fd\u6570<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u529f\u80fd&#xff1a;<\/span><\/p>\n<p><span style=\"color:#0d0016\">1.\u53d1\u9001\u6570\u636e &#8212;&#8212;- \u7ed9\u7528\u6237\u63d0\u4f9b\u7684\u53d1\u9001\u6570\u636e\u63a5\u53e3&#xff0c;\u5e76\u4e0d\u662f\u771f\u6b63\u7684\u53d1\u9001\u63a5\u53e3&#xff0c;\u800c\u53ea\u662f\u628a\u6570\u636e\u653e\u5230\u53d1\u9001\u7f13\u51b2\u533a&#xff0c;\u7136\u540e\u542f\u52a8\u5199\u4e8b\u4ef6\u76d1\u63a7<\/span><\/p>\n<p><span style=\"color:#0d0016\">2.\u5173\u95ed\u8fde\u63a5 &#8212;&#8212;- \u7ed9\u7528\u6237\u63d0\u4f9b\u7684\u5173\u95ed\u8fde\u63a5\u63a5\u53e3&#xff0c;\u5e76\u4e0d\u662f\u771f\u6b63\u7684\u5173\u95ed\u8fde\u63a5\u63a5\u53e3&#xff0c;\u5e94\u8be5\u5728\u5b9e\u9645\u91ca\u653e\u8fde\u63a5\u4e4b\u524d&#xff0c;\u770b\u770b\u8f93\u5165\u8f93\u51fa\u7f13\u51b2\u533a\u662f\u5426\u6709\u6570\u636e\u5f85\u5904\u7406\u3002<\/span><\/p>\n<p><span style=\"color:#0d0016\">3.\u542f\u52a8\u975e\u6d3b\u8dc3\u8fde\u63a5\u7684\u8d85\u65f6\u9500\u6bc1\u529f\u80fd<\/span><span style=\"color:#0d0016\">\u00a0&#8212;&#8212;- \u4ea4\u7ed9\u7528\u6237\u51b3\u5b9a<\/span><\/p>\n<\/p>\n<p><span style=\"color:#0d0016\">4.\u53d6\u6d88\u975e\u6d3b\u8dc3\u8fde\u63a5\u7684\u8d85\u65f6\u9500\u6bc1\u529f\u80fd<\/span><span style=\"color:#0d0016\">\u00a0&#8212;&#8212;- \u4ea4\u7ed9\u7528\u6237\u51b3\u5b9a<\/span><\/p>\n<p><span style=\"color:#0d0016\">5.\u534f\u8bae\u5207\u6362<\/span><span style=\"color:#0d0016\">\u00a0&#8212;&#8212;- \u4e00\u4e2a\u8fde\u63a5\u63a5\u6536\u6570\u636e\u540e\u5982\u4f55\u8fdb\u884c\u4e1a\u52a1\u5904\u7406&#xff0c;\u53d6\u51b3\u4e8e\u4e0a\u4e0b\u6587&#xff0c;\u4ee5\u53ca\u4e1a\u52a1\u5904\u7406\u7684\u56de\u8c03\u51fd\u6570\u00a0<\/span><\/p>\n<\/p>\n<p><span style=\"color:#0d0016\">Connection\u6a21\u5757\u662f\u5bf9\u8fde\u63a5\u7684\u7ba1\u7406\u6a21\u5757&#xff0c;\u5bf9\u4e8e\u8fde\u63a5\u7684\u6240\u6709\u64cd\u4f5c\u90fd\u662f\u901a\u8fc7\u8fd9\u4e2a\u6a21\u5757\u5b8c\u6210\u7684 \u00a0<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u573a\u666f&#xff1a;\u5bf9\u8fde\u63a5\u8fdb\u884c\u64cd\u4f5c\u7684\u65f6\u5019&#xff0c;\u4f46\u662f\u8fde\u63a5\u5df2\u7ecf\u88ab\u91ca\u653e&#xff0c;\u5bfc\u81f4\u5185\u5b58\u8bbf\u95ee\u9519\u8bef&#xff0c;\u6700\u7ec8\u7a0b\u5e8f\u5d29\u6e83 \u00a0 \u89e3\u51b3\u65b9\u6848&#xff1a;\u4f7f\u7528\u667a\u80fd\u6307\u9488shared_ptr\u5bf9Connection\u5bf9\u8c61\u8fdb\u884c\u7ba1\u7406&#xff0c;\u8fd9\u6837\u5c31\u80fd\u4fdd\u8bc1\u4efb\u610f\u4e00\u4e2a\u5730\u65b9\u5bf9Connection\u5bf9\u8c61\u8fdb\u884c\u64cd\u4f5c\u7684\u65f6\u5019&#xff0c;\u4fdd\u5b58\u4e86\u4e00\u4efdshared_ptr&#xff0c;\u56e0\u6b64\u5c31\u7b97\u5176\u4ed6\u5730\u65b9\u8fdb\u884c\u91ca\u653e\u64cd\u4f5c&#xff0c;\u4e5f\u53ea\u662f\u5bf9shared_ptr\u7684\u8ba1\u6570\u5668-1&#xff0c;\u800c\u4e0d\u4f1a\u5bfc\u81f4Connection\u7684\u5b9e\u9645\u91ca\u653e<\/span><\/p>\n<h3 id=\"8.2%20Connection%E6%A8%A1%E5%9D%97%E7%B1%BB%E8%AE%BE%E8%AE%A1\"><span style=\"color:#0d0016\">8.2 Connection\u6a21\u5757\u7c7b\u8bbe\u8ba1<\/span><\/h3>\n<p><span style=\"color:#0d0016\">\u5176\u4e2dAny\u7c7b\u53ef\u4ee5\u67e5\u770b\u524d\u7f6e\u77e5\u8bc6\u51c6\u5907\u7684\u8be6\u7ec6\u8bb2\u89e3<\/span><\/p>\n<p>typedef enum<br \/>\n{<br \/>\n    DISCONNECTIED, \/\/ \u8fde\u63a5\u5173\u95ed\u72b6\u6001<br \/>\n    CONNECTING,    \/\/ \u8fde\u63a5\u5efa\u7acb\u6210\u529f&#xff0c;\u5f85\u5904\u7406\u7684\u72b6\u6001<br \/>\n    CONNECTED,     \/\/ \u8fde\u63a5\u5efa\u7acb\u5b8c\u6210\u72b6\u6001\u5404\u79cd\u8bbe\u7f6e\u5df2\u5b8c\u6210&#xff0c;\u901a\u4fe1\u72b6\u6001<br \/>\n    DISCONNECTING  \/\/ \u5f85\u5173\u95ed\u8fde\u63a5\u7684\u72b6\u6001<br \/>\n} ConnStatus;<\/p>\n<p>using PtrConnection &#061; std::shared_ptr&lt;Connection&gt;;<br \/>\nclass Connection<br \/>\n{<br \/>\nprivate:<br \/>\n    uint64_t _conn_id; \/\/ \u8fde\u63a5\u7684\u552f\u4e00ID&#xff0c;\u4fbf\u4e8e\u8fde\u63a5\u7684\u7ba1\u7406\u548c\u67e5\u627e<br \/>\n    \/\/ uint64_t _timer_id;         \/\/\u5b9a\u65f6\u5668ID, \u8fd9\u5757\u4e3a\u4e86\u7b80\u5316\u64cd\u4f5c\u4f7f\u7528conn_id\u4f5c\u4e3a\u5b9a\u65f6\u5668ID<br \/>\n    int _sockfd;                   \/\/ \u8fde\u63a5\u5173\u8054\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26<br \/>\n    bool _enable_inactive_release; \/\/ \u8fde\u63a5\u662f\u5426\u542f\u52a8\u975e\u6d3b\u8dc3\u9500\u6bc1\u7684\u7247\u5224\u65ad\u6807\u5fd7&#xff0c;\u9ed8\u8ba4\u662ffalse<br \/>\n    EventLoop *loop;               \/\/ \u8fde\u63a5\u9501\u5173\u8054\u7684\u4e00\u4e2aEventLoop<br \/>\n    ConnStatus _status;            \/\/ \u8fde\u63a5\u72b6\u6001<br \/>\n    Socket _socket;                \/\/ \u5957\u63a5\u5b57\u64cd\u4f5c\u7ba1\u7406<br \/>\n    Channel _channel;              \/\/ \u8fde\u63a5\u7684\u4e8b\u4ef6\u7ba1\u7406<br \/>\n    Buffer _in_buffer;             \/\/ \u8f93\u5165\u7f13\u51b2\u533a &#8212; \u5b58\u653e\u4ecesocket\u4e2d\u8bfb\u53d6\u5230\u7684\u6570\u636e<br \/>\n    Buffer _out_buffer;            \/\/ \u8f93\u51fa\u7f13\u51b2\u533a &#8212; \u5b58\u653e\u8981\u53d1\u9001\u7ed9\u5bf9\u7aef\u7684\u6570\u636e<br \/>\n    Any _context;                  \/\/ \u8bf7\u6c42\u7684\u63a5\u6536\u5904\u7406\u4e0a\u4e0b\u6587<\/p>\n<p>    \/\/ \u8fd9\u56db\u4e2a\u56de\u8c03\u51fd\u6570&#xff0c;\u662f\u7ed9\u7ec4\u4ef6\u4f7f\u7528\u8005\u8bbe\u7f6e\u7684&#xff08;\u670d\u52a1\u5668\u6a21\u5757\u6765\u8bbe\u7f6e\u7684&#xff0c;\u5176\u5b9e\u670d\u52a1\u5668\u6a21\u5757\u7684\u5904\u7406\u56de\u8c03\u662f\u7ec4\u5efa\u4f7f\u7528\u8005\u8bbe\u7f6e\u7684<br \/>\n    \/\/ \u6362\u53e5\u8bdd\u8bf4&#xff0c;\u8fd9\u51e0\u4e2a\u56de\u8c03\u90fd\u662f\u7ec4\u4ef6\u4f7f\u7528\u8005\u4f7f\u7528\u7684<br \/>\n    using ConnectedCallBack &#061; std::function&lt;void(const PtrConnection &amp;)&gt;;<br \/>\n    using MessageCallBack &#061; std::function&lt;void(const PtrConnection &amp;, Buffer *)&gt;;<br \/>\n    using ClosedCallBack &#061; std::function&lt;void(const PtrConnection &amp;)&gt;;<br \/>\n    using AnyEventCallBack &#061; std::function&lt;void(const PtrConnection &amp;)&gt;;<\/p>\n<p>    ConnectedCallBack _connected_callback;<br \/>\n    MessageCallBack _message_callback;<br \/>\n    ClosedCallBack _closed_callback;<br \/>\n    AnyEventCallBack _anyevent_callback;<br \/>\n    \/\/ \u7ec4\u4ef6\u5185\u7684\u8fde\u63a5\u5173\u95ed\u56de\u8c03&#8212;\u7ec4\u4ef6\u5185\u8bbe\u7f6e\u7684&#xff0c;\u56e0\u4e3a\u670d\u52a1\u5668\u7ec4\u4ef6\u5185\u4f1a\u628a\u6240\u6709\u7684\u8fde\u63a5\u7ba1\u7406\u8d77\u6765&#xff0c;\u4e00\u65e6\u67d0\u4e2a\u8fde\u63a5\u8981\u5173\u95ed<br \/>\n    \/\/ \u5c31\u5e94\u8be5\u4ece\u7ba1\u7406\u7684\u5730\u65b9\u79fb\u9664\u6389\u81ea\u5df1\u7684\u4fe1\u606f<br \/>\n    ClosedCallBack _server_closed_callback;<\/p>\n<p>private:<br \/>\n    \/*\u4e94\u4e2achannel\u7684\u4e8b\u4ef6\u56de\u8c03\u51fd\u6570*\/<br \/>\n    void HandleRead();     \/\/ fd\u53ef\u8bfb\u4e8b\u4ef6\u89e6\u53d1\u540e&#xff0c;\u8c03\u7528\u7684\u51fd\u6570&#xff0c;\u63a5\u6536socket\u6570\u636e\u653e\u5230\u63a5\u6536\u7f13\u51b2\u533a\u4e2d&#xff0c;\u7136\u540e\u8c03\u7528_message_callback<br \/>\n    void HandleWrite();    \/\/ fd\u53ef\u5199\u4e8b\u4ef6\u89e6\u53d1\u540e&#xff0c;\u8c03\u7528\u7684\u51fd\u6570&#xff0c;\u5c06\u53d1\u9001\u7f13\u51b2\u533a\u4e2d\u7684\u6570\u636e\u8fdb\u884c\u53d1\u9001<br \/>\n    void HandleClose();    \/\/ fd\u6302\u65ad\u4e8b\u4ef6\u89e6\u53d1\u540e<br \/>\n    void HandleError();    \/\/ fd\u51fa\u9519\u4e8b\u4ef6\u89e6\u53d1\u540e<br \/>\n    void HandleAnyEvent(); \/\/ \u4efb\u4f55\u4e8b\u4ef6\u89e6\u53d1\u540e<\/p>\n<p>    \/\/ \u5bf9\u5916\u63d0\u4f9b\u7684\u63a5\u53e3\u90fd\u8981\u653e\u5728\u7ebf\u7a0b\u5f53\u4e2d\u6765\u8fd0\u884c<br \/>\n    void EstablishedInLoop(); \/\/ \u8fde\u63a5\u83b7\u53d6\u4e4b\u540e&#xff0c;\u6240\u5904\u7684\u72b6\u6001\u4e0b\u8981\u8fdb\u884c\u5404\u79cd\u8bbe\u7f6e&#xff08;\u7ed9channel\u8bbe\u7f6e\u4e8b\u4ef6\u56de\u8c03&#xff0c;\u542f\u52a8\u8bfb\u76d1\u63a7&#xff09;<br \/>\n    void SendInLoop(char *data, size_t len);<br \/>\n    void ReleaseInLoop(); \/\/ \u8fd9\u4e2a\u63a5\u53e3\u624d\u662f\u5b9e\u9645\u7684\u91ca\u653e\u63a5\u53e3<br \/>\n    void ShutdownInLoop();<br \/>\n    void EnableInactiveReleaseInLoop(int sec);<br \/>\n    void CancelInactiveReleaseInLoop();<br \/>\n    void UpgradeInLoop(const Any &amp;context,<br \/>\n                       const ConnectedCallBack &amp;conn,<br \/>\n                       const MessageCallBack &amp;msg,<br \/>\n                       const ClosedCallBack &amp;closed,<br \/>\n                       const AnyEventCallBack &amp;anyevent);<\/p>\n<p>public:<br \/>\n    \/\/ \u63a5\u53e3\u8bbe\u8ba1<br \/>\n    Connection(EventLoop *loop, uint64_t conn_id, int sockfd);<br \/>\n    ~Connection();<\/p>\n<p>    int Fd();                            \/\/ \u83b7\u53d6\u7ba1\u7406\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26<br \/>\n    int Id();                            \/\/ \u83b7\u53d6\u8fde\u63a5ID<br \/>\n    ConnStatus _Status();                \/\/ \u8fd4\u56de\u72b6\u6001<br \/>\n    bool Connected();                    \/\/ \u662f\u5426\u5904\u4e8e\u8fde\u63a5\u72b6\u6001<br \/>\n    void SetContext(const Any &amp;context); \/\/ \u8bbe\u7f6e\u4e0a\u4e0b\u6587 &#8212; \u8fde\u63a5\u5efa\u7acb\u5b8c\u6210\u65f6\u8fdb\u884c\u8c03\u7528&#xff08;CONNECTED)<br \/>\n    Any *GetContext();                   \/\/ \u83b7\u53d6\u4e0a\u4e0b\u6587 &#8212; \u8fd4\u56de\u7684\u662f\u6307\u9488<\/p>\n<p>    void SetConnectedCallBack(const ConnectedCallBack &amp;cb);<br \/>\n    void SetMessageCallBack(const MessageCallBack &amp;cb);<br \/>\n    void SetClosedCallBack(const ClosedCallBack &amp;cb);<br \/>\n    void SetAnyEventCallBack(const AnyEventCallBack &amp;cb);<br \/>\n    void SetSvrClosedCallBack(const AnyEventCallBack &amp;cb);<\/p>\n<p>    \/\/ \u8fde\u63a5\u5efa\u7acb\u5c31\u7eea\u540e&#xff0c;\u8fdb\u884cchannel\u56de\u8c03\u8bbe\u7f6e&#xff0c;\u542f\u52a8\u8bfb\u76d1\u63a7<br \/>\n    void Established();<\/p>\n<p>    \/\/ \u53d1\u9001\u6570\u636e&#xff0c;\u5c06\u6570\u636e\u53d1\u9001\u5230\u7f13\u51b2\u533a&#xff0c;\u542f\u52a8\u5199\u4e8b\u4ef6\u76d1\u63a7<br \/>\n    void Send(char *data, size_t len);<br \/>\n    \/\/ \u63d0\u4f9b\u7ed9\u7ec4\u4ef6\u4f7f\u7528\u8005\u7684\u5173\u95ed\u63a5\u53e3, \u5e76\u4e0d\u5b9e\u9645\u5173\u95ed&#xff0c;\u9700\u8981\u5224\u65ad\u662f\u5426\u6709\u6570\u636e\u5f85\u5904\u7406<br \/>\n    void Shutdown();<br \/>\n    \/\/ \u542f\u52a8\u975e\u6d3b\u8dc3\u9500\u6bc1&#xff0c;\u5e76\u5b9a\u4e49\u591a\u957f\u65f6\u95f4\u65e0\u901a\u4fe1&#xff0c;\u5e76\u5b9a\u4e49\u591a\u957f\u65f6\u95f4\u65e0\u901a\u4fe1\u5c31\u662f\u975e\u6d3b\u8dc3&#xff0c;\u6dfb\u52a0\u5b9a\u65f6\u4efb\u52a1<br \/>\n    void EnableInactiveRelease(int sec);<br \/>\n    \/\/ \u53d6\u6d88\u975e\u6d3b\u8dc3\u9500\u6bc1<br \/>\n    void CancelInactiveRelease(int sec);<br \/>\n    \/\/ \u5207\u6362\u534f\u8bae &#8212; \u91cd\u7f6e\u4e0a\u4e0b\u6587\u4ee5\u53ca\u9636\u6bb5\u6027\u5904\u7406\u51fd\u6570<br \/>\n    void Upgrade(const Any &amp;context, const ConnectedCallBack &amp;conn, const MessageCallBack &amp;msg,<br \/>\n                 const ClosedCallBack &amp;closed, const AnyEventCallBack &amp;anyevent);<br \/>\n}; <\/p>\n<h3 id=\"8.3%20Connection%E6%A8%A1%E5%9D%97%E7%B1%BB%E6%8E%A5%E5%8F%A3%E5%AE%9E%E7%8E%B0%E3%80%81%E7%BC%96%E8%AF%91%E9%80%9A%E8%BF%87\"><span style=\"color:#0d0016\">8.3 Connection\u6a21\u5757\u7c7b\u63a5\u53e3\u5b9e\u73b0\u3001\u7f16\u8bd1\u901a\u8fc7<\/span><\/h3>\n<p><span style=\"color:#0d0016\">\u6ce8\u610f&#xff1a;\u5bf9\u4e8e\u4e4b\u524d\u5199\u7684Socket\u4e2d\u7684\u63a5\u53e3Write&#xff0c;\u6dfb\u52a0\u4e0a\u5224\u65ad\u3002<\/span><\/p>\n<p class=\"img-center\"><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"220\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/06\/20250622232642-685891329ae13.png\" width=\"512\" \/><\/p>\n<p><span style=\"color:#0d0016\">\u5728Connection\u7684HandleRead\u63a5\u53e3\u5904\u5c31\u53ef\u4ee5\u53bb\u6389\u5224\u65adret\u7684\u503c\u662f\u5426\u662f0<\/span><\/p>\n<p class=\"img-center\"><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"241\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/06\/20250622232642-68589132d187a.png\" width=\"512\" \/><\/p>\n<p><span style=\"color:#0d0016\">\u5bf9\u4e8e\u4e4b\u524d\u5199\u7684Socket\u4e2d\u7684\u63a5\u53e3NonBlockSend()&#xff0c;\u6dfb\u52a0\u4e0a\u5224\u65ad\u3002<\/span><\/p>\n<p class=\"img-center\"><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"169\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/06\/20250622232643-68589133201e4.png\" width=\"540\" \/><\/p>\n<p><span style=\"color:#0d0016\">\u5bf9\u4e8e\u4e4b\u524d\u5199\u7684Buffer\u4e2d\u7684\u63a5\u53e3MoveReadOffset()&#xff0c;\u6dfb\u52a0\u4e0a\u5224\u65ad<\/span><\/p>\n<p class=\"img-center\"><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"202\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/06\/20250622232643-685891334f531.png\" width=\"471\" \/><\/p>\n<p><span style=\"color:#0d0016\">\u6240\u7528\u5230\u7684\u65b0\u77e5\u8bc6&#xff1a;<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u5728C&#043;&#043;\u4e2d&#xff0c;std::enable_shared_from_this \u662f\u4e00\u4e2a\u6a21\u677f\u7c7b&#xff0c;\u7528\u4e8e\u5e2e\u52a9\u7c7b\u7684\u5b9e\u4f8b\u83b7\u53d6\u81ea\u5df1\u7684 std::shared_ptr\u3002\u5b83\u901a\u5e38\u7528\u4e8e\u9700\u8981\u4ece\u7c7b\u7684\u5b9e\u4f8b\u4e2d\u521b\u5efa std::shared_ptr \u7684\u573a\u666f&#xff0c;\u800c\u907f\u514d\u624b\u52a8\u7ba1\u7406\u6307\u9488\u7684\u751f\u547d\u5468\u671f\u3002<\/span><\/p>\n<p><span style=\"color:#0d0016\">1.\u00a0std::enable_shared_from_this\u00a0\u7684\u4f5c\u7528<\/span><\/p>\n<p><span style=\"color:#0d0016\">std::enable_shared_from_this \u7684\u4e3b\u8981\u4f5c\u7528\u662f\u63d0\u4f9b\u4e00\u4e2a\u6210\u5458\u51fd\u6570 shared_from_this&#xff0c;\u8be5\u51fd\u6570\u53ef\u4ee5\u8fd4\u56de\u4e00\u4e2a\u6307\u5411\u5f53\u524d\u5bf9\u8c61\u7684 std::shared_ptr\u3002\u5b83\u786e\u4fdd\u4e86\u5bf9\u8c61\u7684\u751f\u547d\u5468\u671f\u80fd\u591f\u88ab\u6b63\u786e\u7ba1\u7406&#xff0c;\u907f\u514d\u60ac\u6302\u6307\u9488\u6216\u91cd\u590d\u91ca\u653e\u7b49\u95ee\u9898\u3002<\/span><\/p>\n<p><span style=\"color:#0d0016\">2.\u00a0\u4f7f\u7528\u65b9\u6cd5<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u8981\u4f7f\u7528 std::enable_shared_from_this&#xff0c;\u9700\u8981\u6ee1\u8db3\u4ee5\u4e0b\u6761\u4ef6&#xff1a;<\/span><\/p>\n<ul>\n<li>\n<p><span style=\"color:#0d0016\">\u7c7b\u5fc5\u987b\u4ece std::enable_shared_from_this \u7ee7\u627f\u3002<\/span><\/p>\n<\/li>\n<li>\n<p><span style=\"color:#0d0016\">\u5bf9\u8c61\u5fc5\u987b\u901a\u8fc7 std::make_shared \u6216 std::shared_ptr \u7684\u6784\u9020\u51fd\u6570\u521b\u5efa\u3002<\/span><\/p>\n<\/li>\n<\/ul>\n<p><span style=\"color:#0d0016\">\u4ee5\u4e0b\u5c31\u662fConnection\u6a21\u5757\u63a5\u53e3\u5b9e\u73b0\u4ee3\u7801&#xff0c;Any\u7c7b\u53ef\u4ee5\u5230\u6211\u7684\u524d\u7f6e\u77e5\u8bc6\u51c6\u5907\u90a3\u7bc7\u9879\u76ee\u535a\u5ba2\u53bb\u83b7\u53d6<\/span><\/p>\n<p>class Connection;<br \/>\ntypedef enum {<br \/>\n    DISCONNECTED, \/\/ \u8fde\u63a5\u5173\u95ed\u72b6\u6001<br \/>\n    CONNECTING,   \/\/ \u8fde\u63a5\u5efa\u7acb\u6210\u529f&#xff0c;\u5f85\u5904\u7406\u7684\u72b6\u6001<br \/>\n    CONNECTED,    \/\/ \u8fde\u63a5\u5efa\u7acb\u5b8c\u6210\u72b6\u6001\u5404\u79cd\u8bbe\u7f6e\u5df2\u5b8c\u6210&#xff0c;\u901a\u4fe1\u72b6\u6001<br \/>\n    DISCONNECTING \/\/ \u5f85\u5173\u95ed\u8fde\u63a5\u7684\u72b6\u6001<br \/>\n} ConnStatus;<br \/>\nusing PtrConnection &#061; std::shared_ptr&lt;Connection&gt;;<br \/>\nclass Connection : public std::enable_shared_from_this&lt;Connection&gt; {<br \/>\nprivate:<br \/>\n    uint64_t _conn_id; \/\/ \u8fde\u63a5\u7684\u552f\u4e00ID&#xff0c;\u4fbf\u4e8e\u8fde\u63a5\u7684\u7ba1\u7406\u548c\u67e5\u627e<br \/>\n    \/\/ uint64_t _timer_id;         \/\/\u5b9a\u65f6\u5668ID,<br \/>\n    \/\/ \u8fd9\u5757\u4e3a\u4e86\u7b80\u5316\u64cd\u4f5c\u4f7f\u7528conn_id\u4f5c\u4e3a\u5b9a\u65f6\u5668ID<br \/>\n    int _sockfd; \/\/ \u8fde\u63a5\u5173\u8054\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26<br \/>\n    bool<br \/>\n        _enable_inactive_release; \/\/ \u8fde\u63a5\u662f\u5426\u542f\u52a8\u975e\u6d3b\u8dc3\u9500\u6bc1\u7684\u7247\u5224\u65ad\u6807\u5fd7&#xff0c;\u9ed8\u8ba4\u662ffalse<br \/>\n    EventLoop* _loop;             \/\/ \u8fde\u63a5\u9501\u5173\u8054\u7684\u4e00\u4e2aEventLoop<br \/>\n    ConnStatus _status;           \/\/ \u8fde\u63a5\u72b6\u6001<br \/>\n    Socket _socket;               \/\/ \u5957\u63a5\u5b57\u64cd\u4f5c\u7ba1\u7406<br \/>\n    Channel _channel;             \/\/ \u8fde\u63a5\u7684\u4e8b\u4ef6\u7ba1\u7406<br \/>\n    Buffer _in_buffer;            \/\/ \u8f93\u5165\u7f13\u51b2\u533a &#8212; \u5b58\u653e\u4ecesocket\u4e2d\u8bfb\u53d6\u5230\u7684\u6570\u636e<br \/>\n    Buffer _out_buffer;           \/\/ \u8f93\u51fa\u7f13\u51b2\u533a &#8212; \u5b58\u653e\u8981\u53d1\u9001\u7ed9\u5bf9\u7aef\u7684\u6570\u636e<br \/>\n    Any _context;                 \/\/ \u8bf7\u6c42\u7684\u63a5\u6536\u5904\u7406\u4e0a\u4e0b\u6587<\/p>\n<p>    \/\/ \u8fd9\u56db\u4e2a\u56de\u8c03\u51fd\u6570&#xff0c;\u662f\u7ed9\u7ec4\u4ef6\u4f7f\u7528\u8005\u8bbe\u7f6e\u7684&#xff08;\u670d\u52a1\u5668\u6a21\u5757\u6765\u8bbe\u7f6e\u7684&#xff0c;\u5176\u5b9e\u670d\u52a1\u5668\u6a21\u5757\u7684\u5904\u7406\u56de\u8c03\u662f\u7ec4\u5efa\u4f7f\u7528\u8005\u8bbe\u7f6e\u7684<br \/>\n    \/\/ \u6362\u53e5\u8bdd\u8bf4&#xff0c;\u8fd9\u51e0\u4e2a\u56de\u8c03\u90fd\u662f\u7ec4\u4ef6\u4f7f\u7528\u8005\u4f7f\u7528\u7684<br \/>\n    using ConnectedCallBack &#061; std::function&lt;void(const PtrConnection&amp;)&gt;;<br \/>\n    using MessageCallBack &#061; std::function&lt;void(const PtrConnection&amp;, Buffer*)&gt;;<br \/>\n    using ClosedCallBack &#061; std::function&lt;void(const PtrConnection&amp;)&gt;;<br \/>\n    using AnyEventCallBack &#061; std::function&lt;void(const PtrConnection&amp;)&gt;;<\/p>\n<p>    ConnectedCallBack _connected_callback;<br \/>\n    MessageCallBack _message_callback;<br \/>\n    ClosedCallBack _closed_callback;<br \/>\n    AnyEventCallBack _anyevent_callback;<br \/>\n    \/\/ \u7ec4\u4ef6\u5185\u7684\u8fde\u63a5\u5173\u95ed\u56de\u8c03&#8212;\u7ec4\u4ef6\u5185\u8bbe\u7f6e\u7684&#xff0c;\u56e0\u4e3a\u670d\u52a1\u5668\u7ec4\u4ef6\u5185\u4f1a\u628a\u6240\u6709\u7684\u8fde\u63a5\u7ba1\u7406\u8d77\u6765&#xff0c;\u4e00\u65e6\u67d0\u4e2a\u8fde\u63a5\u8981\u5173\u95ed<br \/>\n    \/\/ \u5c31\u5e94\u8be5\u4ece\u7ba1\u7406\u7684\u5730\u65b9\u79fb\u9664\u6389\u81ea\u5df1\u7684\u4fe1\u606f<br \/>\n    ClosedCallBack _server_closed_callback;<\/p>\n<p>private:<br \/>\n    \/*\u4e94\u4e2achannel\u7684\u4e8b\u4ef6\u56de\u8c03\u51fd\u6570*\/<br \/>\n    \/\/ fd\u53ef\u8bfb\u4e8b\u4ef6\u89e6\u53d1\u540e&#xff0c;\u8c03\u7528\u7684\u51fd\u6570&#xff0c;\u63a5\u6536socket\u6570\u636e\u653e\u5230\u63a5\u6536\u7f13\u51b2\u533a\u4e2d&#xff0c;\u7136\u540e\u8c03\u7528_message_callback<br \/>\n    void HandleRead() {<br \/>\n        \/\/ 1.\u8bfb\u53d6\u63a5\u6536socket\u7684\u6570\u636e&#xff0c;\u653e\u5230\u7f13\u51b2\u533a<br \/>\n        char buf[65536];<br \/>\n        ssize_t ret &#061; _socket.NonBlockRecv(buf, 65535);<\/p>\n<p>        \/\/ \u5904\u7406\u9519\u8bef<br \/>\n        if (ret &lt; 0) {<br \/>\n            \/\/ \u51fa\u9519\u4e86,\u4e0d\u80fd\u76f4\u63a5\u5173\u95ed\u8fde\u63a5<br \/>\n            return ShutdownInLoop();<br \/>\n        }<\/p>\n<p>        \/\/ \u8fd9\u91cc\u7684\u7b49\u4e8e0\u8868\u793a\u7684\u662f\u6ca1\u6709\u8bfb\u53d6\u5230\u6570\u636e&#xff0c;\u800c\u4e0d\u662f\u8fde\u63a5\u65ad\u5f00\u4e86&#xff0c;\u8fde\u63a5\u65ad\u5f00\u8fd4\u56de\u7684\u662f-1<br \/>\n        \/\/ \u5c06\u8bfb\u53d6\u5230\u7684\u6570\u636e\u653e\u5165\u8f93\u5165\u7f13\u51b2\u533a&#xff0c;\u5199\u5165\u4e4b\u540e\u5c06\u5199\u504f\u79fb\u5411\u540e\u79fb\u52a8<br \/>\n        _in_buffer.WriteAndPush(buf, ret);<br \/>\n        \/\/ 2.\u8c03\u7528message_callback\u8fdb\u884c\u4e1a\u52a1\u5904\u7406<br \/>\n        if (_in_buffer.ReadableSize() &gt; 0) {<br \/>\n            \/\/ shared_from_this()&#xff1a;\u4ece\u5f53\u524d\u5bf9\u8c61\u81ea\u8eab\u83b7\u53d6\u5230\u4ed6\u7684\u667a\u80fd\u6307\u9488shared_ptr<br \/>\n            \/\/ (\u9700\u8981\u7ee7\u627f\u6a21\u7248\u7c7benable_shared_from_this&lt;Connection&gt;&#xff1a;<br \/>\n            \/\/ \u5b9e\u4f8b\u5316\u667a\u80fd\u6307\u9488\u5bf9\u8c61\u4e4b\u540e\u5185\u90e8\u4f1a\u751f\u6210\u4e00\u4e2a\u5f53\u524d\u5bf9\u8c61\u7684weak_ptr&#xff0c;\u901a\u8fc7weak_ptr\u83b7\u53d6shared_ptr)<br \/>\n            return _message_callback(shared_from_this(), &amp;_in_buffer);<br \/>\n        }<br \/>\n    }<br \/>\n    \/\/ fd\u53ef\u5199\u4e8b\u4ef6\u89e6\u53d1\u540e&#xff0c;\u8c03\u7528\u7684\u51fd\u6570&#xff0c;\u5c06\u53d1\u9001\u7f13\u51b2\u533a\u4e2d\u7684\u6570\u636e\u8fdb\u884c\u53d1\u9001<br \/>\n    void HandleWrite() {<br \/>\n        ssize_t ret &#061; _socket.NonBlockSend(_out_buffer.ReadPosition(),<br \/>\n                                           _out_buffer.ReadableSize());<br \/>\n        if (ret &lt; 0) {<br \/>\n            \/\/ \u53d1\u9001\u9519\u8bef&#xff0c;\u5173\u95ed\u8fde\u63a5<br \/>\n            if (_in_buffer.ReadableSize() &gt; 0) {<br \/>\n                _message_callback(shared_from_this(), &amp;_in_buffer);<br \/>\n            }<br \/>\n            return Release(); \/\/ \u5b9e\u9645\u7684\u5173\u95ed\u91ca\u653e\u64cd\u4f5c<br \/>\n        }<br \/>\n        _out_buffer.MoveReadOffset(ret); \/\/ \u4e00\u5b9a\u4e0d\u80fd\u5fd8\u8bb0&#xff0c;\u79fb\u52a8\u8bfb\u504f\u79fb<br \/>\n        if (_out_buffer.ReadableSize() &#061;&#061; 0) {<br \/>\n            _channel.DisableWrite(); \/\/ \u5173\u95ed\u5199\u4e8b\u4ef6\u76d1\u63a7<br \/>\n            \/\/ \u5982\u679c\u5f53\u524d\u662f\u8fde\u63a5\u5173\u95ed\u72b6\u6001&#xff0c;\u5219\u6709\u6570\u636e&#xff0c;\u53d1\u9001\u5b8c\u6570\u636e\u91ca\u653e\u8fde\u63a5&#xff0c;\u65e0\u6570\u636e&#xff0c;\u76f4\u63a5\u91ca\u653e<br \/>\n            if (_status &#061;&#061; DISCONNECTING) {<br \/>\n                return Release(); \/\/ \u5b9e\u9645\u7684\u5173\u95ed\u91ca\u653e\u64cd\u4f5c<br \/>\n            }<br \/>\n        }<br \/>\n        return;<br \/>\n    }<br \/>\n    \/\/ fd\u6302\u65ad\u4e8b\u4ef6\u89e6\u53d1\u540e<br \/>\n    void HandleClose() {<br \/>\n        \/\/ \u4e00\u65e6\u8fde\u63a5\u6302\u65ad&#xff0c;socket\u5c31\u4ec0\u4e48\u90fd\u5e72\u4e0d\u4e86\u4e86&#xff0c;\u56e0\u6b64\u6709\u6570\u636e\u5148\u5904\u7406\u518d\u5173<br \/>\n        if (_in_buffer.ReadableSize() &gt; 0) {<br \/>\n            _message_callback(shared_from_this(), &amp;_in_buffer);<br \/>\n        }<br \/>\n        return Release(); \/\/ \u5b9e\u9645\u7684\u5173\u95ed\u91ca\u653e\u64cd\u4f5c<br \/>\n    }<br \/>\n    \/\/ fd\u51fa\u9519\u4e8b\u4ef6\u89e6\u53d1\u540e<br \/>\n    void HandleError() { return HandleClose(); }<br \/>\n    \/\/ \u4efb\u4f55\u4e8b\u4ef6\u89e6\u53d1\u540e<br \/>\n    void HandleAnyEvent() {<br \/>\n        \/\/ 1.\u5237\u65b0\u8fde\u63a5\u6d3b\u8dc3\u5ea6&#xff08;\u5ef6\u8fdf\u5b9a\u65f6\u9500\u6bc1\u4efb\u52a1&#xff09;2.\u8c03\u7528\u7ec4\u4ef6\u4f7f\u7528\u8005\u7684\u4efb\u610f\u4e8b\u4ef6\u56de\u8c03<br \/>\n        if (_enable_inactive_release &#061;&#061; true) {<br \/>\n            _loop-&gt;TimerRefresh(_conn_id);<br \/>\n        }<br \/>\n        if (_anyevent_callback) {<br \/>\n            _anyevent_callback(shared_from_this());<br \/>\n        }<br \/>\n    }<\/p>\n<p>    \/\/ \u5bf9\u5916\u63d0\u4f9b\u7684\u63a5\u53e3\u90fd\u8981\u653e\u5728\u7ebf\u7a0b\u5f53\u4e2d\u6765\u8fd0\u884c<\/p>\n<p>    \/\/ \u8fde\u63a5\u83b7\u53d6\u4e4b\u540e&#xff0c;\u6240\u5904\u7684\u72b6\u6001\u4e0b\u8981\u8fdb\u884c\u5404\u79cd\u8bbe\u7f6e&#xff08;\u7ed9channel\u8bbe\u7f6e\u4e8b\u4ef6\u56de\u8c03&#xff0c;\u542f\u52a8\u8bfb\u76d1\u63a7&#xff09;<br \/>\n    void EstablishedInLoop() {<br \/>\n        \/\/ 1.\u4fee\u6539\u8fde\u63a5\u72b6\u6001   2.\u542f\u52a8\u8bfb\u4e8b\u4ef6\u76d1\u63a7    3.\u8c03\u7528\u56de\u8c03\u51fd\u6570<br \/>\n        assert(_status &#061;&#061; CONNECTING); \/\/ \u5f53\u524d\u5fc5\u987b\u5904\u4e8e\u4e0a\u5c42\u534a\u8fde\u63a5\u72b6\u6001<br \/>\n        _status &#061; CONNECTED;<br \/>\n        \/\/ \u4e00\u65e6\u542f\u52a8\u8bfb\u4e8b\u4ef6\u76d1\u63a7&#xff08;\u4e0d\u80fd\u653e\u5728\u6784\u9020\u51fd\u6570\u4e2d&#xff09;&#xff0c;\u5c31\u6709\u53ef\u80fd\u7acb\u5373\u89e6\u53d1\u8bfb\u4e8b\u4ef6&#xff0c;<br \/>\n        \/\/ \u82e5\u8fd9\u65f6\u5019\u542f\u52a8\u4e86\u975e\u6d3b\u8dc3\u8fde\u63a5\u9500\u6bc1&#xff0c;\u5c31\u4f1a\u5237\u65b0\u6d3b\u8dc3\u5ea6&#xff0c;\u82e5\u653e\u5230\u6784\u9020\u51fd\u6570\u4e2d&#xff0c;<br \/>\n        \/\/ \u6b64\u65f6\u8fd8\u6ca1\u6709\u6dfb\u52a0\u5b9a\u65f6\u4efb\u52a1&#xff0c;\u903b\u8f91\u51fa\u73b0\u9519\u8bef&#xff0c;<br \/>\n        \/\/ \u542f\u52a8\u8bfb\u4e8b\u4ef6\u76d1\u63a7\u9700\u8981\u5728&#xff1a;\u8bbe\u7f6e\u4e86\u6d3b\u8dc3\u8fde\u63a5\u662f\u5426\u9500\u6bc1\u4e4b\u540e\u518d\u6267\u884c<br \/>\n        _channel.EnableRead();<br \/>\n        if (_connected_callback)<br \/>\n            _connected_callback(shared_from_this());<br \/>\n    }<br \/>\n    \/\/ \u8fd9\u4e2a\u63a5\u53e3\u624d\u662f\u5b9e\u9645\u7684\u91ca\u653e\u63a5\u53e3<br \/>\n    void ReleaseInLoop() {<br \/>\n        \/\/ 1.\u4fee\u6539\u8fde\u63a5\u72b6\u6001DISCONNECTED<br \/>\n        _status &#061; DISCONNECTED;<br \/>\n        \/\/ 2.\u79fb\u9664\u8fde\u63a5\u7684\u4e8b\u4ef6\u76d1\u63a7<br \/>\n        _channel.Remove();<br \/>\n        \/\/ 3.\u5173\u95ed\u5957\u63a5\u5b57\u63cf\u8ff0\u7b26<br \/>\n        _socket.Close();<br \/>\n        \/\/ 4.\u82e5\u5f53\u524d\u5b9a\u65f6\u5668\u961f\u5217\u4e2d\u8fd8\u6709\u5b9a\u65f6\u9500\u6bc1\u4efb\u52a1&#xff0c;\u5219\u53d6\u6d88\u4efb\u52a1&#xff08;\u9632\u6b62\u91ce\u6307\u9488<br \/>\n        if (_loop-&gt;HasTimer(_conn_id))<br \/>\n            CancelInactiveReleaseInLoop();<br \/>\n        \/\/ 5.\u8c03\u7528\u5173\u95ed\u56de\u8c03\u51fd\u6570<br \/>\n        \/\/ \u7528\u6237\u7ea7&#xff0c;\u5148\u8c03\u7528\u7528\u6237\u7684\u56de\u8c03\u51fd\u6570&#xff1a;<br \/>\n        \/\/ \u907f\u514d\u5148\u79fb\u9664\u670d\u52a1\u5668\u7ba1\u7406\u7684\u8fde\u63a5\u4fe1\u606f&#xff0c;\u5bfc\u81f4connection\u88ab\u91ca\u653e&#xff0c;\u518d\u53bb\u5904\u7406\u4f1a\u51fa\u9519<br \/>\n        if (_closed_callback)<br \/>\n            _closed_callback(shared_from_this());<br \/>\n        \/\/ \u79fb\u9664\u670d\u52a1\u5668\u5185\u90e8\u7ba1\u7406\u7684\u8fde\u63a5\u4fe1\u606f<br \/>\n        if (_server_closed_callback)<br \/>\n            _server_closed_callback(shared_from_this());<br \/>\n        DBG_LOG(&#034;RELEASE CONNECTION %lu&#034;, _conn_id); \/\/ \u6dfb\u52a0\u8fd9\u884c<br \/>\n    }<br \/>\n    \/\/ \u8fd9\u4e2a\u63a5\u53e3\u5e76\u4e0d\u662f\u5b9e\u9645\u7684\u53d1\u9001\u63a5\u53e3&#xff0c;\u800c\u53ea\u662f\u5c06\u6570\u636e\u653e\u5230\u4e86\u53d1\u9001\u7f13\u51b2\u533a&#xff08;\u5b9e\u9645\u5728HandleWrite\u4e2d\u5904\u7406&#xff08;\u5f53\u89e6\u53d1\u53ef\u5199\u4e8b\u4ef6\u540e<br \/>\n    void SendInLoop(Buffer buf) {<br \/>\n        if (_status &#061;&#061; DISCONNECTED)<br \/>\n            return;<br \/>\n        _out_buffer.WriteBufferAndPush(buf);<br \/>\n        if (_channel.Writable() &#061;&#061; false) {<br \/>\n            _channel.EnableWrite();<br \/>\n        }<br \/>\n    }<br \/>\n    \/\/ \u5e76\u975e\u5b9e\u9645\u8fde\u63a5\u91ca\u653e\u64cd\u4f5c&#xff0c;\u9700\u8981\u5224\u65ad\u662f\u5426\u6709\u6570\u636e\u5f85\u53d1\u9001<br \/>\n    void ShutdownInLoop() {<br \/>\n        _status &#061; DISCONNECTING;<br \/>\n        if (_in_buffer.ReadableSize() &gt; 0) {<br \/>\n            if (_message_callback)<br \/>\n                _message_callback(shared_from_this(), &amp;_in_buffer);<br \/>\n        }<br \/>\n        \/\/ \u8981\u4e48\u5c31\u662f\u5199\u5165\u6570\u636e\u7684\u65f6\u5019\u51fa\u9519\u5173\u95ed&#xff0c;\u8981\u4e48\u5c31\u662f\u6ca1\u6709\u5e26\u53d1\u9001\u7684\u6570\u636e&#xff0c;\u76f4\u63a5\u5173\u95ed<br \/>\n        if (_out_buffer.ReadableSize() &gt; 0) {<br \/>\n            if (_channel.Writable() &#061;&#061; false) {<br \/>\n                _channel.EnableWrite();<br \/>\n            }<br \/>\n        }<br \/>\n        if (_out_buffer.ReadableSize() &#061;&#061; 0) {<br \/>\n            Release();<br \/>\n        }<br \/>\n    }<br \/>\n    \/\/ \u542f\u52a8\u975e\u6d3b\u8dc3\u8fde\u63a5\u8d85\u65f6\u91ca\u653e\u89c4\u5219<br \/>\n    void EnableInactiveReleaseInLoop(int sec) {<br \/>\n        \/\/ 1.\u5c06\u5224\u65ad\u6807\u5fd7 _enable_inactive_release\u7f6e\u4e3atrue<br \/>\n        _enable_inactive_release &#061; true;<br \/>\n        \/\/ 2.\u5982\u679c\u5f53\u524d\u5b9a\u65f6\u9500\u6bc1\u4efb\u52a1\u5df2\u5b58\u5728&#xff0c;\u5c31\u5237\u65b0\u5ef6\u8fdf\u4e00\u4e0b<br \/>\n        if (_loop-&gt;HasTimer(_conn_id)) {<br \/>\n            return _loop-&gt;TimerRefresh(_conn_id);<br \/>\n        }<br \/>\n        \/\/ 3.\u4e0d\u5b58\u5728\u5c31\u6dfb\u52a0\u5b9a\u65f6\u9500\u6bc1\u4efb\u52a1<\/p>\n<p>        _loop-&gt;TimerAdd(_conn_id, sec, std::bind(&amp;Connection::Release, this));<br \/>\n    }<\/p>\n<p>    \/\/ \u5173\u95ed\u542f\u52a8\u975e\u6d3b\u8dc3\u8fde\u63a5\u8d85\u65f6\u91ca\u653e\u89c4\u5219<br \/>\n    void CancelInactiveReleaseInLoop() {<br \/>\n        _enable_inactive_release &#061; false;<br \/>\n        if (_loop-&gt;HasTimer(_conn_id)) {<br \/>\n            _loop-&gt;TimerCancel(_conn_id);<br \/>\n        }<br \/>\n    }<br \/>\n    \/\/ \u5207\u6362\u534f\u8bae&#xff0c;\u5347\u7ea7\u534f\u8bae<br \/>\n    void UpgradeInLoop(const Any&amp; context, const ConnectedCallBack&amp; conn,<br \/>\n                       const MessageCallBack&amp; msg, const ClosedCallBack&amp; closed,<br \/>\n                       const AnyEventCallBack&amp; anyevent) {<br \/>\n        _context &#061; context;<br \/>\n        _connected_callback &#061; conn;<br \/>\n        _message_callback &#061; msg;<br \/>\n        _closed_callback &#061; closed;<br \/>\n        _anyevent_callback &#061; anyevent;<br \/>\n    }<\/p>\n<p>public:<br \/>\n    \/\/ \u63a5\u53e3\u8bbe\u8ba1<br \/>\n    Connection(EventLoop* loop, uint64_t conn_id, int sockfd)<br \/>\n        : _conn_id(conn_id), _sockfd(sockfd), _enable_inactive_release(false),<br \/>\n          _loop(loop), _status(CONNECTING), _socket(sockfd),<br \/>\n          _channel(loop, sockfd) {<br \/>\n        _channel.SetCloseCallBack(std::bind(&amp;Connection::HandleClose, this));<br \/>\n        _channel.SetAnyEventCallBack(<br \/>\n            std::bind(&amp;Connection::HandleAnyEvent, this));<br \/>\n        _channel.SetReadCallBack(std::bind(&amp;Connection::HandleRead, this));<br \/>\n        _channel.SetWriteCallBack(std::bind(&amp;Connection::HandleWrite, this));<br \/>\n        _channel.SetErrorCallBack(std::bind(&amp;Connection::HandleError, this));<br \/>\n    }<br \/>\n    ~Connection() { DBG_LOG(&#034;RELEASE CONNECTION: %p&#034;, this); }<br \/>\n    \/\/ \u83b7\u53d6\u7ba1\u7406\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26<br \/>\n    int Fd() { return _sockfd; }<br \/>\n    \/\/ \u83b7\u53d6\u8fde\u63a5ID<br \/>\n    int Id() { return _conn_id; }<br \/>\n    \/\/ \u8fd4\u56de\u72b6\u6001<br \/>\n    ConnStatus Status() { return _status; }<br \/>\n    \/\/ \u662f\u5426\u5904\u4e8e\u8fde\u63a5\u72b6\u6001<br \/>\n    bool Connected() { return (_status &#061;&#061; CONNECTED); }<br \/>\n    \/\/ \u8bbe\u7f6e\u4e0a\u4e0b\u6587 &#8212; \u8fde\u63a5\u5efa\u7acb\u5b8c\u6210\u65f6\u8fdb\u884c\u8c03\u7528&#xff08;CONNECTED)<br \/>\n    void SetContext(const Any&amp; context) { _context &#061; context; }<br \/>\n    \/\/ \u83b7\u53d6\u4e0a\u4e0b\u6587 &#8212; \u8fd4\u56de\u7684\u662f\u6307\u9488<br \/>\n    Any* GetContext() { return &amp;_context; }<\/p>\n<p>    void SetConnectedCallBack(const ConnectedCallBack&amp; cb) {<br \/>\n        _connected_callback &#061; cb;<br \/>\n    }<br \/>\n    void SetMessageCallBack(const MessageCallBack&amp; cb) {<br \/>\n        _message_callback &#061; cb;<br \/>\n    }<br \/>\n    void SetClosedCallBack(const ClosedCallBack&amp; cb) { _closed_callback &#061; cb; }<br \/>\n    void SetAnyEventCallBack(const AnyEventCallBack&amp; cb) {<br \/>\n        _anyevent_callback &#061; cb;<br \/>\n    }<br \/>\n    void SetSvrClosedCallBack(const AnyEventCallBack&amp; cb) {<br \/>\n        _server_closed_callback &#061; cb;<br \/>\n    }<\/p>\n<p>    \/\/ \u8fde\u63a5\u5efa\u7acb\u5c31\u7eea\u540e&#xff0c;\u8fdb\u884cchannel\u56de\u8c03\u8bbe\u7f6e&#xff0c;\u542f\u52a8\u8bfb\u76d1\u63a7<br \/>\n    void Established() {<br \/>\n        _loop-&gt;RunInLoop(std::bind(&amp;Connection::EstablishedInLoop, this));<br \/>\n    }<\/p>\n<p>    \/\/ \u53d1\u9001\u6570\u636e&#xff0c;\u5c06\u6570\u636e\u53d1\u9001\u5230\u7f13\u51b2\u533a&#xff0c;\u542f\u52a8\u5199\u4e8b\u4ef6\u76d1\u63a7<br \/>\n    void Send(const char* data, size_t len) {<br \/>\n        Buffer buf;<br \/>\n        buf.WriteAndPush(data, len);<br \/>\n        _loop-&gt;RunInLoop(<br \/>\n            std::bind(&amp;Connection::SendInLoop, this, std::move(buf)));<br \/>\n    }<br \/>\n    \/\/ \u63d0\u4f9b\u7ed9\u7ec4\u4ef6\u4f7f\u7528\u8005\u7684\u5173\u95ed\u63a5\u53e3, \u5e76\u4e0d\u5b9e\u9645\u5173\u95ed&#xff0c;\u9700\u8981\u5224\u65ad\u662f\u5426\u6709\u6570\u636e\u5f85\u5904\u7406<br \/>\n    void Shutdown() {<br \/>\n        _loop-&gt;RunInLoop(std::bind(&amp;Connection::ShutdownInLoop, this));<br \/>\n    }<\/p>\n<p>    void Release() {<br \/>\n        _loop-&gt;QueueInLoop(std::bind(&amp;Connection::ReleaseInLoop, this));<br \/>\n    }<br \/>\n    \/\/ \u542f\u52a8\u975e\u6d3b\u8dc3\u9500\u6bc1&#xff0c;\u5e76\u5b9a\u4e49\u591a\u957f\u65f6\u95f4\u65e0\u901a\u4fe1&#xff0c;\u5e76\u5b9a\u4e49\u591a\u957f\u65f6\u95f4\u65e0\u901a\u4fe1\u5c31\u662f\u975e\u6d3b\u8dc3&#xff0c;\u6dfb\u52a0\u5b9a\u65f6\u4efb\u52a1<br \/>\n    void EnableInactiveRelease(int sec) {<br \/>\n        _loop-&gt;RunInLoop(<br \/>\n            std::bind(&amp;Connection::EnableInactiveReleaseInLoop, this, sec));<br \/>\n    }<br \/>\n    \/\/ \u53d6\u6d88\u975e\u6d3b\u8dc3\u9500\u6bc1<br \/>\n    void CancelInactiveRelease() {<br \/>\n        _loop-&gt;RunInLoop(<br \/>\n            std::bind(&amp;Connection::CancelInactiveReleaseInLoop, this));<br \/>\n    }<\/p>\n<p>    \/\/ \u5207\u6362\u534f\u8bae &#8212;<br \/>\n    \/\/ \u91cd\u7f6e\u4e0a\u4e0b\u6587\u4ee5\u53ca\u9636\u6bb5\u6027\u5904\u7406\u51fd\u6570&#8211;\u800c\u662f\u8fd9\u4e2a\u63a5\u53e3\u5fc5\u987b\u5728EventLoop\u7ebf\u7a0b\u4e2d\u7acb\u5373\u6267\u884c<br \/>\n    \/\/ \u9632\u5907\u65b0\u7684\u4e8b\u4ef6\u89e6\u53d1\u540e\u5904\u7406\u7684\u65f6\u5019&#xff0c;\u5207\u6362\u4efb\u52a1\u8fd8\u6ca1\u6709\u88ab\u6267\u884c&#xff0c;\u4f1a\u5bfc\u81f4\u6570\u636e\u4f7f\u7528\u539f\u534f\u8bae\u5904\u7406<br \/>\n    void Upgrade(const Any&amp; context, const ConnectedCallBack&amp; conn,<br \/>\n                 const MessageCallBack&amp; msg, const ClosedCallBack&amp; closed,<br \/>\n                 const AnyEventCallBack&amp; anyevent) {<br \/>\n        _loop-&gt;AssertInLoop();<br \/>\n        _loop-&gt;RunInLoop(std::bind(&amp;Connection::UpgradeInLoop, this, context,<br \/>\n                                   conn, msg, closed, anyevent));<br \/>\n    }<br \/>\n}; <\/p>\n<h3 id=\"8.4%20Connection%E6%A8%A1%E5%9D%97%E7%B1%BB%E5%8A%9F%E8%83%BD%E8%81%94%E8%B0%83\"><span style=\"color:#0d0016\">8.4 Connection\u6a21\u5757\u7c7b\u529f\u80fd\u8054\u8c03<\/span><\/h3>\n<p><span style=\"color:#0d0016\">tcp_svr.cpp:<\/span><\/p>\n<p> #include &#034;..\/source\/server.hpp&#034;<\/p>\n<p>\/\/ \u7ba1\u7406\u6240\u6709\u7684\u8fde\u63a5<br \/>\nstd::unordered_map&lt;uint64_t, PtrConnection&gt; _conns;<br \/>\nuint64_t conn_id &#061; 0;<\/p>\n<p>void ConnectionDestroy(const PtrConnection &amp;conn)<br \/>\n{<br \/>\n    _conns.erase(conn-&gt;Id());<br \/>\n}<\/p>\n<p>void OnConnected(const PtrConnection &amp;conn)<br \/>\n{<br \/>\n    DBG_LOG(&#034;NEW CONNECTION: %p&#034;, conn.get());<br \/>\n}<\/p>\n<p>void OnMessage(const PtrConnection &amp;conn, Buffer *buf)<br \/>\n{<br \/>\n    DBG_LOG(&#034;%s&#034;, buf-&gt;ReadPosition());<br \/>\n    buf-&gt;MoveReadOffset(buf-&gt;ReadableSize());<br \/>\n    std::string str &#061; &#034;hi pupu&#034;;<br \/>\n    conn-&gt;Send(str.c_str(), str.size());<br \/>\n}<\/p>\n<p>void Acceptor(EventLoop *loop, Channel *lst_channel)<br \/>\n{<br \/>\n    int fd &#061; lst_channel-&gt;Fd();<br \/>\n    int newfd &#061; accept(fd, nullptr, nullptr);<br \/>\n    if (newfd &lt; 0)<br \/>\n    {<br \/>\n        return;<br \/>\n    }<\/p>\n<p>    conn_id&#043;&#043;;<br \/>\n    \/\/ \u521b\u5efa\u7531\u76d1\u542c\u5957\u63a5\u5b57\u6240\u76d1\u542c\u5230\u7684\u65b0\u8fde\u63a5\u6240\u4ea7\u751f\u7684\u65b0fd\u7684\u65b0\u7684channel<br \/>\n    PtrConnection conn(new Connection(loop, conn_id, newfd));<br \/>\n    conn-&gt;SetMessageCallBack(std::bind(OnMessage, std::placeholders::_1, std::placeholders::_2));<br \/>\n    conn-&gt;SetSvrClosedCallBack(std::bind(ConnectionDestroy, std::placeholders::_1));<br \/>\n    conn-&gt;SetConnectedCallBack(std::bind(OnConnected, std::placeholders::_1));<br \/>\n    conn-&gt;EnableInactiveRelease(10);<br \/>\n    conn-&gt;Established();<br \/>\n    _conns.insert(std::make_pair(conn_id, conn));<br \/>\n}<\/p>\n<p>int main()<br \/>\n{<br \/>\n    srand(time(NULL));<br \/>\n    EventLoop loop;<br \/>\n    Socket lst_sock;<br \/>\n    lst_sock.CreateServer(8500);<br \/>\n    \/\/ \u4e3a\u76d1\u542c\u5957\u63a5\u5b57&#xff0c;\u521b\u5efa\u4e00\u4e2aChannel&#xff0c;\u8fdb\u884c\u4e8b\u4ef6\u7684\u7ba1\u7406&#xff0c;\u4ee5\u53ca\u4e8b\u4ef6\u7684\u5904\u7406<br \/>\n    Channel channel(&amp;loop, lst_sock.Fd());<br \/>\n    channel.SetReadCallBack(std::bind(Acceptor, &amp;loop, &amp;channel)); \/\/ \u56de\u8c03\u4e2d&#xff0c;\u83b7\u53d6\u65b0\u8fde\u63a5&#xff0c;\u4e3a\u65b0\u8fde\u63a5\u521b\u5efaChannel\u5e76\u6dfb\u52a0\u76d1\u63a7<br \/>\n    channel.EnableRead();                                          \/\/ \u542f\u52a8\u76d1\u542c\u5957\u63a5\u5b57\u7684\u8bfb\u4e8b\u4ef6<br \/>\n    while (1)<br \/>\n    {<br \/>\n        loop.Start();<br \/>\n    }<\/p>\n<p>    lst_sock.Close();<\/p>\n<p>    return 0;<br \/>\n} <\/p>\n<p><span style=\"color:#0d0016\">\u6211\u8fd9\u91cc\u6240\u9a8c\u8bc1\u7684\u5b9e\u9a8c\u73b0\u8c61\u662f&#xff0c;\u5ba2\u6237\u7aef\u5411\u670d\u52a1\u5668\u53d1\u90015\u6b21\u6570\u636e&#xff08;5s&#xff09;&#xff0c;\u5c31\u6b7b\u5faa\u73af\u4e0d\u518d\u53d1\u9001\u6d88\u606f&#xff0c;\u670d\u52a1\u5668\u5c31\u4e0d\u518d\u5237\u65b0\u6d3b\u8dc3\u5ea6&#xff0c;10s\u8fc7\u540e\u5c31\u5173\u95ed\u8be5\u8fde\u63a5&#xff0c;<\/span><\/p>\n<p class=\"img-center\"><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"806\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/06\/20250622232643-685891336d68e.png\" width=\"1667\" \/><\/p>\n<p><span style=\"color:#0d0016\">\u901a\u4fe1\u4e00\u6b21\u76f4\u63a5\u5173\u95ed\u8fde\u63a5<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"597\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/06\/20250622232643-68589133f3c98.png\" width=\"1677\" \/><\/p>\n<hr \/>\n<h2 id=\"%E4%B9%9D%E3%80%81Acceptor%E6%A8%A1%E5%9D%97\"><span style=\"color:#0d0016\">\u4e5d\u3001Acceptor\u6a21\u5757<\/span><\/h2>\n<p><span style=\"color:#0d0016\">\u5bf9\u76d1\u542c\u5957\u63a5\u5b57\u8fdb\u884c\u7ba1\u7406<\/span><\/p>\n<h3 id=\"9.1%20Acceptor%E6%A8%A1%E5%9D%97%E7%B1%BB%E5%8A%9F%E8%83%BD%E6%80%9D%E6%83%B3\"><span style=\"color:#0d0016\">9.1 Acceptor\u6a21\u5757\u7c7b\u529f\u80fd\u601d\u60f3<\/span><\/h3>\n<p><span style=\"color:#0d0016\">\u529f\u80fd&#xff1a;<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u00a0 \u00a0 \u00a0 \u00a0 1.\u521b\u5efa\u76d1\u542c\u5957\u63a5\u5b57<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u00a0 \u00a0 \u00a0 \u00a0 2.\u542f\u52a8\u8bfb\u4e8b\u4ef6\u76d1\u63a7<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u00a0 \u00a0 \u00a0 \u00a0 3.\u4e8b\u4ef6\u89e6\u53d1\u540e&#xff0c;\u83b7\u53d6\u65b0\u8fde\u63a5<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u00a0 \u00a0 \u00a0 \u00a0 4.\u8c03\u7528\u65b0\u8fde\u63a5\u83b7\u53d6\u6210\u529f\u540e\u7684\u56de\u8c03\u51fd\u6570<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 4.\u4e3a\u65b0\u8fde\u63a5\u521b\u5efaConnection\u8fdb\u884c\u7ba1\u7406&#xff0c;\u8fd9\u4e00\u6b65\u4e0d\u662fAcceptor\u6a21\u5757\u64cd\u4f5c&#xff0c;\u5e94\u8be5\u662f\u670d\u52a1\u5668\u6a21\u5757<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u56e0\u4e3aAcceptor\u6a21\u5757\u53ea\u8fdb\u884c\u76d1\u542c\u8fde\u63a5\u7684\u7ba1\u7406&#xff0c;\u56e0\u6b64\u83b7\u53d6\u5230\u65b0\u8fde\u63a5\u7684\u63cf\u8ff0\u7b26\u540e&#xff0c;\u5bf9\u4e8e\u65b0\u8fde\u63a5\u63cf\u8ff0\u7b26\u5982\u4f55\u5904\u7406\u5176\u5b9e\u5e76\u4e0d\u5173\u5fc3<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u5bf9\u4e8e\u65b0\u8fde\u63a5\u5982\u4f55\u5904\u7406&#xff0c;\u5e94\u8be5\u662f\u670d\u52a1\u5668\u6a21\u5757\u6765\u7ba1\u7406\u7684\u3002<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u670d\u52a1\u5668\u6a21\u5757&#xff0c;\u5b9e\u73b0\u4e86\u4e00\u4e2a\u5bf9\u4e8e\u65b0\u8fde\u63a5\u63cf\u8ff0\u7b26\u5904\u7406\u7684\u51fd\u6570&#xff0c;\u5c06\u8fd9\u4e2a\u51fd\u6570\u8bbe\u7f6e\u7ed9Acceptor\u6a21\u5757\u7684\u56de\u8c03\u51fd\u6570<\/span><\/p>\n<h3 id=\"9.2%20Acceptor%E6%A8%A1%E5%9D%97%E7%B1%BB%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0\"><span style=\"color:#0d0016\">9.2 Acceptor\u6a21\u5757\u7c7b\u8bbe\u8ba1\u4e0e\u5b9e\u73b0<\/span><\/h3>\n<p>class Acceptor {<br \/>\nprivate:<br \/>\n    Socket _socket;   \/\/ \u7528\u4e8e\u521b\u5efa\u76d1\u542c\u5957\u63a5\u5b57<br \/>\n    EventLoop* _loop; \/\/ \u7528\u4e8e\u5bf9\u76d1\u542c\u5957\u63a5\u5b57\u8fdb\u884c\u4e8b\u4ef6\u76d1\u63a7<br \/>\n    Channel _channel; \/\/ \u7528\u4e8e\u5bf9\u76d1\u542c\u5957\u63a5\u5b57\u8fdb\u884c\u4e8b\u4ef6\u7ba1\u7406<br \/>\n    using AcceptCallBack &#061; std::function&lt;void(int)&gt;;<br \/>\n    AcceptCallBack _accept_callback;<\/p>\n<p>private:<br \/>\n    \/\/ \u76d1\u542c\u5957\u63a5\u5b57\u7684\u8bfb\u4e8b\u4ef6\u56de\u8c03\u51fd\u6570&#xff0c;\u83b7\u53d6\u65b0\u8fde\u63a5&#xff0c;\u8c03\u7528_accept_callback\u56de\u8c03\u51fd\u6570\u8fdb\u884c\u65b0\u8fde\u63a5\u7684\u5904\u7406<br \/>\n    void HandleRead() {<br \/>\n        int newfd &#061; _socket.Accept();<br \/>\n        if (newfd &lt; 0) {<br \/>\n            return;<br \/>\n        }<br \/>\n        if (_accept_callback)<br \/>\n            _accept_callback(newfd);<br \/>\n    }<br \/>\n    int CreateServer(int port) {<br \/>\n        bool ret &#061; _socket.CreateServer(port);<br \/>\n        assert(ret &#061;&#061; true);<br \/>\n        return _socket.Fd();<br \/>\n    }<\/p>\n<p>public:<br \/>\n    \/\/ \u4e0d\u80fd\u5c06\u542f\u52a8\u8bfb\u4e8b\u4ef6\u76d1\u63a7&#xff0c;\u653e\u5230\u6784\u9020\u51fd\u6570\u4e2d&#xff0c;\u5fc5\u987b\u5728\u8bbe\u7f6e\u56de\u8c03\u51fd\u6570\u540e&#xff0c;\u518d\u53bb\u542f\u52a8<br \/>\n    \/\/ \u5426\u5219\u6709\u53ef\u80fd\u9020\u6210\u542f\u52a8\u76d1\u63a7\u540e&#xff0c;\u7acb\u5373\u6709\u4e8b\u4ef6&#xff0c;\u5904\u7406\u7684\u65f6\u5019&#xff0c;\u56de\u8c03\u51fd\u6570\u8fd8\u6ca1\u6709\u8bbe\u7f6e&#xff0c;\u65b0\u8fde\u63a5\u5f97\u4e0d\u5230\u5904\u7406&#xff0c;\u4e14\u8d44\u6e90\u6cc4\u9732<br \/>\n    Acceptor(EventLoop* loop, int port)<br \/>\n        : _socket(CreateServer(port)), _loop(loop),<br \/>\n          _channel(loop, _socket.Fd()) {<br \/>\n        _channel.SetReadCallBack(std::bind(&amp;Acceptor::HandleRead, this));<br \/>\n    }<br \/>\n    void SetAcceptCallBack(const AcceptCallBack&amp; cb) { _accept_callback &#061; cb; }<br \/>\n    void Listen() { _channel.EnableRead(); }<br \/>\n};<\/p>\n<h3 id=\"9.3%20Acceptor%E6%A8%A1%E5%9D%97%E7%B1%BB%E5%8A%9F%E8%83%BD%E8%81%94%E8%B0%83\"><span style=\"color:#0d0016\">9.3 Acceptor\u6a21\u5757\u7c7b\u529f\u80fd\u8054\u8c03<\/span><\/h3>\n<p><span style=\"color:#0d0016\">tcp_svr.cpp<\/span><\/p>\n<p>#include &#034;..\/source\/server.hpp&#034;<\/p>\n<p>\/\/ \u7ba1\u7406\u6240\u6709\u7684\u8fde\u63a5<br \/>\nstd::unordered_map&lt;uint64_t, PtrConnection&gt; _conns;<br \/>\nuint64_t conn_id &#061; 0;<br \/>\nEventLoop loop;<\/p>\n<p>void ConnectionDestroy(const PtrConnection &amp;conn)<br \/>\n{<br \/>\n    _conns.erase(conn-&gt;Id());<br \/>\n}<\/p>\n<p>void OnConnected(const PtrConnection &amp;conn)<br \/>\n{<br \/>\n    DBG_LOG(&#034;NEW CONNECTION: %p&#034;, conn.get());<br \/>\n}<\/p>\n<p>void OnMessage(const PtrConnection &amp;conn, Buffer *buf)<br \/>\n{<br \/>\n    DBG_LOG(&#034;%s&#034;, buf-&gt;ReadPosition());<br \/>\n    buf-&gt;MoveReadOffset(buf-&gt;ReadableSize());<br \/>\n    std::string str &#061; &#034;\u6211\u6536\u5230\u4e86\u5ba2\u6237\u7aef\u53d1\u9001\u7684\u6d88\u606f&#034;;<br \/>\n    conn-&gt;Send(str.c_str(), str.size());<br \/>\n    conn-&gt;Shutdown(); \/\/ \u901a\u4fe1\u4e00\u6b21\u76f4\u63a5\u5173\u95ed\u8fde\u63a5<br \/>\n}<\/p>\n<p>void NewConnection(int fd)<br \/>\n{<br \/>\n    conn_id&#043;&#043;;<br \/>\n    PtrConnection conn(new Connection(&amp;loop, conn_id, fd));<br \/>\n    conn-&gt;SetMessageCallBack(std::bind(OnMessage, std::placeholders::_1, std::placeholders::_2));<br \/>\n    conn-&gt;SetSvrClosedCallBack(std::bind(ConnectionDestroy, std::placeholders::_1));<br \/>\n    conn-&gt;SetConnectedCallBack(std::bind(OnConnected, std::placeholders::_1));<br \/>\n    conn-&gt;EnableInactiveRelease(10);<br \/>\n    conn-&gt;Established();<br \/>\n    _conns.insert(std::make_pair(conn_id, conn));<br \/>\n}<\/p>\n<p>int main()<br \/>\n{<br \/>\n    srand(time(NULL));<\/p>\n<p>    Acceptor acceptor(&amp;loop, 8500);<\/p>\n<p>    acceptor.SetAcceptCallBack(std::bind(NewConnection, std::placeholders::_1)); \/\/ \u8bbe\u7f6e\u5b8c\u56de\u8c03\u51fd\u6570<br \/>\n    acceptor.Listen();                                                           \/\/ \u5f00\u59cb\u76d1\u542c<br \/>\n    while (1)<br \/>\n    {<br \/>\n        loop.Start();<br \/>\n    }<\/p>\n<p>    return 0;<br \/>\n} <\/p>\n<h2 id=\"%E5%8D%81%E3%80%81LoopThread%EF%BC%88%E5%BE%AA%E7%8E%AF%E7%BA%BF%E7%A8%8B%EF%BC%89%E6%A8%A1%E5%9D%97\"><span style=\"color:#0d0016\">\u5341\u3001LoopThread&#xff08;\u5faa\u73af\u7ebf\u7a0b&#xff09;\u6a21\u5757<\/span><\/h2>\n<h3 id=\"10.1%20LoopThread%E6%A8%A1%E5%9D%97%E7%B1%BB%E5%8A%9F%E8%83%BD%E6%80%9D%E6%83%B3\"><span style=\"color:#0d0016\">10.1 LoopThread\u6a21\u5757\u7c7b\u529f\u80fd\u601d\u60f3<\/span><\/h3>\n<p><span style=\"color:#0d0016\">\u76ee\u6807\u4ee5\u53ca\u529f\u80fd&#xff1a;\u5c06EventLoop\u6a21\u5757\u548c\u7ebf\u7a0b\u6574\u5408\u8d77\u6765<\/span><\/p>\n<p><span style=\"color:#0d0016\">EventLoop\u6a21\u5757\u4e0e\u7ebf\u7a0b\u662f\u4e00\u4e00\u5bf9\u5e94\u7684\u3002<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u5728\u6784\u9020EventLoop\u6a21\u5757\u5b9e\u4f8b\u65f6&#xff0c;\u4f1a\u9884\u5148\u521d\u59cb\u5316_thread_id\u5b57\u6bb5\u3002\u5f53\u6267\u884c\u64cd\u4f5c\u65f6&#xff0c;\u7cfb\u7edf\u901a\u8fc7\u6bd4\u8f83\u5f53\u524d\u7ebf\u7a0bID\u4e0eEventLoop\u6a21\u5757\u5b58\u50a8\u7684thread_id\u6765\u5224\u65ad\u662f\u5426\u8fd0\u884c\u5728\u5bf9\u5e94\u7ebf\u7a0b\u4e2d&#xff1a;\u4e24\u8005\u4e00\u81f4\u5219\u8868\u660e\u5f53\u524d\u5904\u4e8eEventLoop\u7ebf\u7a0b&#xff0c;\u4e0d\u4e00\u81f4\u5219\u8bf4\u660e\u5904\u4e8e\u5176\u4ed6\u7ebf\u7a0b\u3002<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u542b\u4e49&#xff1a;EventLoop\u6a21\u5757\u5728\u5b9e\u4f8b\u5316\u5bf9\u8c61\u7684\u65f6\u5019&#xff0c;\u5fc5\u987b\u5728\u7ebf\u7a0b\u5185\u90e8<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u5728\u5b9e\u4f8b\u5316EventLoop\u5bf9\u8c61\u65f6&#xff0c;\u7cfb\u7edf\u4f1a\u81ea\u52a8\u8bbe\u7f6e\u5176\u6240\u5c5e\u7684\u7ebf\u7a0bID\u3002 \u82e5\u5148\u521b\u5efa\u591a\u4e2aEventLoop\u5bf9\u8c61\u518d\u521b\u5efa\u7ebf\u7a0b\u5e76\u91cd\u65b0\u5206\u914dthread_id&#xff0c;\u4f1a\u5bfc\u81f4\u4ece\u5bf9\u8c61\u6784\u9020\u5230thread_id\u91cd\u7f6e\u671f\u95f4\u5b58\u5728\u4e0d\u53ef\u63a7\u72b6\u6001\u3002 \u4e3a\u6b64&#xff0c;\u5fc5\u987b\u5148\u521b\u5efa\u7ebf\u7a0b&#xff0c;\u7136\u540e\u5728\u5404\u7ebf\u7a0b\u7684\u5165\u53e3\u51fd\u6570\u4e2d\u5b9e\u4f8b\u5316\u5bf9\u5e94\u7684EventLoop\u5bf9\u8c61\u3002<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u6574\u5408\u601d\u60f3&#xff1a;<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u00a0 \u00a0 \u00a0 \u00a0 1.\u521b\u5efa\u7ebf\u7a0b<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u00a0 \u00a0 \u00a0 \u00a0 2.\u5728\u7ebf\u7a0b\u4e2d\u5b9e\u4f8b\u5316EvemtLoop\u5bf9\u8c61<\/span><\/p>\n<p><span style=\"color:#be191c\">\u529f\u80fd&#xff1a;\u53ef\u4ee5\u5411\u5916\u90e8\u8fd4\u56de\u6240\u5b9e\u4f8b\u5316\u7684EventLoop<\/span><\/p>\n<h3 id=\"10.2%20LoopThread%E6%A8%A1%E5%9D%97%E7%B1%BB%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0\"><span style=\"color:#0d0016\">10.2 LoopThread\u6a21\u5757\u7c7b\u8bbe\u8ba1\u4e0e\u5b9e\u73b0<\/span><\/h3>\n<p>#include &lt;condition_variable&gt;<br \/>\nclass LoopThread<br \/>\n{<br \/>\nprivate:<br \/>\n    \/\/ \u7528\u4e8e\u5b9e\u73b0_loop\u83b7\u53d6\u7684\u540c\u6b65\u5173\u7cfb&#xff1a;\u907f\u514d\u7ebf\u7a0b\u521b\u5efa\u4e86&#xff0c;\u4f46\u662f_loop\u8fd8\u6ca1\u6709\u5b9e\u4f8b\u5316\u5b8c\u6210\u5c31\u83b7\u53d6loop<br \/>\n    std::mutex _mutex;             \/\/ \u4e92\u65a5\u9501<br \/>\n    std::condition_variable _cond; \/\/ \u6761\u4ef6\u53d8\u91cf<\/p>\n<p>    std::thread _loop_thread; \/\/ EventLoop\u5bf9\u5e94\u7684\u7ebf\u7a0b<br \/>\n    EventLoop *_loop;         \/\/ \u5148\u5b9a\u4e49\u4e00\u4e2aEventLoop\u6307\u9488&#xff0c;\u5728\u7ebf\u7a0b\u5185\u90e8\u5b9e\u4f8b\u5316<br \/>\n    \/\/ \u5b9e\u4f8b\u5316 EventLoop \u5bf9\u8c61&#xff0c;\u5524\u9192_cond\u4e0a\u6709\u53ef\u80fd\u963b\u585e\u7684\u7ebf\u7a0b&#xff0c;\u5e76\u4e14\u5f00\u59cb\u8fd0\u884cEventLoop\u6a21\u5757\u7684\u529f\u80fd<br \/>\n    void ThreadEntry()<br \/>\n    {<br \/>\n        EventLoop loop;<br \/>\n        {<br \/>\n            std::unique_lock&lt;std::mutex&gt; lock(_mutex);<br \/>\n            _loop &#061; &amp;loop;<br \/>\n            _cond.notify_all();<br \/>\n        }<br \/>\n        loop.Start();<br \/>\n    }<\/p>\n<p>public:<br \/>\n    \/\/ \u521b\u5efa\u7ebf\u7a0b&#xff0c;\u8bbe\u5b9a\u7ebf\u7a0b\u5165\u53e3\u51fd\u6570<br \/>\n    LoopThread() : _loop(NULL), _loop_thread(std::thread(&amp;LoopThread::ThreadEntry, this))<br \/>\n    {<br \/>\n    }<br \/>\n    \/\/ \u672a\u6765\u8fd4\u56de\u7ebf\u7a0b\u5bf9\u5e94\u7684EventLoop\u5bf9\u8c61\u6307\u9488&#xff0c;\u5c06\u67d0\u4e2a\u8fde\u63a5\u548c\u8be5loop\u5173\u8054\u8d77\u6765<br \/>\n    EventLoop *GetLoop()<br \/>\n    {<br \/>\n        EventLoop *loop &#061; NULL;<br \/>\n        {<br \/>\n            std::unique_lock&lt;std::mutex&gt; lock(_mutex);<br \/>\n            _cond.wait(lock, [&amp;]()<br \/>\n                       { return _loop !&#061; nullptr; }); \/\/ loop\u4e3a\u7a7a\u5c31\u4e00\u76f4\u963b\u585e<br \/>\n            loop &#061; _loop;<br \/>\n            return loop;<br \/>\n        }<br \/>\n    }<br \/>\n}; <\/p>\n<h3 id=\"10.3%20LoopThread%E6%A8%A1%E5%9D%97%E7%B1%BB%E8%B0%83%E8%AF%95\"><span style=\"color:#0d0016\">10.3 LoopThread\u6a21\u5757\u7c7b\u8c03\u8bd5<\/span><\/h3>\n<p>#include &#034;..\/source\/server.hpp&#034;<\/p>\n<p>\/\/ \u7ba1\u7406\u6240\u6709\u7684\u8fde\u63a5<br \/>\nstd::unordered_map&lt;uint64_t, PtrConnection&gt; _conns;<br \/>\nuint64_t conn_id &#061; 0;<br \/>\nEventLoop base_loop;<br \/>\nstd::vector&lt;LoopThread&gt; threads(2); \/\/ \u4e24\u4e2a\u7ebf\u7a0b<br \/>\nint next_loop &#061; 0;<\/p>\n<p>void ConnectionDestroy(const PtrConnection &amp;conn)<br \/>\n{<br \/>\n    _conns.erase(conn-&gt;Id());<br \/>\n}<\/p>\n<p>void OnConnected(const PtrConnection &amp;conn)<br \/>\n{<br \/>\n    DBG_LOG(&#034;NEW CONNECTION: %p&#034;, conn.get());<br \/>\n}<\/p>\n<p>void OnMessage(const PtrConnection &amp;conn, Buffer *buf)<br \/>\n{<br \/>\n    DBG_LOG(&#034;%s&#034;, buf-&gt;ReadPosition());<br \/>\n    buf-&gt;MoveReadOffset(buf-&gt;ReadableSize());<br \/>\n    std::string str &#061; &#034;\u6211\u6536\u5230\u4e86\u5ba2\u6237\u7aef\u53d1\u9001\u7684\u6d88\u606f&#034;;<br \/>\n    conn-&gt;Send(str.c_str(), str.size());<br \/>\n    conn-&gt;Shutdown(); \/\/ \u901a\u4fe1\u4e00\u6b21\u76f4\u63a5\u5173\u95ed\u8fde\u63a5<br \/>\n}<\/p>\n<p>void NewConnection(int fd)<br \/>\n{<br \/>\n    conn_id&#043;&#043;;<br \/>\n    next_loop &#061; (next_loop &#043; 1) % 2;<\/p>\n<p>    PtrConnection conn(new Connection(threads[next_loop].GetLoop(), conn_id, fd));<br \/>\n    conn-&gt;SetMessageCallBack(std::bind(OnMessage, std::placeholders::_1, std::placeholders::_2));<br \/>\n    conn-&gt;SetSvrClosedCallBack(std::bind(ConnectionDestroy, std::placeholders::_1));<br \/>\n    conn-&gt;SetConnectedCallBack(std::bind(OnConnected, std::placeholders::_1));<br \/>\n    conn-&gt;EnableInactiveRelease(10);<br \/>\n    conn-&gt;Established();<br \/>\n    _conns.insert(std::make_pair(conn_id, conn));<br \/>\n    DBG_LOG(&#034;NEW CONNECTION&#8230;&#034;);<br \/>\n}<\/p>\n<p>int main()<br \/>\n{<br \/>\n    srand(time(NULL));<\/p>\n<p>    Acceptor acceptor(&amp;base_loop, 8500);<\/p>\n<p>    acceptor.SetAcceptCallBack(std::bind(NewConnection, std::placeholders::_1)); \/\/ \u8bbe\u7f6e\u5b8c\u56de\u8c03\u51fd\u6570<br \/>\n    acceptor.Listen();                                                           \/\/ \u5f00\u59cb\u76d1\u542c<br \/>\n    while (1)<br \/>\n    {<br \/>\n        base_loop.Start();<br \/>\n    }<\/p>\n<p>    return 0;<br \/>\n} <\/p>\n<h2 id=\"%E5%8D%81%E4%B8%80%E3%80%81LoopThreadPool%E6%A8%A1%E5%9D%97\"><span style=\"color:#0d0016\">\u5341\u4e00\u3001LoopThreadPool\u6a21\u5757<\/span><\/h2>\n<p><span style=\"color:#0d0016\">\u9488\u5bf9LoopThread\u8bbe\u8ba1\u4e00\u4e2a\u7ebf\u7a0b\u6c60&#xff1a;<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u00a0 \u00a0 \u00a0 \u00a0 LoopThreadPool\u6a21\u5757&#xff1a;\u5bf9\u4e8e\u6240\u6709\u7684LoopThread\u8fdb\u884c\u7ba1\u7406\u4ee5\u53ca\u5206\u914d<\/span><\/p>\n<h3 id=\"11.1%20LoopThreadPool%E6%A8%A1%E5%9D%97%E7%B1%BB%E5%8A%9F%E8%83%BD%E6%80%9D%E6%83%B3\"><span style=\"color:#0d0016\">11.1 LoopThreadPool\u6a21\u5757\u7c7b\u529f\u80fd\u601d\u60f3<\/span><\/h3>\n<p><span style=\"color:#0d0016\">\u529f\u80fd&#xff1a;<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a01.\u7ebf\u7a0b\u6570\u91cf\u53ef\u914d\u7f6e&#xff08;0\u4e2a\u6216\u591a\u4e2a&#xff09;<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u00a0 \u00a0 \u00a0 \u00a0 \u6ce8\u610f\u4e8b\u9879&#xff1a;\u00a0 \u5728\u670d\u52a1\u5668\u4e2d&#xff0c;\u4e3b\u4eceReactor\u6a21\u578b\u662f\u4e3b\u7ebf\u7a0b\u53ea\u8d1f\u8d23\u65b0\u7ebf\u7a0b\u83b7\u53d6&#xff0c;\u4ece\u5c5e\u7ebf\u7a0b\u8d1f\u8d23\u65b0\u8fde\u63a5\u7684\u4e8b\u4ef6\u76d1\u63a7\u53ca\u5904\u7406<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u00a0 \u00a0 \u00a0 \u5f53\u524d\u7ebf\u7a0b\u6c60\u53ef\u80fd\u51fa\u73b0\u4ece\u5c5e\u7ebf\u7a0b\u6570\u91cf\u4e3a\u96f6\u7684\u60c5\u51b5&#xff0c;\u5373\u5b9e\u73b0\u5355Reactor\u670d\u52a1\u5668\u6a21\u5f0f&#xff0c;\u6b64\u65f6\u4e00\u4e2a\u7ebf\u7a0b\u65e2\u8d1f\u8d23\u83b7\u53d6\u8fde\u63a5&#xff0c;\u53c8\u8d1f\u8d23\u5904\u7406\u8fde\u63a5\u3002<\/span><\/p>\n<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0<span style=\"color:#0d0016\"> 2.\u5bf9\u6240\u6709\u7684\u7ebf\u7a0b\u8fdb\u884c\u7ba1\u7406&#xff0c;\u5176\u5b9e\u5c31\u662f\u7ba1\u74060\u4e2a\u6216\u591a\u4e2aLoopThread\u5bf9\u8c61<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u00a0 \u00a0 \u00a0 \u00a0 3.\u63d0\u4f9b\u7ebf\u7a0b\u5206\u914d\u7684\u5bf9\u8c61<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u00a0 \u00a0 \u00a0 \u00a0 \u5f53\u4e3b\u7ebf\u7a0b\u83b7\u53d6\u4e86\u4e00\u4e2a\u65b0\u8fde\u63a5&#xff0c;\u9700\u8981\u5c06\u8be5\u8fde\u63a5\u5206\u914d\u7ed9\u4ece\u5c5e\u7ebf\u7a0b\u8fdb\u884c\u4e8b\u4ef6\u76d1\u63a7\u548c\u5904\u7406\u3002<\/span><span style=\"color:#0d0016\">\u00a0 \u00a0 \u00a0 \u00a0<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u5982\u679c\u6ca1\u6709\u4ece\u5c5e\u7ebf\u7a0b&#xff0c;\u4efb\u52a1\u5c06\u76f4\u63a5\u4ea4\u7531\u4e3b\u7ebf\u7a0b\u7684EventLoop\u5904\u7406\u3002\u82e5\u5b58\u5728\u591a\u4e2a\u4ece\u5c5e\u7ebf\u7a0b&#xff0c;\u5219\u91c7\u7528\u8f6e\u8be2\u8c03\u5ea6&#xff08;RR&#xff09;\u673a\u5236\u8fdb\u884c\u7ebf\u7a0b\u5206\u914d&#xff1a;\u901a\u8fc7\u83b7\u53d6\u5bf9\u5e94\u7ebf\u7a0b\u7684EventLoop\u5e76\u7ed1\u5b9a\u5230\u76f8\u5e94\u7684Connection\u4e0a\u5b9e\u73b0\u8d1f\u8f7d\u5747\u8861\u3002<\/span><\/p>\n<h3 id=\"11.2%C2%A0LoopThreadPool%E6%A8%A1%E5%9D%97%E7%B1%BB%E8%AE%BE%E8%AE%A1\"><span style=\"color:#0d0016\">11.2\u00a0<\/span><span style=\"color:#0d0016\">LoopThreadPool\u6a21\u5757\u7c7b\u8bbe\u8ba1<\/span><\/h3>\n<p>class LoopThreadPool<br \/>\n{<br \/>\nprivate:<br \/>\n    int _thread_count; \/\/ \u4ece\u5c5e\u7ebf\u7a0b\u7684\u6570\u91cf<br \/>\n    int _next_loop_idx;<br \/>\n    EventLoop *_baseloop;               \/\/ \u4e3bEventLoop&#xff0c;\u8fd0\u884c\u5728\u4e3b\u7ebf\u7a0b&#xff0c;\u4ece\u5c5e\u7ebf\u7a0b\u6570\u91cf\u4e3a0&#xff0c;\u5219\u6240\u6709\u64cd\u4f5c\u90fd\u5728_baseloop\u4e2d\u8fdb\u884c<br \/>\n    std::vector&lt;LoopThread *&gt; _threads; \/\/ \u4fdd\u5b58\u6240\u6709\u7684LoopThread\u5bf9\u8c61<br \/>\n    std::vector&lt;EventLoop *&gt; _loops;\/\/\u4ece\u5c5e\u7ebf\u7a0b\u6570\u91cf\u5927\u4e8e0\u5219\u4ece_loops\u4e2d\u8fdb\u884c\u7ebf\u7a0bEventLoop\u5206\u914d<br \/>\n    public:<br \/>\n    LoopThreadPool();<br \/>\n    \/\/\u7ebf\u7a0b\u6570\u91cf\u7684\u8bbe\u7f6e<br \/>\n    void SetThreadCount(int count);<br \/>\n    \/\/\u521b\u5efa\u6240\u6709\u7684\u4ece\u5c5eReactor\u7ebf\u7a0b<br \/>\n    void Start();<br \/>\n    EventLoop *NextLoop();<br \/>\n};<\/p>\n<h3 id=\"11.3%20LoopThreadPool%E6%A8%A1%E5%9D%97%E7%B1%BB%E5%AE%9E%E7%8E%B0\"><span style=\"color:#0d0016\">11.3 LoopThreadPool\u6a21\u5757\u7c7b\u5b9e\u73b0<\/span><\/h3>\n<p>class LoopThreadPool {<br \/>\nprivate:<br \/>\n    int _thread_count; \/\/ \u4ece\u5c5e\u7ebf\u7a0b\u7684\u6570\u91cf<br \/>\n    int _next_loop_idx;<br \/>\n    EventLoop*<br \/>\n        _baseloop; \/\/ \u4e3bEventLoop&#xff0c;\u8fd0\u884c\u5728\u4e3b\u7ebf\u7a0b&#xff0c;\u4ece\u5c5e\u7ebf\u7a0b\u6570\u91cf\u4e3a0&#xff0c;\u5219\u6240\u6709\u64cd\u4f5c\u90fd\u5728_baseloop\u4e2d\u8fdb\u884c<br \/>\n    std::vector&lt;LoopThread*&gt; _threads; \/\/ \u4fdd\u5b58\u6240\u6709\u7684LoopThread\u5bf9\u8c61<br \/>\n    std::vector&lt;EventLoop*&gt;<br \/>\n        _loops; \/\/ \u4ece\u5c5e\u7ebf\u7a0b\u6570\u91cf\u5927\u4e8e0\u5219\u4ece_loops\u4e2d\u8fdb\u884c\u7ebf\u7a0bEventLoop\u5206\u914d<br \/>\npublic:<br \/>\n    LoopThreadPool(EventLoop* baseloop)<br \/>\n        : _thread_count(0), _next_loop_idx(0), _baseloop(baseloop) {}<br \/>\n    \/\/ \u7ebf\u7a0b\u6570\u91cf\u7684\u8bbe\u7f6e<br \/>\n    void SetThreadCount(int count) { _thread_count &#061; count; }<br \/>\n    \/\/ \u521b\u5efa\u6240\u6709\u7684\u4ece\u5c5eReactor\u7ebf\u7a0b<br \/>\n    void Create() {<br \/>\n        if (_thread_count &gt; 0) {<br \/>\n            _threads.resize(_thread_count);<br \/>\n            _loops.resize(_thread_count);<br \/>\n            for (int i &#061; 0; i &lt; _thread_count; i&#043;&#043;) {<br \/>\n                _threads[i] &#061; new LoopThread();<br \/>\n                _loops[i] &#061; _threads[i]-&gt;GetLoop();<br \/>\n            }<br \/>\n        }<br \/>\n    }<br \/>\n    EventLoop* NextLoop() {<br \/>\n        if (_thread_count &#061;&#061; 0) {<br \/>\n            return _baseloop;<br \/>\n        }<br \/>\n        _next_loop_idx &#061; (_next_loop_idx &#043; 1) % _thread_count;<br \/>\n        return _loops[_next_loop_idx];<br \/>\n    }<br \/>\n}; <\/p>\n<h3 id=\"11.4%20LoopThreadPool%E6%A8%A1%E5%9D%97%E7%B1%BB%E8%B0%83%E8%AF%95\"><span style=\"color:#0d0016\">11.4 LoopThreadPool\u6a21\u5757\u7c7b\u8c03\u8bd5<\/span><\/h3>\n<p><span style=\"color:#0d0016\">\u5bf9tcp_svr.cpp\u505a\u4e00\u4e9b\u4fee\u6539<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"981\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/06\/20250622232644-685891346493f.png\" width=\"1230\" \/><\/p>\n<p><span style=\"color:#0d0016\">\u672c\u9879\u76ee\u7684\u4e3b\u8981\u529f\u80fd\u6a21\u5757\u5df2\u57fa\u672c\u5f00\u53d1\u5b8c\u6210&#xff0c;\u63a5\u4e0b\u6765\u7684TcpServer\u6a21\u5757\u662f\u6700\u7ec8\u7684\u4e00\u4e2a\u6574\u5408\u6a21\u5757<\/span><\/p>\n<h2 id=\"%E5%8D%81%E4%BA%8C%E3%80%81TcpServer%E6%A8%A1%E5%9D%97\"><span style=\"color:#0d0016\">\u5341\u4e8c\u3001TcpServer\u6a21\u5757<\/span><\/h2>\n<h3 id=\"12.1%20TcpServer%E6%A8%A1%E5%9D%97%E7%B1%BB%E5%8A%9F%E8%83%BD%E6%80%9D%E6%83%B3\"><span style=\"color:#0d0016\">12.1 TcpServer\u6a21\u5757\u7c7b\u529f\u80fd\u601d\u60f3<\/span><\/h3>\n<p><span style=\"color:#0d0016\">TcpServer\u6a21\u5757&#xff1a;\u5bf9\u6240\u6709\u6a21\u5757\u7684\u6574\u5408&#xff0c;\u901a\u8fc7\u5bf9TcpServer\u6a21\u5757\u5b9e\u4f8b\u5316\u7684\u5bf9\u8c61&#xff0c;\u53ef\u4ee5\u975e\u5e38\u7b80\u5355\u7684\u5b8c\u6210\u4e00\u4e2a\u670d\u52a1\u5668\u7684\u642d\u5efa<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u7ba1\u7406&#xff1a;<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a01.Acceptor\u5bf9\u8c61&#xff1a;\u521b\u5efa\u4e00\u4e2a\u76d1\u542c\u5957\u63a5\u5b57<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a02.EventLoop\u5bf9\u8c61&#xff1a;baseloop\u5bf9\u8c61&#xff0c;\u5b9e\u73b0\u5bf9\u76d1\u542c\u5957\u63a5\u5b57\u7684\u4e8b\u4ef6\u76d1\u63a7&#xff08;\u4e00\u65e6\u6709\u65b0\u7684\u4e8b\u4ef6&#xff0c;\u83b7\u53d6\u4e86\u65b0\u8fde\u63a5\u4f7f\u7528Connection\u8fdb\u884c\u7ba1\u7406&#xff09;<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u00a0 \u00a0 \u00a0 \u00a0 3.std::vector&lt;uint64_t,<\/span>\u00a0<span style=\"color:#0d0016\">PtrConnection&gt; conns&#xff1a;\u5b9e\u73b0\u5bf9\u65b0\u5efa\u8fde\u63a5\u7684\u7ba1\u7406<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u00a0 \u00a0 \u00a0 \u00a0 4.LoopThreadPool\u5bf9\u8c61&#xff0c;\u521bloop\u7ebf\u7a0b\u6c60&#xff0c;\u5bf9\u65b0\u5efa\u8fde\u63a5\u8fdb\u884c\u4e8b\u4ef6\u76d1\u63a7\u4ee5\u53ca\u5904\u7406<\/span><\/p>\n<p><span style=\"color:#be191c\">\u529f\u80fd&#xff1a;<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u00a0 \u00a0 \u00a0 \u00a0 1.\u8bbe\u7f6e\u4ece\u5c5e\u7ebf\u7a0b\u6c60\u6570\u91cf<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u00a0 \u00a0 \u00a0 \u00a0 2.\u5f00\u59cb\u542f\u52a8\u670d\u52a1\u5668&#xff08;loop_pool-&gt;Create()\u3001acceptor\u3001acceptor.Listen(\u653e\u5728\u6784\u9020\u51fd\u6570)\u3001acceptor.Start&#xff09;<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u00a0 \u00a0 \u00a0 \u00a0 3.\u8bbe\u7f6e\u5404\u79cd\u56de\u8c03\u51fd\u6570&#xff08;\u8fde\u63a5\u5efa\u7acb\u5b8c\u6210\u3001\u6d88\u606f\u3001\u5173\u95ed\u3001\u4efb\u610f&#xff09;\u3001\u7528\u6237\u8bbe\u7f6e\u7ed9TcpServer\u3001TcpServer\u8bbe\u7f6e\u7ed9\u83b7\u53d6\u7684\u65b0\u8fde\u63a5<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u00a0 \u00a0 \u00a0 \u00a0 4.\u662f\u5426\u542f\u52a8\u975e\u6d3b\u8dc3\u8fde\u63a5\u8d85\u65f6\u9500\u6bc1\u529f\u80fd&#xff08;\u8bbe\u7f6e\u529f\u80fd\u3001\u8bbe\u7f6e\u65f6\u95f4&#xff09;<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a05.\u6dfb\u52a0\u5b9a\u65f6\u4efb\u52a1\u529f\u80fd<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u6d41\u7a0b&#xff1a;<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u00a0 \u00a0 \u00a0 \u00a0 1.\u5728TcpServer\u4e2d\u5b9e\u4f8b\u5316\u4e00\u4e2aAcceptor\u5bf9\u8c61&#xff0c;\u4ee5\u53ca\u4e00\u4e2aEventLoop\u5bf9\u8c61&#xff08;baseloop&#xff09;<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u00a0 \u00a0 \u00a0 \u00a0 2.\u5c06Acceptor\u6302\u5230baseloop\u4e0a\u8fdb\u884c\u4e8b\u4ef6\u76d1\u63a7<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u00a0 \u00a0 \u00a0 \u00a0 3.\u4e00\u65e6Acceptor\u5bf9\u8c61\u5c31\u7eea\u4e86\u53ef\u8bfb\u4e8b\u4ef6&#xff0c;\u5219\u6267\u884c\u4e8b\u4ef6\u56de\u8c03\u51fd\u6570\u83b7\u53d6\u65b0\u8fde\u63a5<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u00a0 \u00a0 \u00a0 \u00a0 4.\u5bf9\u65b0\u8fde\u63a5&#xff0c;\u521b\u5efa\u4e00\u4e2aConnection\u8fdb\u884c\u7ba1\u7406<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u00a0 \u00a0 \u00a0 \u00a0 5.\u5bf9\u8fde\u63a5\u5bf9\u5e94\u7684Connection\u8bbe\u7f6e\u529f\u80fd\u56de\u8c03&#xff08;\u8fde\u63a5\u5b8c\u6210\u56de\u8c03\u3001\u6d88\u606f\u56de\u8c03\u3001\u5173\u95ed\u56de\u8c03\u3001\u4efb\u610f\u4e8b\u4ef6\u56de\u8c03&#xff09;<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u00a0 \u00a0 \u00a0 \u00a0 6.\u542f\u52a8Connection\u7684\u975e\u6d3b\u8dc3\u8fde\u63a5\u7684\u8d85\u65f6\u9500\u6bc1\u89c4\u5219<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u00a0 \u00a0 \u00a0 \u00a0 7.\u5c06\u65b0\u8fde\u63a5\u5bf9\u5e94\u7684Connection\u6302\u5230LoopThreadpool\u4e0a\u7684\u4ece\u5c5e\u7ebf\u7a0b\u5bf9\u5e94\u7684EventLoop\u4e2d\u8fdb\u884c\u4e8b\u4ef6\u76d1\u63a7<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u00a0 \u00a0 \u00a0 \u00a0\u00a08.\u4e00\u65e6Connection\u5bf9\u5e94\u7684\u8fde\u63a5\u5c31\u7eea\u4e86\u53ef\u8bfb\u4e8b\u4ef6&#xff0c;\u5c31\u6267\u884c\u8bfb\u4e8b\u4ef6\u56de\u8c03\u51fd\u6570&#xff0c;\u8bfb\u53d6\u6570\u636e&#xff0c;\u8bfb\u53d6\u5b8c\u6bd5\u540e\u8c03\u7528TcpServer\u8bbe\u7f6e\u7684\u6d88\u606f\u56de\u8c03<\/span><\/p>\n<h3 id=\"12.2%20TcpServer%E6%A8%A1%E5%9D%97%E7%B1%BB%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0\"><span style=\"color:#0d0016\">12.2 TcpServer\u6a21\u5757\u7c7b\u8bbe\u8ba1\u4e0e\u5b9e\u73b0<\/span><\/h3>\n<p>class TcpServer {<br \/>\nprivate:<br \/>\n    using Functor &#061; std::function&lt;void()&gt;;<\/p>\n<p>    int _port;         \/\/ \u670d\u52a1\u5668\u6240\u8981\u76d1\u542c\u7684\u7aef\u53e3<br \/>\n    uint64_t _next_id; \/\/ \u81ea\u52a8\u589e\u957f\u7684\u8fde\u63a5ID<br \/>\n    int _timeout; \/\/ \u8fd9\u662f\u975e\u6d3b\u8dc3\u8fde\u63a5\u7684\u7edf\u8ba1\u65f6\u95f4&#8212;\u591a\u957f\u4e8b\u4ef6\u65e0\u901a\u4fe1\u5c31\u662f\u975e\u6d3b\u8dc3\u8fde\u63a5<br \/>\n    bool _enable_inactive_release; \/\/ \u662f\u5426\u542f\u52a8\u4e86\u975e\u6d3b\u8dc3\u8fde\u63a5\u8d85\u65f6\u9500\u6bc1\u7684\u5224\u65ad\u6807\u5fd7<br \/>\n    EventLoop _baseloop;  \/\/ \u8fd9\u662f\u4e3b\u7ebf\u7a0b\u7684EventLoop\u5bf9\u8c61&#xff0c;\u8d1f\u8d23\u76d1\u542c\u4e8b\u4ef6\u7684\u5904\u7406<br \/>\n    Acceptor _acceptor;   \/\/ \u8fd9\u662f\u7ba1\u7406\u76d1\u542c\u5957\u63a5\u5b57\u7684\u5bf9\u8c61<br \/>\n    LoopThreadPool _pool; \/\/ \u8fd9\u662f\u4ece\u5c5eEventLoop\u7ebf\u7a0b\u6c60<br \/>\n    std::unordered_map&lt;uint64_t, PtrConnection&gt;<br \/>\n        _conns; \/\/ \u4fdd\u5b58\u7ba1\u7406\u6240\u6709\u8fde\u63a5\u5bf9\u5e94\u7684shared_ptr\u5bf9\u8c61<\/p>\n<p>    using ConnectedCallBack &#061; std::function&lt;void(const PtrConnection&amp;)&gt;;<br \/>\n    using MessageCallBack &#061; std::function&lt;void(const PtrConnection&amp;, Buffer*)&gt;;<br \/>\n    using ClosedCallBack &#061; std::function&lt;void(const PtrConnection&amp;)&gt;;<br \/>\n    using AnyEventCallBack &#061; std::function&lt;void(const PtrConnection&amp;)&gt;;<br \/>\n    ConnectedCallBack _connected_callback;<br \/>\n    MessageCallBack _message_callback;<br \/>\n    ClosedCallBack _closed_callback;<br \/>\n    AnyEventCallBack _anyevent_callback;<\/p>\n<p>private:<br \/>\n    \/\/ \u4e3a\u65b0\u8fde\u63a5\u6784\u9020\u4e00\u4e2aConnection\u8fdb\u884c\u7ba1\u7406<br \/>\n    void NewConnection(int fd) {<br \/>\n        DBG_LOG(&#034;NEWCONNECTION FUNCTION&#034;);<br \/>\n        _next_id&#043;&#043;;<br \/>\n        PtrConnection conn(new Connection(_pool.NextLoop(), _next_id, fd));<br \/>\n        conn-&gt;SetMessageCallBack(_message_callback);<br \/>\n        conn-&gt;SetClosedCallBack(_closed_callback);<br \/>\n        conn-&gt;SetConnectedCallBack(_connected_callback);<br \/>\n        conn-&gt;SetAnyEventCallBack(_anyevent_callback);<br \/>\n        conn-&gt;SetSvrClosedCallBack(std::bind(&amp;TcpServer::RemoveConnection, this,<br \/>\n                                             std::placeholders::_1));<br \/>\n        if (_enable_inactive_release) {<br \/>\n            conn-&gt;EnableInactiveRelease(_timeout);<br \/>\n        }<br \/>\n        conn-&gt;Established();<br \/>\n        _conns.insert(std::make_pair(_next_id, conn));<br \/>\n        DBG_LOG(&#034;NEW CONNECTION&#8230;&#034;);<br \/>\n    }<br \/>\n    void RemoveConnectionInLoop(const PtrConnection&amp; conn) {<br \/>\n        int id &#061; conn-&gt;Id();<br \/>\n        auto it &#061; _conns.find(id);<br \/>\n        if (it !&#061; _conns.end()) {<br \/>\n            _conns.erase(id);<br \/>\n        }<br \/>\n    }<br \/>\n    \/\/ \u4ece\u7ba1\u7406Connection\u7684_conns\u4e2d\u79fb\u9664\u8fde\u63a5\u4fe1\u606f&#xff0c;\u8fde\u63a5\u624d\u4f1a\u771f\u6b63\u88ab\u91ca\u653e<br \/>\n    void RemoveConnection(const PtrConnection&amp; conn) {<br \/>\n        _baseloop.RunInLoop(<br \/>\n            std::bind(&amp;TcpServer::RemoveConnectionInLoop, this, conn));<br \/>\n    }<br \/>\n    void RunAfterInLoop(const Functor&amp; task, int delay) {<br \/>\n        _next_id&#043;&#043;;<br \/>\n        _baseloop.TimerAdd(_next_id, delay, task);<br \/>\n    }<\/p>\n<p>public:<br \/>\n    TcpServer(int port)<br \/>\n        : _port(port), _next_id(0), _enable_inactive_release(false),<br \/>\n          _acceptor(&amp;_baseloop, port), _pool(&amp;_baseloop) {<br \/>\n        _pool.Create();     \/\/ \u521b\u5efa\u7ebf\u7a0b\u6c60\u4e2d\u7684\u4ece\u5c5e\u7ebf\u7a0b<br \/>\n        _acceptor.Listen(); \/\/ \u5c06\u76d1\u542c\u5957\u63a5\u5b57\u6302\u5230baseloop\u4e0a\u5f00\u59cb\u76d1\u63a7\u4e8b\u4ef6<br \/>\n        _acceptor.SetAcceptCallBack(<br \/>\n            std::bind(&amp;TcpServer::NewConnection, this, std::placeholders::_1));<br \/>\n    }<br \/>\n    \/\/ \u8bbe\u7f6e\u7ebf\u7a0b\u6570<br \/>\n    void SetThreadCount(int count) { return _pool.SetThreadCount(count); }<br \/>\n    \/\/ \u56de\u8c03\u51fd\u6570\u7684\u8bbe\u7f6e<br \/>\n    void SetConnectedCallBack(const ConnectedCallBack&amp; cb) {<br \/>\n        _connected_callback &#061; cb;<br \/>\n    }<br \/>\n    void SetMessageCallBack(const MessageCallBack&amp; cb) {<br \/>\n        _message_callback &#061; cb;<br \/>\n    }<br \/>\n    void SetClosedCallBack(const ClosedCallBack&amp; cb) { _closed_callback &#061; cb; }<br \/>\n    void SetAnyEventCallBack(const AnyEventCallBack&amp; cb) {<br \/>\n        _anyevent_callback &#061; cb;<br \/>\n    }<br \/>\n    void EnableInactiveRelease(int timeout) {<br \/>\n        _timeout &#061; timeout;<br \/>\n        _enable_inactive_release &#061; true;<br \/>\n    }<br \/>\n    \/\/ \u7528\u4e8e\u6dfb\u52a0\u4e00\u4e2a\u5b9a\u65f6\u4efb\u52a1<br \/>\n    void RunAfter(const Functor&amp; task, int delay) {<br \/>\n        _baseloop.RunInLoop(<br \/>\n            std::bind(&amp;TcpServer::RunAfterInLoop, this, task, delay));<br \/>\n    }<br \/>\n    void Start() { return _baseloop.Start(); }<br \/>\n}; <\/p>\n<h3 id=\"12.3%20TcpServer%E6%A8%A1%E5%9D%97%E7%B1%BB%E8%B0%83%E8%AF%95%E8%BF%90%E8%A1%8C\"><span style=\"color:#0d0016\">12.3 TcpServer\u6a21\u5757\u7c7b\u8c03\u8bd5\u8fd0\u884c<\/span><\/h3>\n<p><span style=\"color:#0d0016\">tcp_svr.cpp:<\/span><\/p>\n<p> #include &#034;..\/source\/server.hpp&#034;<\/p>\n<p>void OnConnected(const PtrConnection&amp; conn) {<br \/>\n    DBG_LOG(&#034;NEW CONNECTION: %p&#034;, conn.get());<br \/>\n}<br \/>\nvoid OnClosed(const PtrConnection&amp; conn) {<br \/>\n    DBG_LOG(&#034;CLOSE CONNECTION: %p&#034;, conn.get());<br \/>\n}<\/p>\n<p>void OnMessage(const PtrConnection&amp; conn, Buffer* buf) {<br \/>\n    DBG_LOG(&#034;\u5f53\u524d\u8bfb\u4f4d\u7f6e\u5730\u5740&#xff1a;%s&#034;, buf-&gt;ReadPosition());<br \/>\n    buf-&gt;MoveReadOffset(buf-&gt;ReadableSize());<br \/>\n    std::string str &#061; &#034;\u6211\u6536\u5230\u4e86\u4f60\u53d1\u9001\u7684\u6d88\u606f&#034;;<br \/>\n    conn-&gt;Send(str.c_str(), str.size());<br \/>\n    conn-&gt;Shutdown(); \/\/ \u901a\u4fe1\u4e00\u6b21\u76f4\u63a5\u5173\u95ed\u8fde\u63a5<br \/>\n}<\/p>\n<p>int main() {<br \/>\n    TcpServer server(8500);<br \/>\n    server.SetThreadCount(2);<br \/>\n    server.EnableInactiveRelease(10);<br \/>\n    server.SetClosedCallBack(OnClosed);<br \/>\n    server.SetConnectedCallBack(OnConnected);<br \/>\n    server.SetMessageCallBack(OnMessage);<br \/>\n    server.Start();<br \/>\n    return 0;<br \/>\n} <\/p>\n<p><span style=\"color:#0d0016\">\u8fd0\u884c\u7ed3\u679c&#xff1a;\u51fa\u9519 &#xff0c;\u53ef\u4ee5\u6392\u9664\u6389\u83b7\u53d6\u5230\u65b0\u8fde\u63a5\u4e0a\u51fa\u9519<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"136\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/06\/20250622232644-68589134c9261.png\" width=\"2133\" \/><\/p>\n<p><span style=\"color:#0d0016\">\u4f7f\u7528gdb\u8c03\u8bd5&#xff1a;gdb .\/tcp_server \u2014\u2014&gt;run \u2014\u2014&gt; .\/client \u2014\u6b64\u65f6\u7a0b\u5e8f\u5df2\u7ecf\u5d29\u6e83\u4e86\u2014&gt;bt \u67e5\u770b\u51fd\u6570\u8c03\u7528\u6808&#xff0c;\u4ece\u6808\u9876\u5f00\u59cb\u67e5\u770b<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"724\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/06\/20250622232645-6858913502e30.png\" width=\"2297\" \/><\/p>\n<p><span style=\"color:#0d0016\">\u901a\u8fc7\u5728\u8fd9\u4e2a\u51fa\u9519\u7684\u5730\u65b9\u6253\u65ad\u70b9&#xff1a;break\u00a0..\/source\/server.hpp:1077 \u2014\u2014&gt;run\u91cd\u65b0\u8fd0\u884c\u7a0b\u5e8f<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"136\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/06\/20250622232645-68589135a8a01.png\" width=\"781\" \/><\/p>\n<p><span style=\"color:#0d0016\">.\/client\u8fd0\u884c\u5ba2\u6237\u7aef \u2014\u2014&gt; p _next_loop_idx \u901a\u8fc7p\u67e5\u770bidx\u662f\u5426\u6b63\u786e&#xff0c;\u7ebf\u7a0b\u6709\u4e24\u4e2a&#xff0c;\u4ece0\u5f00\u59cb&#xff0c;\u52a0\u4e86\u4e00\u4e2a\u65b0\u8fde\u63a5\u56e0\u6b64\u5c31\u662f1<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"144\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/06\/20250622232645-68589135bb661.png\" width=\"1060\" \/><\/p>\n<p><span style=\"color:#0d0016\">\u67e5\u770b_loops&#xff1a;_loops\u5728\u8fd4\u56de\u7684\u65f6\u5019\u662f0&#xff0c;\u610f\u5473\u7740\u8d8a\u754c\u8bbf\u95ee\u4e86<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"80\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/06\/20250622232645-68589135d4254.png\" width=\"476\" \/><\/p>\n<p><span style=\"color:#0d0016\">\u5b9e\u9645\u4e0a\u662fTcpServer\u6784\u9020\u51fd\u6570\u51fa\u7684\u95ee\u9898&#xff1a;\u521b\u5efa\u7ebf\u7a0b\u6c60\u4e2d\u7684\u4ece\u5c5e\u7ebf\u7a0b\u4e0d\u80fd\u653e\u5728\u8fd9\u91cc<\/span><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"290\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/06\/20250622232645-68589135e03e0.png\" width=\"1888\" \/><\/p>\n<p><span style=\"color:#0d0016\">\u56e0\u4e3a\u8fd9\u4e2a\u65f6\u5019\u5b9e\u9645\u4e0a\u7ebf\u7a0b\u6570\u91cf\u9ed8\u8ba4\u662f0&#xff0c;\u56e0\u4e3a\u8fd9\u4e2a\u65f6\u5019\u968f\u6784\u9020\u4e86TcpServer\u5bf9\u8c61\u4f46\u662f\u8fd8\u6ca1\u6709\u8bbe\u7f6eSetThreadCount\u7ebf\u7a0b\u6570\u91cf\u3002_pool.Create()\u53ea\u80fd\u5728\u542f\u52a8\u670d\u52a1\u5668\u524d\u521b\u5efa\u3002\u4e00\u5b9a\u8981\u5728\u542f\u52a8\u670d\u52a1\u5668\u524d\u3002\u8bbe\u7f6e\u597d\u6240\u6709\u7684\u529f\u80fd\u3002<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"372\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/06\/20250622232646-6858913622e6c.png\" width=\"946\" \/><\/p>\n<p><span style=\"color:#0d0016\">\u73b0\u5728\u5c31\u80fd\u591f\u6b63\u5e38\u6536\u53d1\u4fe1\u606f\u4e86<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"184\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/06\/20250622232646-6858913640e43.png\" width=\"2160\" \/><\/p>\n<p><span style=\"color:#0d0016\">\u53bb\u9664\u6389\u53ea\u53d1\u9001\u4e00\u6b21\u6d88\u606f&#xff1a;\u6d4b\u8bd5\u975e\u6d3b\u8dc3\u8d85\u65f6\u5173\u95ed\u6210\u529f<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"342\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/06\/20250622232646-685891367e610.png\" width=\"2461\" \/><\/p>\n<p><span style=\"color:#0d0016\">\u6ce8\u91ca\u6389\u8d85\u65f6\u5173\u95ed&#xff1a;\u6d4b\u8bd5\u6210\u529f<\/span><\/p>\n<p>     \/\/ server.EnableInactiveRelease(10);<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"341\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/06\/20250622232646-68589136daa22.png\" width=\"2122\" \/><\/p>\n<p><span style=\"color:#0d0016\">\u4e3b\u52a8\u5173\u95ed\u6389\u670d\u52a1\u5668\u4e4b\u540e&#xff0c;\u7acb\u5373\u518d\u6b21\u542f\u52a8\u670d\u52a1\u5668&#xff0c;\u53ef\u80fd\u4f1a\u51fa\u73b0\u7ed1\u5b9a\u5931\u8d25\u7684\u95ee\u9898<\/span><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"210\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/06\/20250622232647-685891374f747.png\" width=\"1137\" \/><\/p>\n<p><span style=\"color:#0d0016\">\u56de\u987e\u77e5\u8bc6\u70b9&#xff1a;\u53ef\u4ee5\u770b\u8fd9\u7bc7\u6587\u7ae0\u8be6\u7ec6\u7684\u8bb2\u89e3\u4e86\u4e09\u6b21\u63e1\u624b\u548c\u56db\u6b21\u6325\u624b<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u5728TCP\u8fde\u63a5\u7ba1\u7406\u4e2d&#xff0c;\u5f53\u4e00\u65b9\u4e3b\u52a8\u5173\u95ed\u8fde\u63a5\u65f6&#xff0c;\u4f1a\u7ecf\u5386\u4e00\u4e2a\u5b8c\u6574\u7684\u56db\u6b21\u6325\u624b\u8fc7\u7a0b&#xff0c;\u6700\u7ec8\u8fdb\u5165TIME_WAIT\u72b6\u6001\u3002TIME_WAIT\u72b6\u6001\u4f1a\u6301\u7eed2\u4e2aMSL&#xff0c;\u8fde\u63a5\u672a\u91ca\u653e&#xff0c;\u7aef\u53e3\u3001IP\u5730\u5740\u88ab\u5360\u7528&#xff0c;\u56e0\u6b64\u7ed1\u5b9a\u4e0d\u4e86\u3002<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u786e\u4fdd\u6570\u636e\u5305\u7684\u53ef\u9760\u4f20\u8f93&#xff1a;<\/span><\/p>\n<ul>\n<li><span style=\"color:#0d0016\">TIME_WAIT\u72b6\u6001\u4f1a\u6301\u7eed2\u4e2aMSL&#xff08;Maximum Segment Lifetime&#xff0c;\u6700\u957f\u62a5\u6587\u6bb5\u751f\u5b58\u65f6\u95f4&#xff0c;\u901a\u5e38\u4e3a30\u79d2\u52302\u5206\u949f&#xff09;<\/span><\/li>\n<li><span style=\"color:#0d0016\">\u8fd9\u4fdd\u8bc1\u4e86\u6700\u540e\u4e00\u4e2aACK\u786e\u8ba4\u62a5\u6587\u80fd\u591f\u5230\u8fbe\u5bf9\u7aef<\/span><\/li>\n<li><span style=\"color:#0d0016\">\u5982\u679cACK\u4e22\u5931&#xff0c;\u5bf9\u65b9\u91cd\u4f20\u7684FIN\u62a5\u6587\u4ecd\u7136\u80fd\u88ab\u5904\u7406<\/span><\/li>\n<\/ul>\n<p><span style=\"color:#0d0016\">\u9632\u6b62\u65e7\u8fde\u63a5\u7684\u62a5\u6587\u5e72\u6270&#xff1a;<\/span><\/p>\n<ul>\n<li><span style=\"color:#0d0016\">\u7b49\u5f852MSL\u65f6\u95f4\u786e\u4fdd\u7f51\u7edc\u4e2d\u6240\u6709\u5c5e\u4e8e\u8be5\u8fde\u63a5\u7684\u62a5\u6587\u90fd\u5df2\u6d88\u5931<\/span><\/li>\n<li><span style=\"color:#0d0016\">\u907f\u514d\u4e0e\u65b0\u5efa\u7acb\u7684\u76f8\u540c\u56db\u5143\u7ec4&#xff08;\u6e90IP\u3001\u6e90\u7aef\u53e3\u3001\u76ee\u7684IP\u3001\u76ee\u7684\u7aef\u53e3&#xff09;\u8fde\u63a5\u4ea7\u751f\u6df7\u6dc6<\/span><\/li>\n<\/ul>\n<p><span style=\"color:#0d0016\">\u5b9e\u9645\u5e94\u7528\u4e2d\u7684\u5f71\u54cd&#xff1a;<\/span><\/p>\n<ul>\n<li><span style=\"color:#0d0016\">\u5728\u9ad8\u5e76\u53d1\u670d\u52a1\u5668\u4e0a\u53ef\u80fd\u5bfc\u81f4\u7aef\u53e3\u8017\u5c3d<\/span><\/li>\n<li><span style=\"color:#0d0016\">\u53ef\u901a\u8fc7\u8bbe\u7f6eSO_REUSEADDR\u5957\u63a5\u5b57\u9009\u9879\u91cd\u7528TIME_WAIT\u72b6\u6001\u7684\u7aef\u53e3<\/span><\/li>\n<li><span style=\"color:#0d0016\">Linux\u7cfb\u7edf\u4e2d\u53ef\u4ee5\u901a\u8fc7\u8c03\u6574tcp_tw_reuse\u548ctcp_tw_recycle\u53c2\u6570\u4f18\u5316<\/span><\/li>\n<\/ul>\n<p><span style=\"color:#0d0016\">\u72b6\u6001\u8f6c\u6362\u8fc7\u7a0b&#xff1a;<\/span><\/p>\n<ul>\n<li><span style=\"color:#0d0016\">\u4e3b\u52a8\u5173\u95ed\u65b9\u53d1\u9001FIN\u540e\u8fdb\u5165FIN_WAIT_1\u72b6\u6001<\/span><\/li>\n<li><span style=\"color:#0d0016\">\u6536\u5230ACK\u540e\u8fdb\u5165FIN_WAIT_2\u72b6\u6001<\/span><\/li>\n<li><span style=\"color:#0d0016\">\u6536\u5230\u5bf9\u65b9\u7684FIN\u540e\u53d1\u9001ACK\u5e76\u8fdb\u5165TIME_WAIT\u72b6\u6001<\/span><\/li>\n<li><span style=\"color:#0d0016\">\u7ecf\u8fc72MSL\u65f6\u95f4\u540e\u6700\u7ec8\u5173\u95ed\u8fde\u63a5<\/span><\/li>\n<\/ul>\n<p><span style=\"color:#0d0016\">\u8981\u907f\u514d\u8fd9\u4e2a\u95ee\u9898\u5c31\u8981\u6b63\u786e\u7684\u8bbe\u7f6e\u597d&#xff1a;\u5730\u5740\u7aef\u53e3\u91cd\u7528\u529f\u80fd<\/span><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"613\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/06\/20250622232647-685891377757f.png\" width=\"1630\" \/><\/p>\n<p><span style=\"color:#0d0016\">12.4 NetWork&#8211;&gt;\u5ffd\u7565SIGPIPE\u4fe1\u53f7<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u5f53\u8fde\u63a5\u65ad\u5f00&#xff0c;\u82e5\u4ecd\u7136Send&#xff0c;Send\u5c31\u4f1a\u89e6\u53d1\u5f02\u5e38SIGPIPE&#xff0c;\u4f1a\u5bfc\u81f4\u7a0b\u5e8f\u7684\u9000\u51fa&#xff0c;\u6211\u4eec\u901a\u8fc7\u4fe1\u53f7\u5ffd\u7565\u65b9\u6cd5\u5c06SIGPIPE\u4fe1\u53f7\u5ffd\u7565<\/span><\/p>\n<p> #include &lt;csignal&gt;<br \/>\nclass NetWork<br \/>\n{<br \/>\npublic:<br \/>\n    NetWork()<br \/>\n    {<br \/>\n        DBG_LOG(&#034;SIGPIPE INIT&#8230;&#034;);<br \/>\n        \/\/ \u5f53\u8fde\u63a5\u65ad\u5f00&#xff0c;\u82e5\u4ecd\u7136Send&#xff0c;Send\u5c31\u4f1a\u89e6\u53d1\u5f02\u5e38SIGPIPE&#xff0c;\u4f1a\u5bfc\u81f4\u7a0b\u5e8f\u7684\u9000\u51fa&#xff0c;\u6211\u4eec\u901a\u8fc7\u4fe1\u53f7\u5ffd\u7565\u65b9\u6cd5\u5c06SIGPIPE\u4fe1\u53f7\u5ffd\u7565<br \/>\n        signal(SIGPIPE, SIG_IGN);<br \/>\n    }<br \/>\n};<\/p>\n<p>static NetWork nw; <\/p>\n<p><span style=\"color:#0d0016\">\u6d4b\u8bd5&#xff1a;\u00a0<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"871\" src=\"2025-06-23yfyfrv2euo1.png\" width=\"2295\" \/><\/p>\n<h2 id=\"%E5%8D%81%E4%B8%89%E3%80%81%E5%9F%BA%E4%BA%8ETcpServer%E5%AE%9E%E7%8E%B0%E5%9B%9E%E6%98%BE%E6%9C%8D%E5%8A%A1%E5%99%A8\"><span style=\"color:#0d0016\">\u5341\u4e09\u3001\u57fa\u4e8eTcpServer\u5b9e\u73b0\u56de\u663e\u670d\u52a1\u5668<\/span><\/h2>\n<p><span style=\"color:#0d0016\">\u76f8\u5f53\u4e8e\u5bf9TcpServer\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5&#xff1a;<\/span><\/p>\n<h3 id=\"13.1%20EchoServer%E7%B1%BB%E6%A8%A1%E5%9D%97%EF%BC%9A\"><span style=\"color:#0d0016\">13.1 EchoServer\u7c7b\u6a21\u5757&#xff1a;<\/span><\/h3>\n<p> #include &#034;server.hpp&#034;<\/p>\n<p>class EchoServer<br \/>\n{<br \/>\nprivate:<br \/>\n    TcpServer _server;<br \/>\n    void OnConnected(const PtrConnection &amp;conn)<br \/>\n    {<br \/>\n        DBG_LOG(&#034;NEW CONNECTION: %p&#034;, conn.get());<br \/>\n    }<br \/>\n    void OnClosed(const PtrConnection &amp;conn)<br \/>\n    {<br \/>\n        DBG_LOG(&#034;CLOSE CONNECTION: %p&#034;, conn.get());<br \/>\n    }<\/p>\n<p>    void OnMessage(const PtrConnection &amp;conn, Buffer *buf)<br \/>\n    {<br \/>\n        DBG_LOG(&#034;%s&#034;, buf-&gt;ReadPosition());<\/p>\n<p>        buf-&gt;MoveReadOffset(buf-&gt;ReadableSize());<br \/>\n        std::string str &#061; &#034;\u6211\u6536\u5230\u4e86\u4f60\u53d1\u9001\u7684\u6d88\u606f&#034;;<br \/>\n        conn-&gt;Send(str.c_str(), str.size());<br \/>\n        conn-&gt;Shutdown(); \/\/ \u901a\u4fe1\u4e00\u6b21\u76f4\u63a5\u5173\u95ed\u8fde\u63a5<br \/>\n    }<\/p>\n<p>public:<br \/>\n    EchoServer(int port) : _server(port)<br \/>\n    {<br \/>\n        _server.SetThreadCount(2);<br \/>\n        \/\/ _server.EnableInactiveRelease(10);<br \/>\n        _server.SetClosedCallBack(std::bind(&amp;EchoServer::OnClosed, this, std::placeholders::_1));<br \/>\n        _server.SetConnectedCallBack(std::bind(&amp;EchoServer::OnConnected, this, std::placeholders::_1));<br \/>\n        _server.SetMessageCallBack(std::bind(&amp;EchoServer::OnMessage, this, std::placeholders::_1, std::placeholders::_2));<br \/>\n        _server.Start();<br \/>\n    }<\/p>\n<p>    void Start()<br \/>\n    {<br \/>\n        _server.Start();<br \/>\n    }<br \/>\n}; <\/p>\n<p><span style=\"color:#0d0016\">\u4e3b\u51fd\u6570&#xff1a;main.cc<\/span><\/p>\n<p> #include &#034;echo.hpp&#034;<\/p>\n<p>int main()<br \/>\n{<br \/>\n    EchoServer server(8500);<br \/>\n    server.Start();<br \/>\n    return 0;<br \/>\n} <\/p>\n<p><span style=\"color:#0d0016\">\u6ce8\u610f&#xff1a;\u5728\u670d\u52a1\u5668server.hpp\u4ee3\u7801\u5f53\u4e2d\u6dfb\u52a0\u4e0a&#xff1a;\u9632\u6b62\u5934\u6587\u4ef6\u91cd\u5b9a\u4e49<\/span><\/p>\n<p class=\"img-center\"><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"213\" src=\"2025-06-23bjadp0zjij4.png\" width=\"449\" \/><\/p>\n<p><span style=\"color:#0d0016\">\u00a0\u6d4b\u8bd5\u7f16\u8bd1 \u5982\u56fe&#xff1a;<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"555\" src=\"2025-06-23ulr0c31fhvf.png\" width=\"2008\" \/><\/p>\n<h3 id=\"13.2%20%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95-WebBench\"><span style=\"color:#0d0016\">13.2 \u6027\u80fd\u6d4b\u8bd5-WebBench<\/span><\/h3>\n<p><span style=\"color:#0d0016\">\u901a\u8fc7&#xff1a;WebBench&#xff1a;\u8f7b\u91cf\u7ea7Web\u670d\u52a1\u5668\u6027\u80fd\u6d4b\u8bd5\u5de5\u5177\u6765\u8fdb\u884c\u6d4b\u8bd5<\/span><\/p>\n<p><span style=\"color:#0d0016\">Webbench \u662f\u4e00\u4e2a\u5728 linux \u4e0b\u4f7f\u7528\u7684\u975e\u5e38\u7b80\u5355\u7684\u7f51\u7ad9\u538b\u6d4b\u5de5\u5177\u3002\u5b83\u4f7f\u7528 fork() \u6a21\u62df\u591a\u4e2a\u5ba2\u6237\u7aef\u540c\u65f6\u8bbf\u95ee\u6211\u4eec\u8bbe\u5b9a\u7684 URL&#xff0c;\u6d4b\u8bd5\u7f51\u7ad9\u5728\u538b\u529b\u4e0b\u5de5\u4f5c\u7684\u6027\u80fd&#xff0c;\u6700\u591a\u53ef\u4ee5\u6a21\u62df 3 \u4e07\u4e2a\u5e76\u53d1\u8fde\u63a5\u53bb\u6d4b\u8bd5\u7f51\u7ad9\u7684\u8d1f\u8f7d\u80fd\u529b\u3002<\/span><\/p>\n<p> git clone https:\/\/github.com\/EZLippi\/WebBench.git<\/p>\n<p><span style=\"color:#0d0016\">WebBench\u662f\u4e00\u4e2a\u7ecf\u5178\u7684\u8f7b\u91cf\u7ea7Web\u670d\u52a1\u5668\u6027\u80fd\u6d4b\u8bd5\u5de5\u5177&#xff0c;\u4e3b\u8981\u7528\u4e8e\u8bc4\u4f30HTTP\u670d\u52a1\u5668\u7684\u6027\u80fd\u8868\u73b0\u3002\u5b83\u91c7\u7528\u7b80\u5355\u7684\u8bbe\u8ba1\u7406\u5ff5&#xff0c;\u901a\u8fc7\u6a21\u62df\u5927\u91cf\u5ba2\u6237\u7aef\u8fde\u63a5\u6765\u6d4b\u8bd5\u670d\u52a1\u5668\u5728\u9ad8\u5e76\u53d1\u60c5\u51b5\u4e0b\u7684\u6027\u80fd\u3002<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u4f7f\u7528&#xff1a;\u6ce8\u91ca\u8fd9\u4e2a\u5934\u6587\u4ef6&#xff0c;\u76f4\u63a5\u7f16\u8bd1<\/span><\/p>\n<p class=\"img-center\"><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"189\" src=\"2025-06-23yvszwk5b2t4.png\" width=\"531\" \/><\/p>\n<p><span style=\"color:#0d0016\">\u8fd9\u4e2a\u5c31\u662f\u6211\u4eec\u9700\u8981\u7684\u53ef\u6267\u884c\u6587\u4ef6&#xff1a;\u5e76\u4e14\u76f4\u63a5\u8fd0\u884c<\/span><\/p>\n<p class=\"img-center\"><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"242\" src=\"2025-06-23h1dtmemmqtn.png\" width=\"553\" \/><\/p>\n<p><span style=\"color:#0d0016\">\u672c\u5730\u8bf7\u6c42&#xff0c;\u5ffd\u7565\u5e26\u5bbd\u5f71\u54cd&#xff0c;\u8fdb\u884c\u6d4b\u8bd5&#xff0c;\u4e3b\u8981\u8003\u5bdf\u7684\u662f\u6211\u4eecCPU\u6027\u80fd\u3002\u4e0d\u592a\u5408\u7406&#xff0c;\u5b9e\u9645\u4e0a\u4e0d\u80fd\u628a\u670d\u52a1\u5668\u548c\u5ba2\u6237\u7aef\u653e\u5230\u540c\u4e00\u53f0\u4e3b\u673a\u4e0a&#xff0c;\u4ed6\u4eec\u90fd\u4f1a\u4e89\u62a2CPU&#xff0c;\u4f1a\u964d\u4f4e\u670d\u52a1\u5668\u6548\u7387\u3002<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u5148\u5f00\u542f\u670d\u52a1\u5668&#xff0c;\u901a\u8fc7\u4ee5\u4e0b\u547d\u4ee4&#xff1a;\u6765\u521d\u6b65\u6d4b\u8bd5\u4e00\u4e0b<\/span><\/p>\n<p> .\/webbench -c 500 -t 60 http:\/\/127.0.0.1:8500\/hello <\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"370\" src=\"2025-06-23io1f3s321en.png\" width=\"1221\" \/><\/p>\n<p><span style=\"color:#0d0016\">\u5177\u521a\u624d\u6240\u89c2\u5bdf\u5230\u7684\u6211\u4eec\u7684CPU\u4f7f\u7528\u7387&#xff1a;\u8fd9\u662f\u6211\u5728\u865a\u62df\u673a\u4e0a\u5f97\u5230\u7684\u7ed3\u679c<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"139\" src=\"2025-06-23uhz2qs2bad3.png\" width=\"1060\" \/><\/p>\n<h3 id=\"13.3%20EchoServer%E6%80%BB%E4%BD%93%E5%9B%9E%E8%B0%83%E6%A8%A1%E5%9D%97%E6%B5%81%E7%A8%8B%E5%85%B3%E7%B3%BB%E5%9B%BE\"><span style=\"color:#0d0016\">13.3 EchoServer\u603b\u4f53\u56de\u8c03\u6a21\u5757\u6d41\u7a0b\u5173\u7cfb\u56fe<\/span><\/h3>\n<p><span style=\"color:#0d0016\">\u53ef\u4ee5\u771f\u6b63\u9605\u8bfb\u6211\u7684EchoServer\u603b\u4f53\u56de\u8c03\u6a21\u5757\u6d41\u7a0b\u5173\u7cfb\u56fe&#xff0c;\u901a\u8fc7\u91cc\u9762\u7684\u6807\u53f7\u6765\u9605\u8bfb\u66f4\u52a9\u4e8e\u7406\u89e3\u6574\u4f53 \u670d\u52a1\u5668\u7684\u8fd0\u884c\u6d41\u7a0b&#xff1a;<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"2601\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/06\/20250622232638-6858912e91154.png\" width=\"3317\" \/><\/p>\n<p><span style=\"color:#0d0016\">\u672c\u6587\u5185\u5bb9\u5c31\u5230\u8fd9\u91cc&#xff0c;\u540e\u7eed\u5c06\u7ee7\u7eed\u66f4\u65b0\u9879\u76ee\u76f8\u5173\u5185\u5bb9\u3002<\/span><\/p>\n<\/p>\n<p><span style=\"color:#0d0016\">\u7ed3\u8bed&#xff1a;<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u00a0 \u00a0 \u00a0 \u00a0\u968f\u7740\u8fd9\u7bc7\u535a\u5ba2\u63a5\u8fd1\u5c3e\u58f0&#xff0c;\u6211\u8877\u5fc3\u5e0c\u671b\u6211\u6240\u5206\u4eab\u7684\u5185\u5bb9\u80fd\u4e3a\u4f60\u5e26\u6765\u4e00\u4e9b\u542f\u53d1\u548c\u5e2e\u52a9\u3002\u5b66\u4e60\u548c\u7406\u89e3\u7684\u8fc7\u7a0b\u5f80\u5f80\u5145\u6ee1\u6311\u6218&#xff0c;\u4f46\u6b63\u662f\u8fd9\u4e9b\u6311\u6218\u8ba9\u6211\u4eec\u4e0d\u65ad\u6210\u957f\u548c\u8fdb\u6b65\u3002\u6211\u5728\u51c6\u5907\u8fd9\u7bc7\u6587\u7ae0\u65f6&#xff0c;\u4e5f\u6df1\u523b\u4f53\u4f1a\u5230\u4e86\u5b66\u4e60\u4e0e\u5206\u4eab\u7684\u4e50\u8da3\u3002 \u00a0 \u00a0<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u5728\u6b64&#xff0c;\u6211\u8981\u7279\u522b\u611f\u8c22\u6bcf\u4e00\u4f4d\u9605\u8bfb\u5230\u8fd9\u91cc\u7684\u4f60\u3002\u662f\u4f60\u7684\u5173\u6ce8\u548c\u652f\u6301&#xff0c;\u7ed9\u4e88\u4e86\u6211\u6301\u7eed\u5199\u4f5c\u548c\u5206\u4eab\u7684\u52a8\u529b\u3002\u6211\u6df1\u77e5&#xff0c;\u65e0\u8bba\u6211\u5728\u67d0\u4e2a\u9886\u57df\u6709\u591a\u5c11\u89c1\u89e3&#xff0c;\u90fd\u79bb\u4e0d\u5f00\u5927\u5bb6\u7684\u9f13\u52b1\u4e0e\u6307\u6b63\u3002\u56e0\u6b64&#xff0c;\u5982\u679c\u4f60\u5728\u9605\u8bfb\u8fc7\u7a0b\u4e2d\u6709\u4efb\u4f55\u7591\u95ee\u3001\u5efa\u8bae\u6216\u662f\u53d1\u73b0\u4e86\u6587\u7ae0\u4e2d\u7684\u4e0d\u8db3\u4e4b\u5904&#xff0c;\u90fd\u6b22\u8fce\u4f60\u6177\u6168\u8d50\u6559\u3002<\/span><\/p>\n<p><span style=\"color:#0d0016\">\u00a0 \u00a0 \u00a0 \u00a0 \u4f60\u7684\u6bcf\u4e00\u6761\u53cd\u9988\u90fd\u662f\u6211\u524d\u8fdb\u8def\u4e0a\u7684\u5b9d\u8d35\u8d22\u5bcc\u3002\u540c\u65f6&#xff0c;\u6211\u4e5f\u975e\u5e38\u671f\u5f85\u80fd\u591f\u5f97\u5230\u4f60\u7684\u70b9\u8d5e\u3001\u6536\u85cf&#xff0c;\u5173\u6ce8\u8fd9\u5c06\u662f\u5bf9\u6211\u83ab\u5927\u7684\u652f\u6301\u548c\u9f13\u52b1\u3002\u5f53\u7136&#xff0c;\u6211\u66f4\u671f\u5f85\u7684\u662f\u80fd\u591f\u6301\u7eed\u4e3a\u4f60\u5e26\u6765\u6709\u4ef7\u503c\u7684\u5185\u5bb9\u3002<\/span><\/p>\n<\/p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u6587\u7ae0\u6d4f\u89c8\u9605\u8bfb1k\u6b21\uff0c\u70b9\u8d5e26\u6b21\uff0c\u6536\u85cf21\u6b21\u3002\u672c\u6587\u8be6\u7ec6\u4ecb\u7ecd\u4e86\u57fa\u4e8eC++\u548cLinux\u7684\u4effmuduo\u5e93one thread one loop\u5f0f\u5e76\u53d1\u670d\u52a1\u5668\u7684\u8bbe\u8ba1\u4e0e\u5b9e\u73b0\u3002\u6587\u7ae0\u9996\u5148\u8bb2\u89e3\u4e86Connection\u6a21\u5757\u7684\u529f\u80fd\u8bbe\u8ba1\u3001\u7c7b\u63a5\u53e3\u5b9e\u73b0\u548c\u8c03\u8bd5\u8fc7\u7a0b\uff0c\u5305\u62ec\u5957\u63a5\u5b57\u7ba1\u7406\u3001\u4e8b\u4ef6\u76d1\u63a7\u3001\u7f13\u51b2\u533a\u64cd\u4f5c\u7b49\u6838\u5fc3\u529f\u80fd\u3002\u63a5\u7740\u9610\u8ff0\u4e86Acceptor\u6a21\u5757\u5bf9\u76d1\u542c\u5957\u63a5\u5b57\u7684\u7ba1\u7406\u673a\u5236\uff0c\u4ee5\u53caLoopThread\u548cLoopThreadPool\u6a21\u5757\u7684\u7ebf\u7a0b\u6c60\u5b9e\u73b0\u3002\u6700\u540e\u6574\u5408\u4e3aTcpServer\u6a21\u5757\uff0c\u5b9e\u73b0\u4e86\u5b8c\u6574\u7684\u670d\u52a1\u5668\u6846\u67b6\uff0c\u5e76\u5728\u6b64\u57fa\u7840\u4e0a\u6784\u5efa\u4e86\u56de\u663e\u670d\u52a1\u5668EchoServer\u3002\u6587\u7ae0\u8fd8\u63d0\u4f9b\u4e86WebBench\u6027\u80fd\u6d4b\u8bd5\u65b9\u6cd5\u548c<\/p>\n","protected":false},"author":2,"featured_media":45222,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[55,58,43,211,44],"topic":[],"class_list":["post-45242","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-server","tag-c","tag-linux","tag-43","tag-211","tag-44"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u3010\u9879\u76ee\u3011\u4effmuduo\u5e93one thread one loop\u5f0f\u5e76\u53d1\u670d\u52a1\u5668SERVER\u6a21\u5757\uff08\u4e0b\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\/45242.html\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u3010\u9879\u76ee\u3011\u4effmuduo\u5e93one thread one loop\u5f0f\u5e76\u53d1\u670d\u52a1\u5668SERVER\u6a21\u5757\uff08\u4e0b\uff09 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"og:description\" content=\"\u6587\u7ae0\u6d4f\u89c8\u9605\u8bfb1k\u6b21\uff0c\u70b9\u8d5e26\u6b21\uff0c\u6536\u85cf21\u6b21\u3002\u672c\u6587\u8be6\u7ec6\u4ecb\u7ecd\u4e86\u57fa\u4e8eC++\u548cLinux\u7684\u4effmuduo\u5e93one thread one loop\u5f0f\u5e76\u53d1\u670d\u52a1\u5668\u7684\u8bbe\u8ba1\u4e0e\u5b9e\u73b0\u3002\u6587\u7ae0\u9996\u5148\u8bb2\u89e3\u4e86Connection\u6a21\u5757\u7684\u529f\u80fd\u8bbe\u8ba1\u3001\u7c7b\u63a5\u53e3\u5b9e\u73b0\u548c\u8c03\u8bd5\u8fc7\u7a0b\uff0c\u5305\u62ec\u5957\u63a5\u5b57\u7ba1\u7406\u3001\u4e8b\u4ef6\u76d1\u63a7\u3001\u7f13\u51b2\u533a\u64cd\u4f5c\u7b49\u6838\u5fc3\u529f\u80fd\u3002\u63a5\u7740\u9610\u8ff0\u4e86Acceptor\u6a21\u5757\u5bf9\u76d1\u542c\u5957\u63a5\u5b57\u7684\u7ba1\u7406\u673a\u5236\uff0c\u4ee5\u53caLoopThread\u548cLoopThreadPool\u6a21\u5757\u7684\u7ebf\u7a0b\u6c60\u5b9e\u73b0\u3002\u6700\u540e\u6574\u5408\u4e3aTcpServer\u6a21\u5757\uff0c\u5b9e\u73b0\u4e86\u5b8c\u6574\u7684\u670d\u52a1\u5668\u6846\u67b6\uff0c\u5e76\u5728\u6b64\u57fa\u7840\u4e0a\u6784\u5efa\u4e86\u56de\u663e\u670d\u52a1\u5668EchoServer\u3002\u6587\u7ae0\u8fd8\u63d0\u4f9b\u4e86WebBench\u6027\u80fd\u6d4b\u8bd5\u65b9\u6cd5\u548c\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.wsisp.com\/helps\/45242.html\" \/>\n<meta property=\"og:site_name\" content=\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"article:published_time\" content=\"2025-06-22T23:26:48+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/06\/20250622232638-6858912e91154.png\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"18 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/45242.html\",\"url\":\"https:\/\/www.wsisp.com\/helps\/45242.html\",\"name\":\"\u3010\u9879\u76ee\u3011\u4effmuduo\u5e93one thread one loop\u5f0f\u5e76\u53d1\u670d\u52a1\u5668SERVER\u6a21\u5757\uff08\u4e0b\uff09 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"isPartOf\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\"},\"datePublished\":\"2025-06-22T23:26:48+00:00\",\"dateModified\":\"2025-06-22T23:26:48+00:00\",\"author\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/45242.html#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.wsisp.com\/helps\/45242.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/45242.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.wsisp.com\/helps\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u3010\u9879\u76ee\u3011\u4effmuduo\u5e93one thread one loop\u5f0f\u5e76\u53d1\u670d\u52a1\u5668SERVER\u6a21\u5757\uff08\u4e0b\uff09\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\",\"url\":\"https:\/\/www.wsisp.com\/helps\/\",\"name\":\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"description\":\"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"contentUrl\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"caption\":\"admin\"},\"sameAs\":[\"http:\/\/wp.wsisp.com\"],\"url\":\"https:\/\/www.wsisp.com\/helps\/author\/admin\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\u3010\u9879\u76ee\u3011\u4effmuduo\u5e93one thread one loop\u5f0f\u5e76\u53d1\u670d\u52a1\u5668SERVER\u6a21\u5757\uff08\u4e0b\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\/45242.html","og_locale":"zh_CN","og_type":"article","og_title":"\u3010\u9879\u76ee\u3011\u4effmuduo\u5e93one thread one loop\u5f0f\u5e76\u53d1\u670d\u52a1\u5668SERVER\u6a21\u5757\uff08\u4e0b\uff09 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","og_description":"\u6587\u7ae0\u6d4f\u89c8\u9605\u8bfb1k\u6b21\uff0c\u70b9\u8d5e26\u6b21\uff0c\u6536\u85cf21\u6b21\u3002\u672c\u6587\u8be6\u7ec6\u4ecb\u7ecd\u4e86\u57fa\u4e8eC++\u548cLinux\u7684\u4effmuduo\u5e93one thread one loop\u5f0f\u5e76\u53d1\u670d\u52a1\u5668\u7684\u8bbe\u8ba1\u4e0e\u5b9e\u73b0\u3002\u6587\u7ae0\u9996\u5148\u8bb2\u89e3\u4e86Connection\u6a21\u5757\u7684\u529f\u80fd\u8bbe\u8ba1\u3001\u7c7b\u63a5\u53e3\u5b9e\u73b0\u548c\u8c03\u8bd5\u8fc7\u7a0b\uff0c\u5305\u62ec\u5957\u63a5\u5b57\u7ba1\u7406\u3001\u4e8b\u4ef6\u76d1\u63a7\u3001\u7f13\u51b2\u533a\u64cd\u4f5c\u7b49\u6838\u5fc3\u529f\u80fd\u3002\u63a5\u7740\u9610\u8ff0\u4e86Acceptor\u6a21\u5757\u5bf9\u76d1\u542c\u5957\u63a5\u5b57\u7684\u7ba1\u7406\u673a\u5236\uff0c\u4ee5\u53caLoopThread\u548cLoopThreadPool\u6a21\u5757\u7684\u7ebf\u7a0b\u6c60\u5b9e\u73b0\u3002\u6700\u540e\u6574\u5408\u4e3aTcpServer\u6a21\u5757\uff0c\u5b9e\u73b0\u4e86\u5b8c\u6574\u7684\u670d\u52a1\u5668\u6846\u67b6\uff0c\u5e76\u5728\u6b64\u57fa\u7840\u4e0a\u6784\u5efa\u4e86\u56de\u663e\u670d\u52a1\u5668EchoServer\u3002\u6587\u7ae0\u8fd8\u63d0\u4f9b\u4e86WebBench\u6027\u80fd\u6d4b\u8bd5\u65b9\u6cd5\u548c","og_url":"https:\/\/www.wsisp.com\/helps\/45242.html","og_site_name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","article_published_time":"2025-06-22T23:26:48+00:00","og_image":[{"url":"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/06\/20250622232638-6858912e91154.png"}],"author":"admin","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"admin","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"18 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.wsisp.com\/helps\/45242.html","url":"https:\/\/www.wsisp.com\/helps\/45242.html","name":"\u3010\u9879\u76ee\u3011\u4effmuduo\u5e93one thread one loop\u5f0f\u5e76\u53d1\u670d\u52a1\u5668SERVER\u6a21\u5757\uff08\u4e0b\uff09 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","isPartOf":{"@id":"https:\/\/www.wsisp.com\/helps\/#website"},"datePublished":"2025-06-22T23:26:48+00:00","dateModified":"2025-06-22T23:26:48+00:00","author":{"@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41"},"breadcrumb":{"@id":"https:\/\/www.wsisp.com\/helps\/45242.html#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.wsisp.com\/helps\/45242.html"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.wsisp.com\/helps\/45242.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.wsisp.com\/helps"},{"@type":"ListItem","position":2,"name":"\u3010\u9879\u76ee\u3011\u4effmuduo\u5e93one thread one loop\u5f0f\u5e76\u53d1\u670d\u52a1\u5668SERVER\u6a21\u5757\uff08\u4e0b\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\/45242","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=45242"}],"version-history":[{"count":0,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/45242\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media\/45222"}],"wp:attachment":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media?parent=45242"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/categories?post=45242"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/tags?post=45242"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/topic?post=45242"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}