<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>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 7.5.2 操作回調、水位和啟用/禁用 ```cpp typedef void (*bufferevent_data_cb)(struct bufferevent *bev, void *ctx); typedef void (*bufferevent_event_cb)(struct bufferevent *bev, short events, void *ctx); void bufferevent_setcb(struct bufferevent *bufev, bufferevent_data_cb readcb, bufferevent_data_cb writecb, bufferevent_event_cb eventcb, void *cbarg); void bufferevent_getcb(struct bufferevent *bufev, bufferevent_data_cb *readcb_ptr, bufferevent_data_cb *writecb_ptr, bufferevent_event_cb *eventcb_ptr, void **cbarg_ptr); ``` bufferevent_setcb()函數修改 bufferevent 的一個或者多個回調 。readcb、writecb和eventcb函數將分別在已經讀取足夠的數據 、已經寫入足夠的數據 ,或者發生錯誤時被調用 。 每個回調函數的第一個參數都是發生了事件的bufferevent ,最后一個參數都是調用bufferevent_setcb()時用戶提供的 cbarg 參數:可以通過它向回調傳遞數據。事件回調 的 events 參數是一個表示事件標志的位掩碼:請看前面的 “回調和水位”節。 要禁用回調,傳遞 NULL 而不是回調函數 。注意:bufferevent 的所有回調函數共享單 個 cbarg, 所以修改它將影響所有回調函數。 ###接口 ```cpp void bufferevent_enable(struct bufferevent *bufev, short events); void bufferevent_disable(struct bufferevent *bufev, short events); short bufferevent_get_enabled(struct bufferevent *bufev); ``` 可以啟用或者禁用 bufferevent 上的 EV_READ、EV_WRITE 或者 EV_READ | EV_WRITE 事件。沒有啟用讀取或者寫入事件時, bufferevent 將不會試圖進行數據讀取或者寫入。 沒有必要在輸出緩沖區空時禁用寫入事件: bufferevent 將自動停止寫入,然后在有數據等 待寫入時重新開始。 類似地,沒有必要在輸入緩沖區高于高水位時禁用讀取事件 :bufferevent 將自動停止讀取, 然后在有空間用于讀取時重新開始讀取。 默認情況下,新創建的 bufferevent 的寫入是啟用的,但是讀取沒有啟用。 可以調用 bufferevent_get_enabled()確定 bufferevent 上當前啟用的事件。 ###接口 ```cpp void bufferevent_setwatermark(struct bufferevent *bufev, short events, size_t lowmark, size_t highmark); ``` bufferevent_setwatermark()函數調整單個 bufferevent 的讀取水位、寫入水位,或者同時調 整二者。(如果 events 參數設置了 EV_READ,調整讀取水位。如果 events 設置了 EV_WRITE 標志,調整寫入水位) 對于高水位,0表示“無限”。 ###示例 ```cpp #include <event2/event.h> #include <event2/bufferevent.h> #include <event2/buffer.h> #include <event2/util.h> #include <stdlib.h> #include <errno.h> #include <string.h> struct info { const char *name; size_t total_drained; }; void read_callback(struct bufferevent *bev, void *ctx) { struct info *inf = ctx; struct evbuffer *input = bufferevent_get_input(bev); size_t len = evbuffer_get_length(input); if (len) { inf->total_drained += len; evbuffer_drain(input, len); printf("Drained %lu bytes from %s\n", (unsigned long) len, inf->name); } } void event_callback(struct bufferevent *bev, short events, void *ctx) { struct info *inf = ctx; struct evbuffer *input = bufferevent_get_input(bev); int finished = 0; if (events & BEV_EVENT_EOF) { size_t len = evbuffer_get_length(input); printf("Got a close from %s. We drained %lu bytes from it, " "and have %lu left.\n", inf->name, (unsigned long)inf->total_drained, (unsigned long)len); finished = 1; } if (events & BEV_EVENT_ERROR) { printf("Got an error from %s: %s\n", inf->name, evutil_socket_error_to_string(EVUTIL_SOCKET_ERROR())); finished = 1; } if (finished) { free(ctx); bufferevent_free(bev); } } struct bufferevent *setup_bufferevent(void) { struct bufferevent *b1 = NULL; struct info *info1; info1 = malloc(sizeof(struct info)); info1->name = "buffer 1"; info1->total_drained = 0; /* ... Here we should set up the bufferevent and make sure it gets connected... */ /* Trigger the read callback only whenever there is at least 128 bytes of data in the buffer. */ bufferevent_setwatermark(b1, EV_READ, 128, 0); bufferevent_setcb(b1, read_callback, NULL, event_callback, info1); bufferevent_enable(b1, EV_READ); /* Start reading. */ return b1; } ```
                  <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>

                              哎呀哎呀视频在线观看