日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Libevent事件的创建-scoke服务的创建-特征的获取和配置

發布時間:2025/3/15 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Libevent事件的创建-scoke服务的创建-特征的获取和配置 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Libevent 簡介

Libevent是一款事件驅動的網絡開發包,由于采用C語言開發體積小巧,跨平臺,速度極快。大量開源項目使用了Libevent比如谷歌的瀏覽器和分布式的高速緩存系統memcached。libevent支持kqueue,select,poll,epoll,iocp。內部事件機制完全獨立于公開事件API,libevent支持跨平臺可以在Linux,*BSD,MacOSX,Solaris,Windows等平臺上編譯。

學習條件:具有一定的C/C++基礎,熟悉Linux

環境搭建

  • 配置zlib庫
# 1. 解壓zlib 1.2.11 tar xvf zlib-1.2.11.tar.gz # 2. 編譯 cd zlib-1.2.11/ ./configure make make install
  • 配置openssl庫
# 1. 解壓openssl-1.1.1.tar.gz tar xvf openssl-1.1.1.tar.gz # 2. 編譯 cd openssl-1.1.1/ ./configure make make install
  • 配置libevent環境
# 1.加壓liebevent 2.1.8 unzip libevent-master.zip # 2. 編譯 cd libevent-master/ ./autogen.sh ./configure make make install # 3.將動態路來連接到 /usr/lib 下或者執行以下 ldconfig sudo ln -s /usr/local/lib/libevent-2.2.so.1 /usr/lib/libevent-2.2.so.1

實戰實例

創建event_base

僅僅實現創建上下文

/**** 創建event base* */#include <event2/event.h> #include <iostream> using namespace std; int main() {std::cout << "test libevent!\n"; //創建libevent的上下文event_base * base = event_base_new();if (base){cout << "event_base_new success!" << endl;}return 0; }

創建test_server

test_server中說明了如何使用libevent創建一個socket監聽

evconnlistener_new_bind一個接口完成了socket的創建,綁定和監聽。

/**** 創建event base* */#include <event2/event.h> #include <iostream> #include <signal.h> #include <event2/listener.h> #include <string.h> #include "event_interface.h"using namespace std;/**A callback that we invoke when a listener has a new connection.@param listener The evconnlistener@param fd The new file descriptor@param addr The source address of the connection@param socklen The length of addr@param user_arg the pointer passed to evconnlistener_new()*/ void listen_cb(struct evconnlistener * evConnListener, evutil_socket_t evUtilSockFd, struct sockaddr * sockAddr, int socklen, void *data) {cout << "listen cb is called" << endl; }int main(int argc, char *argv[]) {//1. 忽略管道信號,發送數據給已關閉的socket//一些socket程序莫名宕掉的原因if(signal(SIGPIPE, SIG_IGN) == SIG_ERR){cout << "ignal pipe signal" << endl;}std::cout << "test libevent!\n"; //創建libevent的上下文event_base * base = event_base_new();if (!base){cout << "event_base_new failed." << endl;return -1;}else{cout << "event_base_new success!" << endl;}//監聽端口//socket, bind, listensockaddr_in sockIn;memset(&sockIn, 0, sizeof(sockIn));sockIn.sin_family = AF_INET;sockIn.sin_port = htons(SERVER_PORT);/* 地址沒有指定因為對sockIn進行了了memset,地址賦值為0代表著可以為任意可以用的地址 */struct evconnlistener *pEvListener = evconnlistener_new_bind(base, /* libevent的上下文 */listen_cb, /* 接收到連接的回調 */base, /* 回調函數參數 */LEV_OPT_REUSEABLE|LEV_OPT_CLOSE_ON_FREE, /* 地址重用,evconnlistenner關閉同時關閉socket */10, /* 連接隊列的大小,對應的listen函數 */(sockaddr *)&sockIn, /* 綁定地址和端口 */sizeof(sockIn));//事件分發處理if(base)event_base_dispatch(base);if(pEvListener)evconnlistener_free(pEvListener);if(base)event_base_free(base);return 0; }

創建test_conf

test_conf主要是實現了,測試當前系統中支持的方法類型和事件特征的支持情況。

support methods epoll poll selectEV_FEATURE_ET events are supported. EV_FEATURE_O1 events are supported. EV_FEATURE_FDS events are not supports. EV_FEATURE_EARLY_CLOSE events are supported. event base new with config sucess #include <event2/event.h> #include <event2/thread.h> #include <event2/listener.h> #include <signal.h> #include <iostream> #include <string.h> #include "event_interface.h"using namespace std;int main() {//忽略管道信號,發送數據給已關閉的socketif (signal(SIGPIPE, SIG_IGN) == SIG_ERR)return 1;//創建配置上下文event_config *config = event_config_new();//顯示支持的網絡模式const char **methods = event_get_supported_methods();cout << "support methods " << endl;for(int i = 0; methods[i] != NULL; i++){cout << methods[i] << endl;}//設置特征,確認特征時候生效//這個features在linux中設置沒有效果,因為linux中本來就是支持ET模式的,邊緣觸發模式// 設置了EV_FEATURE_FDS其他特征嗯就無法設置//也就是所支持了EV_FEATURE_FDS 其他的特征都是無法支持的int ret = event_config_require_features(config, EV_FEATURE_ET|EV_FEATURE_EARLY_CLOSE);if(OK != ret){cerr << "event config require features failed." << endl;return ERROR; }//初始化libevent上下文event_base *base = event_base_new_with_config(config);//config一旦配置好就不需要在使用了event_config_free(config);if(!base){cerr << "event base new with config failed!" << endl;//首次失敗就創建一個base取默認值,若是再次失敗就返回失敗base = event_base_new();if(!base){cerr << "event base new failed." << endl; return ERROR;}}else{//確認特征那些生效int f = event_base_get_features(base);if(f&EV_FEATURE_ET){cout << "EV_FEATURE_ET events are supported." << endl;}else{cout << "EV_FEATURE_ET events are not supports." << endl;}if(f&EV_FEATURE_O1){cout << "EV_FEATURE_O1 events are supported." << endl;}else{cout << "EV_FEATURE_O1 events are not supports." << endl;}if(f&EV_FEATURE_FDS){cout << "EV_FEATURE_FDS events are supported." << endl;}else{cout << "EV_FEATURE_FDS events are not supports." << endl;}if(f&EV_FEATURE_EARLY_CLOSE){cout << "EV_FEATURE_EARLY_CLOSE events are supported." << endl;}else{cout << "EV_FEATURE_EARLY_CLOSE events are not supports." << endl;}cout << "event base new with config sucess" << endl;event_base_free(base);}return 0; }

總結

以上是生活随笔為你收集整理的Libevent事件的创建-scoke服务的创建-特征的获取和配置的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。