<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、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 7.4 使用bufferevent 基于套接字的 bufferevent 是最簡單的,它使用 libevent 的底層事件機制來檢測底層網絡套 接字是否已經就緒,可以進行讀寫操作,并且使用底層網絡調用(如 readv 、 writev 、 WSASend、WSARecv)來發送和接收數據。 ## 7.4.1 創建基于套接字的bufferevent 可以使用 bufferevent_socket_new()創建基于套接字的 bufferevent。 ```cpp struct bufferevent *bufferevent_socket_new( struct event_base *base, evutil_socket_t fd, enum bufferevent_options options); ``` base 是 event_base,options 是表示 bufferevent 選項(BEV_OPT_CLOSE_ON_FREE 等) 的位掩碼, fd是一個可選的表示套接字的文件描述符。如果想以后設置文件描述符,可以設置fd為-1。 成功時函數返回一個 bufferevent,失敗則返回 NULL。 ## 7.4.2 在bufferevent上啟動鏈接 ```cpp int bufferevent_socket_connect(struct bufferevent *bev, struct sockaddr *address, int addrlen); ``` address 和 addrlen 參數跟標準調用 connect()的參數相同。如果還沒有為 bufferevent 設置套接字,調用函數將為其分配一個新的流套接字,并且設置為非阻塞的。 如果已經為 bufferevent 設置套接字,調用bufferevent_socket_connect() 將告知 libevent 套接字還未連接,直到連接成功之前不應該對其進行讀取或者寫入操作。 連接完成之前可以向輸出緩沖區添加數據。 如果連接成功啟動,函數返回 0;如果發生錯誤則返回 -1。 ```cpp #include <event2/event.h> #include <event2/bufferevent.h> #include <sys/socket.h> #include <string.h> void eventcb(struct bufferevent *bev, short events, void *ptr) { if (events & BEV_EVENT_CONNECTED) { /* We're connected to 127.0.0.1:8080. Ordinarily we'd do something here, like start reading or writing. */ } else if (events & BEV_EVENT_ERROR) { /* An error occured while connecting. */ } } int main_loop(void) { struct event_base *base; struct bufferevent *bev; struct sockaddr_in sin; base = event_base_new(); memset(&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_addr.s_addr = htonl(0x7f000001); /* 127.0.0.1 */ sin.sin_port = htons(8080); /* Port 8080 */ bev = bufferevent_socket_new(base, -1, BEV_OPT_CLOSE_ON_FREE); bufferevent_setcb(bev, NULL, NULL, eventcb, NULL); if (bufferevent_socket_connect(bev, (struct sockaddr *)&sin, sizeof(sin)) < 0) { /* Error starting connection */ bufferevent_free(bev); return -1; } event_base_dispatch(base); return 0; } ``` **`注意`:如果使用 bufferevent_socket_connect() 發起連接,將只會收 到 BEV_EVENT_CONNECTED 事件。如果自己調用 connect(),則連接上將被報告為寫入事 件。**
                  <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>

                              哎呀哎呀视频在线观看