libevent 實現的socket 通信 server以及解決找不到動態庫的方法

来源:https://www.cnblogs.com/jiujue/archive/2019/03/29/10623258.html
-Advertisement-
Play Games

註: client 個人覺得沒必要用 libvent來實現就沒寫 註:由於 涉及到回調函數的使用 如有疑惑的可以先去瞭解回調函數的實現機理 先來說一下 libevent主要是幹啥的 : 內部封裝了 socket 通信 和 io 轉接函數 ,通過使用大量的回調使得不用考慮大量重覆的工作,並且其根據不同 ...


註: client 個人覺得沒必要用 libvent來實現就沒寫 

註:由於 涉及到回調函數的使用 如有疑惑的可以先去瞭解回調函數的實現機理

先來說一下 libevent主要是幹啥的 :

內部封裝了 socket 通信 和 io 轉接函數 ,通過使用大量的回調使得不用考慮大量重覆的工作,並且其根據不同平臺封裝了不同的io轉接函數,使其具有跨平臺的效果(這裡linux 封裝的是epoll)

下麵 直接上代碼 :

 

 1 // File Name: server.c
 2 // Author: jiujue
 3 // Created Time: 2019年03月29日 星期五 10時11分12秒
 4 
 5 #include<stdio.h>
 6 #include<string.h>
 7 #include<stdlib.h>
 8 #include<time.h>
 9 #include<math.h>
10 #include <event2/event.h>
11 #include <event2/bufferevent.h>
12 #include <event2/listener.h>
13 #include <unistd.h>
14 #include <arpa/inet.h>
15 
16 //read back call
17 void read_cb(struct bufferevent* bufev,void *ptr)
18 {
19     char buf[1024] = {0};
20     int len = bufferevent_read(bufev,buf,sizeof(buf));
21     if(len == -1)
22     {
23         perror("bufferevent_read error");
24         exit(1);
25     }
26     printf("receive info : %s\n ",buf);
27     sprintf(buf,"I have received it.\n");
28     bufferevent_write(bufev, buf, strlen(buf)+1);
29 
30 }
31 //write back call
32 void write_cb(struct bufferevent* bufev,void *ptr)
33 {
34     printf("I sent it out.\n");
35 }
36 //event back call
37 void event_cb(struct bufferevent* bufev,short ev, void *ptr)
38 {
39     if(ev & BEV_EVENT_EOF)
40     {
41         printf("have clinet disconnect.\n");
42     }
43     if(ev & BEV_EVENT_TIMEOUT) 
44     {
45         printf("happen timeout event , exit ....\n");
46         exit(1);
47     }
48     bufferevent_free(bufev);
49 }
50 //linsener back call
51 void listener_cb(struct evconnlistener *listener,evutil_socket_t fd, struct sockaddr* addr, int len ,void * ptr)
52 {
53 
54     struct event_base *base = (struct event_base*)ptr;
55     struct bufferevent *bufev =  bufferevent_socket_new(base,fd,BEV_OPT_CLOSE_ON_FREE);
56     bufferevent_setcb(bufev,read_cb,write_cb,event_cb,NULL);
57     bufferevent_enable(bufev,EV_READ);
58 }
59 
60 
61 int main(int argc, const char* argv[])
62 {
63     if(argc<2)
64     {
65             printf("argument not enough\neg: ./app port");
66             exit(1);
67     }
68     //event handler frmate
69     struct event_base * base = event_base_new();
70     //server addr
71     struct sockaddr_in server;
72     server.sin_family = AF_INET;
73     server.sin_addr.s_addr = htonl(INADDR_ANY);
74     server.sin_port = htons(atoi(argv[1]));
75 
76     //bind listener accept 
77     struct evconnlistener * listener = evconnlistener_new_bind(base,listener_cb,base,
78             LEV_OPT_CLOSE_ON_FREE | LEV_OPT_REUSEABLE, -1,
79             (struct sockaddr *)&server, sizeof(server));
80 
81     //start event loop
82     event_base_dispatch(base);
83 
84     //collector garbage
85     event_base_free(base);
86     evconnlistener_free(listener);
87 
88 
89     return 0 ;
90 }
View Code

 

 

 

註:如果在libevent庫使用的時候出現無法找到動態庫的可以百度解決 ;這裡提供一種方 分三步 1)找到 libevent.os.xxx 的位置 (一般在/usr/local/ 下 可以是用find命令找一下),2)將剛剛找到文件的絕對路徑複製到  /etc/ld.so.conf 文件里 , 3)執行 ldconfig -v 命令可以看到這裡剛那個複製的路徑已經在裡面了;這樣就解決了

結語:有問題歡迎提在下方 ,本人在校學生,時間較為充裕, 有時間會回覆的。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 其實很簡單,因為Combox的Item是一個K/V的object,那麼就可以把它的items轉換成IEnumerable<DictionaryEntry>類型的(System.Collections命名空間),然後根據要選中的Key或Value使用Lamda表達式來設置Combox的選中項。 比如當 ...
  • 從今天開始來學習如何在 ASP.NET Core 中構建 Web API 以及每項功能的最佳適用場景。 ...
  • DS密法是DYLIKE本人研發的一種針對文本字元串的高強度加密方法,本加密方法的優點是同源不同密,同一個源文本每次加密的結果都不同,長度也不同.密鑰最大可達String類型的字元最大長度.缺點是解密時間長,500字長度的密文解密約需半秒.適用於非頻繁的數據加密交換.註意,欲加密的源字串不能少於5字. ...
  • 今天應客戶要求,修改導出word模板。使用的是Aspose.Words插件。這個程式原是同事所寫,且自己對Aspose不是很瞭解。在替換木板上花費了一些時間。 先來一張圖:下圖是原來的模板。現在要求刪除“原始內容3”,在“原始內容1”上面添加“新內容”,假設新加“新內容”的分數占位符是“Rule1” ...
  • 第一步下載erlang環境並安裝: rpm -Uvh https://mirrors.aliyun.com/centos/7.6.1810/extras/x86_64/Packages/epel-release-7-11.noarch.rpm yum install erlang 第二步下載Rabb ...
  • 環境:MacOS 10.13.6 虛擬機:VirtualBox6.0(VirtualBox-6.0.4-128413-OSX.dmg) Linux:Centos7(CentOS-7-x86_64-Minimal-1810.iso) 一:虛擬機安裝 這個。。。。真沒啥好說的。。。略過 二:虛擬機創建C ...
  • 1. 主機規劃 Pillar文檔 註意事項 2. Grains VS Pillar 3. Pillar基本信息 4. 顯示系統自帶的pillar 系統自帶的pillar預設是不顯示的 註意:看完之後還原回去,因為數據較多。和自定義數據雜在一起,不方便查看 4.1. 修改配置文件並重啟服務 4.2. ...
  • 1. 主機規劃 Grains文檔 註意事項 修改了master或者minion的配置文件,那麼必須重啟對應的服務。 2. Grains基本信息 3. Grains優先順序信息 推薦使用 自編寫py腳本定義,這樣自定義的grains只需要在master端維護即可,減少後期維護成本。 下文內容就是根據優先 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...