<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ## 16) 鏈接屬性設置功能 ### 16.1 測試鏈接屬性 ? 我們在基于lars_reactor開發的時候,可能有時候需要在寫消息回調的時候,希望conn綁定一些屬性。現在我們可以配置這種功能到`net_connection`上。 > lars_reactor/include/net_connection.h ```c #pragma once #include <stdio.h> /* * * 網絡通信的抽象類,任何需要進行收發消息的模塊,都可以實現該類 * * */ class net_connection { public: net_connection():param(NULL) {} //發送消息的接口 virtual int send_message(const char *data, int datalen, int msgid) = 0; virtual int get_fd() = 0; void *param; //TCP客戶端可以 通過該參數傳遞一些自定義的參數 }; //創建鏈接/銷毀鏈接 要觸發的 回調函數類型 typedef void (*conn_callback)(net_connection *conn, void *args); ``` ? 這里我們給`net_connection`類添加了一個`param`屬性,這樣,我們就可以綁定一些開發者自定義的參數和當前鏈接進行綁定。注意,這里也提供了一個`get_fd()`的純虛函數,目的是提供conn獲取當前fd的數據。 ### 16.2 完成Lars Reactor V0.12開發 ### server端 ```c #include "tcp_server.h" #include <string> #include <string.h> #include "config_file.h" tcp_server *server; //回顯業務的回調函數 void callback_busi(const char *data, uint32_t len, int msgid, net_connection *conn, void *user_data) { printf("callback_busi ...\n"); //直接回顯 conn->send_message(data, len, msgid); printf("conn param = %s\n", (const char *)conn->param); } //打印信息回調函數 void print_busi(const char *data, uint32_t len, int msgid, net_connection *conn, void *user_data) { printf("recv client: [%s]\n", data); printf("msgid: [%d]\n", msgid); printf("len: [%d]\n", len); } //新客戶端創建的回調 void on_client_build(net_connection *conn, void *args) { int msgid = 101; const char *msg = "welcome! you online.."; conn->send_message(msg, strlen(msg), msgid); //將當前的net_connection 綁定一個自定義參數,供我們開發者使用 const char *conn_param_test = "I am the conn for you!"; conn->param = (void*)conn_param_test; } //客戶端銷毀的回調 void on_client_lost(net_connection *conn, void *args) { printf("connection is lost !\n"); } int main() { event_loop loop; //加載配置文件 config_file::setPath("./serv.conf"); std::string ip = config_file::instance()->GetString("reactor", "ip", "0.0.0.0"); short port = config_file::instance()->GetNumber("reactor", "port", 8888); printf("ip = %s, port = %d\n", ip.c_str(), port); server = new tcp_server(&loop, ip.c_str(), port); //注冊消息業務路由 server->add_msg_router(1, callback_busi); server->add_msg_router(2, print_busi); //注冊鏈接hook回調 server->set_conn_start(on_client_build); server->set_conn_close(on_client_lost); loop.event_process(); return 0; } ``` ? 我們在 `on_client_build`中,對創建鏈接做了conn的參數傳遞,然后通過路由業務的轉發,我們在`callback_busi`中,得到了之前傳遞進去的參數。這樣對我們使用框架做一些復雜的業務,需要綁定一些屬性給conn是有必要的。 ### client端 ```c #include "tcp_client.h" #include <stdio.h> #include <string.h> //客戶端業務 void busi(const char *data, uint32_t len, int msgid, net_connection *conn, void *user_data) { //得到服務端回執的數據 char *str = NULL; str = (char*)malloc(len+1); memset(str, 0, len+1); memcpy(str, data, len); printf("recv server: [%s]\n", str); printf("msgid: [%d]\n", msgid); printf("len: [%d]\n", len); } //客戶端銷毀的回調 void on_client_build(net_connection *conn, void *args) { int msgid = 1; const char *msg = "Hello Lars!"; conn->send_message(msg, strlen(msg), msgid); } //客戶端銷毀的回調 void on_client_lost(net_connection *conn, void *args) { printf("on_client_lost...\n"); printf("Client is lost!\n"); } int main() { event_loop loop; //創建tcp客戶端 tcp_client client(&loop, "127.0.0.1", 7777, "clientv0.6"); //注冊消息路由業務 client.add_msg_router(1, busi); client.add_msg_router(101, busi); //設置hook函數 client.set_conn_start(on_client_build); client.set_conn_close(on_client_lost); //開啟事件監聽 loop.event_process(); return 0; } ``` ? 和之前的client無任何改變。 ### 運行結果 - 服務端: ```c $ ./server msg_router init... ip = 127.0.0.1, port = 7777 create 0 thread create 1 thread create 2 thread create 3 thread create 4 thread add msg cb msgid = 1 add msg cb msgid = 2 begin accept begin accept [thread]: get new connection succ! callback_busi ... conn param = I am the conn for you! ``` ? 會發現我們是可以在callback中拿到conn的屬性 --- ### 關于作者: 作者:`Aceld(劉丹冰)` mail: [danbing.at@gmail.com](mailto:danbing.at@gmail.com) github: [https://github.com/aceld](https://github.com/aceld) 原創書籍: [http://www.hmoore.net/@aceld](http://www.hmoore.net/@aceld) ![](https://img.kancloud.cn/b0/d1/b0d11a21ba62e96aef1c11d5bfff2cf8_227x227.jpg) >**原創聲明:未經作者允許請勿轉載, 如果轉載請注明出處**
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看