{"id":5471,"date":"2021-08-09T19:35:37","date_gmt":"2021-08-09T11:35:37","guid":{"rendered":"https:\/\/damogame.cn\/wordpress\/?p=5471"},"modified":"2021-08-14T15:54:40","modified_gmt":"2021-08-14T07:54:40","slug":"%e7%9c%8b%e7%9c%8b%e6%88%91%e8%ae%be%e8%ae%a1%e7%9a%84%e7%bd%91%e7%bb%9c%e7%bb%84%e4%bb%b6","status":"publish","type":"post","link":"https:\/\/i007.cc\/wordpress\/archives\/5471","title":{"rendered":"\u770b\u770b\u6211\u8bbe\u8ba1\u7684\u7f51\u7edc\u7ec4\u4ef6"},"content":{"rendered":"<p><del>\u65e9\u5c31\u6000\u7591asio\u7684\u6027\u80fd\u6709\u95ee\u9898\uff0c\u76ee\u524d\u521d\u6b65\u6d4b\u4e0b\u6765\u6027\u80fd\u74f6\u9888\u5728\u4e8easio\u7684\u6d88\u606f\u961f\u5217\uff0cping\/pong\u6d88\u606f\u6d4b\u8bd5\u6570\u636e\u8868\u660e\uff0c\u4f7f\u7528asio\u6d88\u606f\u961f\u5217\u7684\u670d\u52a1\u5668qps\u65e0\u6cd5\u8d85\u8fc710\u4e07\uff0c\u4f46\u662f\u6211\u81ea\u5df1\u5199\u7684\u6d88\u606f\u961f\u5217\u80fd\u8f7b\u677e\u8fbe\u5230\u5343\u5146\u7f51\u5361\u7684pps\u4e0a\u9650\uff0837\u4e07\uff09\u3002<\/del><\/p>\n<p>\u4e0a\u9762\u8fd9\u4e9b\u8bdd\u4e0d\u51c6\u786e\uff0c\u8fd9\u51e0\u5929\u6d4b\u8bd5\u4e86\u4e0b\uff0casio\u6d88\u606f\u961f\u5217\u6027\u80fd\u8fd8\u662f\u4e0d\u9519\u7684\uff0c\u4f7f\u7528asio\u7684\u670d\u52a1\u5668qps\u5728\u56db\u4e2aio\u7ebf\u7a0b\u7684\u60c5\u51b5\u4e0b\u53ef\u4ee5\u8d85\u8fc750\u4e07\uff0c\u5355\u7ebf\u7a0b\u80fd\u8fbe\u523016\u4e07\uff0c\u4e4b\u524d\u662f\u56e0\u4e3a\u6d4b\u8bd5\u673a\u7684\u539f\u56e0\u5bfc\u81f4\u6d4b\u8bd5\u6570\u636e\u6709\u8bef<\/p>\n<p>&nbsp;<\/p>\n<p>\u6700\u8fd1\u628a\u7f51\u7edc\u7ec4\u4ef6\u7684\u63a5\u53e3\u91cd\u5199\u4e86\uff0c\u5e9f\u8bdd\u5c11\u8bf4\uff0c\u5148\u653e\u4ee3\u7801<\/p>\n<p>\u5ba2\u6237\u7aef<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">#include \"asyncio.h\"\r\n\r\nclass MyConnection : public asyncio::Protocol, std::enable_shared_from_this&lt;MyConnection&gt; {\r\npublic:\r\n    MyConnection() { m_rx_buffer.resize(1024); }\r\n    virtual ~MyConnection() {}\r\n\r\n    virtual std::pair&lt;char*, size_t&gt; GetRxBuffer() override {\r\n        return std::make_pair(m_rx_buffer.data(), m_rx_buffer.size());\r\n    }\r\n\r\n    virtual void ConnectionMade(asyncio::TransportPtr transport) override {\r\n        m_rx_buffer.clear();\r\n        m_transport = transport;\r\n        ASYNCIO_LOG_DEBUG(\"ConnectionMade\");\r\n\r\n        std::string msg(\"hello,world!\");\r\n        Send(msg.data(), msg.size());\r\n    }\r\n\r\n    virtual void ConnectionLost(asyncio::TransportPtr transport, int err_code) override {\r\n        m_transport = nullptr;\r\n        ASYNCIO_LOG_DEBUG(\"ConnectionLost, ec:%d\", err_code);\r\n    }\r\n\r\n    virtual void DataReceived(size_t len) override {\r\n\r\n        \/\/\r\n        \/\/ \u6ca1\u6709\u4f7f\u7528\u89e3\u7801\u5668\uff0c\u8fd9\u91cc\u4f1a\u6709\u9ecf\u5305\u95ee\u9898\r\n        \/\/ \u5982\u679c\u8981\u89e3\u51b3\u9ecf\u5305\u95ee\u9898\u9700\u8981\u4f7f\u7528\u89e3\u7801\u5668\r\n        \/\/\r\n        ASYNCIO_LOG_DEBUG(\"DataReceived %lld byte(s): %s\", len, m_rx_buffer.data());\r\n    }\r\n\r\n    virtual void EofReceived() override {\r\n        ASYNCIO_LOG_DEBUG(\"EofReceived\");\r\n        m_transport-&gt;WriteEof();\r\n    }\r\n\r\n    size_t Send(const char* data, size_t len) {\r\n        if (m_transport == nullptr)\r\n            return 0;\r\n        ASYNCIO_LOG_DEBUG(\"Send %lld byte(s): %s\", len, data);\r\n        m_transport-&gt;Write(data, len);\r\n        return len;\r\n    }\r\n\r\n    void Close() {\r\n        if (m_transport != nullptr) {\r\n            m_transport-&gt;Close(asyncio::EC_SHUT_DOWN);\r\n        }\r\n    }\r\n\r\nprivate:\r\n    asyncio::TransportPtr m_transport;\r\n\r\n    \/\/\r\n    \/\/ ProActor\u6a21\u5f0f\u4f7f\u7528\u9884\u5148\u5206\u914d\u7684\u7f13\u51b2\u533a\u63a5\u6536\u6570\u636e\r\n    \/\/ \u5982\u679c\u7f13\u51b2\u533a\u4e0d\u591f\uff0c\u4f1a\u5206\u6210\u591a\u6b21\u63a5\u6536\r\n    \/\/\r\n    std::string m_rx_buffer;\r\n};\r\n\r\nclass MyConnectionFactory : public asyncio::ProtocolFactory {\r\npublic:\r\n    virtual ~MyConnectionFactory() {}\r\n    virtual asyncio::ProtocolPtr CreateProtocol() override { return std::make_shared&lt;MyConnection&gt;(); }\r\n};\r\n\r\nint main() {\r\n    asyncio::EventLoop my_event_loop;\r\n    MyConnectionFactory my_conn_factory;\r\n    my_event_loop.CreateConnection(my_conn_factory, \"127.0.0.1\", 9000);\r\n    my_event_loop.RunForever();\r\n    return 0;\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>\u670d\u52a1\u5668\uff1a<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">#include \"asyncio.h\"\r\n\r\nclass MySession : public asyncio::Protocol, std::enable_shared_from_this&lt;MySession&gt; {\r\npublic:\r\n    MySession() { m_rx_buffer.resize(1024); }\r\n    virtual ~MySession() {}\r\n\r\n    virtual std::pair&lt;char*, size_t&gt; GetRxBuffer() override {\r\n        return std::make_pair(m_rx_buffer.data(), m_rx_buffer.size());\r\n    }\r\n\r\n    virtual void ConnectionMade(asyncio::TransportPtr transport) override {\r\n        m_rx_buffer.clear();\r\n        m_transport = transport;\r\n        ASYNCIO_LOG_DEBUG(\"ConnectionMade\");\r\n    }\r\n\r\n    virtual void ConnectionLost(asyncio::TransportPtr transport, int err_code) override {\r\n        m_transport = nullptr;\r\n        ASYNCIO_LOG_DEBUG(\"ConnectionLost, ec:%d\", err_code);\r\n    }\r\n\r\n    virtual void DataReceived(size_t len) override {\r\n\r\n        \/\/\r\n        \/\/ \u6ca1\u6709\u4f7f\u7528\u89e3\u7801\u5668\uff0c\u8fd9\u91cc\u4f1a\u6709\u9ecf\u5305\u95ee\u9898\uff0c\u5982\u679c\u8981\u89e3\u51b3\u9ecf\u5305\u95ee\u9898\u9700\u8981\u4f7f\u7528\u89e3\u7801\u5668\r\n        \/\/\r\n        ASYNCIO_LOG_DEBUG(\"DataReceived %lld byte(s): %s\", len, m_rx_buffer.data());\r\n\r\n        std::string ack(\"Your words: \");\r\n        ack.append(m_rx_buffer.data(), len);\r\n        Send(ack.data(), ack.size());\r\n    }\r\n\r\n    virtual void EofReceived() override {\r\n        ASYNCIO_LOG_DEBUG(\"EofReceived\");\r\n        m_transport-&gt;WriteEof();\r\n    }\r\n\r\n    size_t Send(const char* data, size_t len) {\r\n        if (m_transport == nullptr) {\r\n            return 0;\r\n        }\r\n\r\n        ASYNCIO_LOG_DEBUG(\"Send %lld byte(s): %s\", len, data);\r\n        m_transport-&gt;Write(data, len);\r\n        return len;\r\n    }\r\n\r\n    void Close() {\r\n        if (m_transport != nullptr) {\r\n            m_transport-&gt;Close(asyncio::EC_KICK);\r\n        }\r\n    }\r\n\r\nprivate:\r\n    asyncio::TransportPtr m_transport;\r\n\r\n    \/\/\r\n    \/\/ ProActor\u6a21\u5f0f\u4f7f\u7528\u9884\u5148\u5206\u914d\u7684\u7f13\u51b2\u533a\u63a5\u6536\u6570\u636e\r\n    \/\/ \u5982\u679c\u7f13\u51b2\u533a\u4e0d\u591f\uff0c\u4f1a\u5206\u6210\u591a\u6b21\u63a5\u6536\r\n    \/\/\r\n    std::string m_rx_buffer;\r\n};\r\n\r\nclass MySessionFactory : public asyncio::ProtocolFactory {\r\npublic:\r\n    virtual ~MySessionFactory() {}\r\n    virtual asyncio::ProtocolPtr CreateProtocol() override { return std::make_shared&lt;MySession&gt;(); }\r\n};\r\n\r\nint main() {\r\n    int port = 9000;\r\n    asyncio::EventLoop my_event_loop;\r\n    MySessionFactory my_session_factory;\r\n    auto listener = my_event_loop.CreateServer(my_session_factory, port);\r\n    if (listener == nullptr) {\r\n        ASYNCIO_LOG_ERROR(\"listen on %d failed\", port);\r\n        return 0;\r\n    }\r\n\r\n    ASYNCIO_LOG_INFO(\"listen on %d suc\", port);\r\n    my_event_loop.RunForever();\r\n    return 0;\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>\u4ed3\u5e93\u5730\u5740\uff1ahttps:\/\/github.com\/williamxin\/asyncio<\/p>\n<p>&nbsp;<\/p>\n<p>\u7528\u8fd9\u5957\u7f51\u7edc\u7ec4\u4ef6\u5199\u51fa\u6765\u7684\u7a0b\u5e8f\u5df2\u7ecf\u5b8c\u5168\u770b\u4e0d\u5230asio\u7684\u5f71\u5b50\u4e86\uff0c\u6574\u4e2a\u7cfb\u7edf\u4f1a\u5f88\u5e72\u51c0\u3002<\/p>\n<p>\u8981\u8bf4\u6211\u7684\u76ee\u6807\uff0c\u5148\u628a\u63a5\u53e3\u8bbe\u8ba1\u597d\u4e86\uff0c\u5148\u7528\u7740asio\uff0c\u7136\u540e\u9010\u6b65\u66ff\u6362\u6389asio\uff0c\u5b9e\u73b0\u767e\u4e07\u751a\u81f3\u5343\u4e07\u5e76\u53d1\uff0c\u563f\u563f\u563f~~~~~~~~~~<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u65e9\u5c31\u6000\u7591asio\u7684\u6027\u80fd\u6709\u95ee\u9898\uff0c\u76ee\u524d\u521d\u6b65\u6d4b<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"colormag_page_container_layout":"no_sidebar_full_width","colormag_page_sidebar_layout":"no_sidebar","footnotes":""},"categories":[],"tags":[118],"class_list":["post-5471","post","type-post","status-publish","format-standard","hentry","tag-02-"],"_links":{"self":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts\/5471","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/comments?post=5471"}],"version-history":[{"count":0,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts\/5471\/revisions"}],"wp:attachment":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/media?parent=5471"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/categories?post=5471"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/tags?post=5471"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}