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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...