libevent初体验
来源:互联网 发布:sql server 双机冗余 编辑:程序博客网 时间:2024/05/13 08:47
libevent是一个高性能的事件触发的网络库,采用C语言编写,它使用事件机制出发某些操作,它能够跨平台使用。
libevent包括事件管理,缓存管理,DNS,HTTP,缓存事件几个部分。
它三种类型的事件,分别是网络IO、定时器、信号三种。
支持多线程,每个线程中需要关联到自己的event_base上。
libevent的一些使用资料:
libevent的简单使用
http://blog.csdn.net/mafuli007/article/details/7476014定时器的使用
此处展示的是怎样使用定时器事件,每隔一秒输出一次Game Over!
#include <cstdio>#include <iostream>#include <cstdlib>#include <event.h>using namespace std;void onTime(int sock, short event, void *arg){ cout << "Game Over!" << endl; struct timeval tv; tv.tv_sec = 1; tv.tv_usec = 0; event_add((struct event*)arg, &tv);}int main(int argc, char *argv[]){ int ret = EXIT_SUCCESS; event_init(); //初始化libevent库 struct event evTime; evtimer_set(&evTime, onTime, &evTime);//给event赋值 struct timeval tv; tv.tv_sec = 1; tv.tv_usec = 0; event_add(&evTime, &tv);//将event增加到事件监控中 event_dispatch();//开始事件循环 return ret;}
- TCP服务器
这个例子展示了怎样使用IO事件,此处使用的是网络IO,当客户端发送数据到服务端时,服务端会触发IO事件,然后输出内容。
#include <cstdio>#include <cstring>#include <cstdlib>#include <iostream>#include <event.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <netdb.h>using namespace std;struct event_base *base;int server(int argc, char *argv[]);int client(int argc, char *argv[]);void onRead(int iCliFd, short iEvent, void *arg){ int iLen; char buf[1500]; iLen = recv(iCliFd, buf, 1500, 0); if(iLen <= 0) { cout << "Client Close" << endl; struct event *pEvRead = (struct event *)arg; event_del(pEvRead); delete pEvRead; close(iCliFd); return; } buf[iLen] = 0; cout << "Client Info:" << buf << endl;}void onAccept(int iSvrFd, short iEvent, void *arg){ int iCliFd; struct sockaddr_in sCliAddr; socklen_t iSinSize = sizeof(sCliAddr); iCliFd = accept(iSvrFd, (struct sockaddr *)&sCliAddr, &iSinSize); struct event *pEvRead = new event; event_set(pEvRead, iCliFd, EV_READ|EV_PERSIST, onRead, pEvRead); event_base_set(base, pEvRead); event_add(pEvRead, NULL);}int main(int argc, char *argv[]){ int ret = 0; if(argc == 2) { if(strcmp(argv[1], "server") == 0) { ret = server(argc, argv); } else if(strcmp(argv[1], "client") == 0) { ret = client(argc, argv); } }}int client(int argc, char *argv[]){ int sockfd, n; char recvline[4096], sendline[4096]; struct sockaddr_in servaddr; sockfd = socket(AF_INET, SOCK_STREAM, 0); memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = inet_addr("127.0.0.1"); servaddr.sin_port = htons(8888); if(connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0) { printf("connect error!\n"); exit(0); } strcpy(sendline, "hello world!"); send(sockfd, sendline, strlen(sendline), 0); close(sockfd); return 0;}int server(int argc, char *argv[]){ int iSvrFd; struct sockaddr_in sSvrAddr; memset(&sSvrAddr, 0, sizeof(sSvrAddr)); sSvrAddr.sin_family = AF_INET; sSvrAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); sSvrAddr.sin_port = htons(8888); iSvrFd = socket(AF_INET, SOCK_STREAM, 0); bind(iSvrFd, (struct sockaddr*)&sSvrAddr, sizeof(sSvrAddr)); listen(iSvrFd, 0); base = event_base_new(); struct event evListen; event_set(&evListen, iSvrFd, EV_READ|EV_PERSIST, onAccept, NULL); event_base_set(base, &evListen); event_add(&evListen, NULL); event_base_dispatch(base); return 0;}
0 0
- libevent初体验
- libevent初体验
- libevent(1):初起步
- libevent
- libevent
- libevent
- libevent
- libevent
- libevent
- libevent
- libevent
- libevent
- libevent
- libevent
- libevent
- libevent
- libevent
- libevent
- git删除提交
- [授权发表]Linux 段错误详解
- 155Min Stack
- 【Java】集合总结
- HashMap的非线程安全性和ConcurrentHasMap
- libevent初体验
- 背包型动态规划练习-codevs-1014装箱问题
- Hadoop 2.4.0+zookeeper3.4.6+hbase0.98.3分布式集群搭建
- 五边形型数
- java4Android笔记(3)-变量-数据类型-基本数据类型
- 亚马逊云服务推出文件存储服务
- LintCode-最小调整代价
- 欢迎使用CSDN-markdown编辑器
- ListView优化总结