最近在写项目的时候用到了libevent 发现有些不会用 现在总结一下
1 #include <stdio.h>
2 #include <iostream>
3 #include <sys/types.h>
4 #include <sys/socket.h>
5 #include <netinet/in.h>
6 #include <assert.h>
7 #include <stdlib.h>
8 #include <json/json.h>
9 #include <arpa/inet.h>
10 #include <event.h>
11 #include <unistd.h>
12 #include "fangfa.h"
13 #include "my_mysql.h"
14 #include "leixing.h"
15 using namespace std;
16 void onread(int c,short event,void *arg)
17 {
18 printf("endl\n");
19 char buff[100]={0};
20 recv(c,buff,100,0);
21 printf("%s\n",buff);
22
23 }
24 void onAccept(int fd,short event,void *arg)
25 {
26 struct sockaddr_in bddress;
27 socklen_t len=sizeof(bddress);
28 //cout<<"endl"<<endl;
29 struct event *event_t;
30 struct event_base*base=(struct event_base*)arg;
31 int c=accept(fd,(struct sockaddr*)&bddress,&len);
32 cout<<"end"<<endl;
33 event_t=event_new(base,c,EV_READ|EV_PERSIST,onread,NULL);
34 event_add(event_t,NULL);
35 // event_base_dispatch(base);
36 }
37 int main()
38 {
39 int sockfd=socket(AF_INET,SOCK_STREAM,0);
40 struct sockaddr_in address;
41 address.sin_family=AF_INET;
42 address.sin_port=htons(6000);
43 address.sin_addr.s_addr=inet_addr("127.0.0.1");
44 int ret=bind(sockfd,(struct sockaddr*)&address,sizeof(address));
45 assert(ret!=-1);
46 ret=listen(sockfd,5);
47 struct event_base* base=event_init();
48 struct event *event_t=event_new(base,sockfd,EV_READ|EV_PERSIST,onAccept, base);
49 event_add(event_t,NULL);
50 event_base_dispatch(base);
51 //struct event evListen;
52 //event_set(&evListen,sockfd,EV_READ|EV_PERSIST,onAccept,NULL);
53 //event_base_set(base,&evListen);
54 //event_add(&evListen,NULL);
55 //event_base_dispatch(base);
56 }
有些尴尬 只有这个过了 能连接多个客户端 简单介绍一下 在libevent 底层有一些io复用的技术 为什么用libevent 首先如果直接写epoll 那也比较麻烦 其次不知道 你自己写的高不高效 言归正传
我一开始 是直接创建了2个base 发现 两次调用event_base_dispatch(base)
发现最多只能连接一个客户端
其实 event_base_dispatch 这个事件循环只要一个就行这个就相当于一个监听的fd的一个函数一旦有事件那么就直接调用你绑定的回调函数里面 比如你是sockfd -》onaccept
你是c—》onread 函数 因为都是绑定在同一个base里面的