黑马程序员C语言教程:libevent.docx_第1页
黑马程序员C语言教程:libevent.docx_第2页
黑马程序员C语言教程:libevent.docx_第3页
黑马程序员C语言教程:libevent.docx_第4页
黑马程序员C语言教程:libevent.docx_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

标题: 深入浅出-服务器高并发库libevent(一)1安装libevent是一个开源的高并发服务器开发包,官方地址/libevent目前有两个版本一个是1.4系列版本,一个是2.0系列版本。我们可以在官方网站上看到类似 有个stable表示稳定版本。 libevent-1.4.15-stable.tar.gz对于初学者学习,建议从1.4版本学起。在安装libevent之前先判断本电脑是否已经安装了通过指令ls -al /usr/lib|grep libevent如果没有任何信息则表示没有安装,有的话如果发现libevent是1.3以下版本,则可以同过执行 rpm -e libevent nodeps进行卸载。如果是其他操作系统使用其他对应卸载指令即可。对于下好的tar包,通过tar -zxvf libevent-release-1.4.15-stable.tar.gz指令解压。然后执行./configure命令,但是有的包可能没有configure文件,却存在一个autogen.sh 脚本,运行这个脚本。(如果运行不起来请安装autoconf包)然后./configure prefix=/usrmakesudo make install安装完之后执行ls -al /usr/lib/|grep libevent如果发现有libevent文件库存在就代表安装完毕。2 简单的libevent服务器我们通过连接libevent库来进行管理libevent库,所以在使用gcc或者g+编译的时候最后需要加上-levent下面是一个简单的libevent服务器。#include #include #include #include #include #include #include #include #include using namespace std; #define SERVER_ADDR #define SERVER_PORT 8888/ 事件base struct event_base* base; / 读事件回调函数 void onRead(int iCliFd, short iEvent, void *arg) int iLen; char buf1500; iLen = recv(iCliFd, buf, 1500, 0); if (iLen = 0) cout Client Close endl; / 连接结束(=0)或连接错误(0),将事件删除并释放内存空间 struct event *pEvRead = (struct event*)arg; event_del(pEvRead); delete pEvRead; close(iCliFd); return; bufiLen = 0; cout Client Info: buf wm_read.high = 4096; char MESSAGE=welcome to server.; bufferevent_write(buf_ev, MESSAGE, strlen(MESSAGE); / 连接请求事件回调函数 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); / 连接注册为新事件 (EV_PERSIST为事件触发后不默认删除) struct event *pEvRead = new event; event_set(pEvRead, iCliFd, EV_READ|EV_PERSIST, onRead, pEvRead); event_base_set(base, pEvRead); event_add(pEvRead, NULL); struct bufferevent* buf_ev; buf_ev = bufferevent_new(iCliFd, NULL, NULL, NULL, NULL); buf_ev-wm_read.high = 4096; char MESSAGE=welcome to server.; bufferevent_write(buf_ev, MESSAGE, strlen(MESSAGE); couta client connect:iCliFdendl; int main() int iSvrFd; struct sockaddr_in sSvrAddr; memset(&sSvrAddr, 0, sizeof(sSvrAddr); sSvrAddr.sin_family = AF_INET; sSvrAddr.sin_addr.s_addr = inet_addr(SERVER_ADDR); sSvrAddr.sin_port = htons(SERVER_PORT); / 创建tcpSocket(iSvrFd),监听本机8888端口 iSvrFd = socket(AF_INET, SOCK_STREAM, 0); bind(iSvrFd, (struct sockaddr*)&sSvrAddr, sizeof(sSvrAddr); listen(iSvrFd, 10); / 初始化base base = (struct event_base*)event_init(); struct event evListen; / 设置事件 event_set(&evListen, iSvrFd, EV_READ|EV_PERSIST, onAccept, NULL); / 设置为base事件 event_base_set(base, &evListen); / 添加事件 event_add(&evListen, NULL); / 事件循环 event_base_dispatch(base); return 0; 通过编译指令g+ server.cpp -o server -Wall -g -I ./ -levent得到可执行程序./server启动。如果能够编译成功并且能够正常启动,说明你操作系统的libevent安装时没问题的。然后可以通过命令nc 8888来进行测试。或者编写如下客户端代码:/* 客户端程序 client.c */#include #include #include #include #include #include #include #include #include #include #include#include#define SERVER_ADDR #define SERVER_PORT 8888int main(int argc, char *argv) int sockfd; char buffer1024; struct sockaddr_in server_addr; struct hostent *host; int portnumber,nbytes; if(host=gethostbyname(SERVER_ADDR)=NULL) fprintf(stderr,Gethostname errorn); exit(1); if(portnumber=SERVER_PORT)h_addr); /* 客户程序发起连接请求 */ if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr)=-1) fprintf(stderr,Connect Error:%san,strerror(errno); exit(1); while(true) char MESSAGE=hello server.n; /bufferevent_write(buf_ev,MESSAGE,strlen(MESSAGE); / if(-1 = (:send(sockfd,MESSAGE,strlen(MESSAGE),0) printf(the net has a error occured.); break; if(nbytes = read(sockfd,buffer,1024)=-1) fprintf(stderr,read error:%sn,strerror(errno); exit(1); buffernbytes=0; printf(I have received:%sn,buffer); m

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论