<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 功能強大 支持多語言、二開方便! 廣告
                [TOC] ### API調用過程 ***** **libevent總體API調用過程如下:** (1)初始化一個event_base, event_base_new() ``` struct event_base * event_init(void) /*初始化libevent庫, 返回一個struct event_base 指針*/ struct event_base * event_base_new(void) /*同樣是初始化libevent庫,官方后出的用來替代evnet_init()的*/ //區別: event_base_new是線程安全的、而后者是非線程安全的, //event_init在其官方說明中已經被標志為過時的函數、且建議用event_base_new代替 ``` (2)初始化一個event(事件)結構體 event_set(): ``` /* ev: 執行要初始化的 event 對象; fd: 該 event 綁定的“句柄”,對于信號事件,它就是關注的信號; event:在該 fd 上關注的事件類型,它可以是 EV_READ, EV_WRITE, EV_SIGNAL; cb: 這是一個函數指針,當 fd 上的事件 event 發生時,調用該函數執行處理,它有三個參數, 調用時由 event_base 負責傳入,按順序,實際上就是 event_set 時的 fd, event 和 arg; arg: 傳遞給 cb 函數指針的參數*/ void event_set(struct event *ev, int fd, short event, void (*cb)(int, short, void *), void *arg) /*初始化事件,并且設置回調函數和關注的事件*/ ``` (3)event_base_set() ?//給事件設置相應的event\_base ``` //指明 event 要注冊到哪個 event_base 實例上 event_base_set(base, &ev); ``` (4)event_add() ?//把事件添加到隊列(就緒隊列、active隊列等),隊列由event對應的event_base管理 ``` //添加事件并設置超時時間 event_add(&ev, timeout); ``` (5)event_base_dispatch()??//啟動輪詢 ``` event_base_dispatch(base); ``` ### 代碼示例 ***** server.cpp ``` #include <WinSock2.h> #include <windows.h> #include <memory> #include <stdio.h> #include<event2/event.h> #include <event2/bufferevent.h> #pragma comment(lib,"ws2_32.lib") #define MAX_MSG_LEN 4096 int tcp_init(unsigned short port, int listen_num) { #ifdef WIN32 WSADATA ws_data; if (WSAStartup(MAKEWORD(2, 2), &ws_data) < 0) goto errorn; #endif int errno_save; evutil_socket_t listener; listener = ::socket(AF_INET, SOCK_STREAM, 0); if (-1 == listener) return -1; evutil_make_listen_socket_reuseable(listener);//允許多次綁定同一個地址,要用在socket和bind之間 struct sockaddr_in sin; sin.sin_family = AF_INET; sin.sin_addr.S_un.S_addr = 0; sin.sin_port = htons(port); if (::bind(listener, (sockaddr*)& sin, sizeof(sin)) < 0) goto errorn; if (::listen(listener, listen_num) < 0) goto errorn; evutil_make_socket_nonblocking(listener);//跨平臺統一接口,將套接字設置位非阻塞狀態 return listener; errorn: errno_save = errno; evutil_closesocket(listener); errno = errno_save; return -1; } void socket_read_cb(bufferevent *bev, void *arg) { char msg[MAX_MSG_LEN + 1]; memset(msg, 0, sizeof(msg)); size_t len = bufferevent_read(bev, msg, sizeof(msg)); msg[len] = '\0'; printf("Server read the data: %s\n",msg); char reply[] = "I have read your data"; bufferevent_write(bev, reply, strlen(reply)); } void errorcb(bufferevent* bev, short events, void* arg) { if (events & BEV_EVENT_EOF) { printf("connection closed!\n"); } else if (events & BEV_EVENT_ERROR) { printf("some other error!\n"); } bufferevent_free(bev); printf("bufferevent_free bev"); } void accept_cb(evutil_socket_t fd, short events, void* arg) { evutil_socket_t sockfd; struct sockaddr_in client; int len = sizeof(client); sockfd = ::accept(fd, (struct sockaddr*)& client, &len); if (sockfd < 0) { printf("accept error!\n"); return; } evutil_make_socket_nonblocking(sockfd);//平臺統一接口,設置非阻塞 printf("accept a client %d\n", sockfd); struct event_base* base = (event_base*)arg; bufferevent* bev = bufferevent_socket_new(base, sockfd, BEV_OPT_CLOSE_ON_FREE); bufferevent_setcb(bev, socket_read_cb, NULL, errorcb, NULL); bufferevent_enable(bev, EV_READ | EV_PERSIST); } int main() { setvbuf(stdout, NULL, _IONBF, 0); int listener = tcp_init(662, 5); struct event_base* base = event_base_new(); struct event* listener_event = event_new(base, listener, EV_READ | EV_PERSIST, accept_cb, (void*)base); event_add(listener_event, NULL); printf("start!\n"); event_base_dispatch(base); event_free(listener_event); event_base_free(base); return 1; } ```
                  <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>

                              哎呀哎呀视频在线观看