libevent源码分析-TCP服务端代码

先贴一段代码再说,Linux下使用g++ -g-o server server.c -levent

可以直接使用gdb调试,而且可以跟踪到libevent的库里。

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <iostream>
  4 #include <sys/socket.h>
  5 #include <netinet/in.h>
  6 #include <arpa/inet.h>
  7 #include <netdb.h>
  8
  9 #include <event.h>
 10 using namespace std;
 11
 12 // 事件base
 13 struct event_base* base;
 14
 15 // 读事件回调函数
 16 void onRead(int iCliFd, short iEvent, void *arg)
 17 {
 18     int iLen;
 19     char buf[1500];
 20
 21     iLen = recv(iCliFd, buf, 1500, 0);
 22
 23     if (iLen <= 0) {
 24         cout << "Client Close" << endl;
 25
 26         // 连接结束(=0)或连接错误(<0),将事件删除并释放内存空间
 27         struct event *pEvRead = (struct event*)arg;
 28         event_del(pEvRead);
 29         delete pEvRead;
 30
 31         close(iCliFd);
 32         return;
 33     }
 34
 35     buf[iLen] = 0;
 36     cout << "Client Info:" << buf << endl;
 37
 38
 39
 40     struct bufferevent* buf_ev;
 41     buf_ev = bufferevent_new(iCliFd, NULL, NULL, NULL, NULL);
 42     buf_ev->wm_read.high = 4096;
 43     char MESSAGE[]="welcome to server..";
 44     bufferevent_write(buf_ev, MESSAGE, strlen(MESSAGE));
 45 }
 46
 47 // 连接请求事件回调函数
 48 void onAccept(int iSvrFd, short iEvent, void *arg)
 49 {
 50     int iCliFd;
 51     struct sockaddr_in sCliAddr;
 52
 53     socklen_t iSinSize = sizeof(sCliAddr);
 54     iCliFd = accept(iSvrFd, (struct sockaddr*)&sCliAddr, &iSinSize);
 55
 56     // 连接注册为新事件 (EV_PERSIST为事件触发后不默认删除)
 57     struct event *pEvRead = new event;
 58     event_set(pEvRead, iCliFd, EV_READ|EV_PERSIST, onRead, pEvRead);
 59     event_base_set(base, pEvRead);
 60     event_add(pEvRead, NULL);
 61
 62
 63     struct bufferevent* buf_ev;
 64      buf_ev = bufferevent_new(iCliFd, NULL, NULL, NULL, NULL);
 65      buf_ev->wm_read.high = 4096;
 66      char MESSAGE[]="welcome to server..";
 67     bufferevent_write(buf_ev, MESSAGE, strlen(MESSAGE));
 68
 69     cout<<"a client connect:"<<iCliFd<<endl;
 70 }
 71
 72 int main()
 73 {
 74
 75     int iSvrFd;
 76     struct sockaddr_in sSvrAddr;
 77
 78     memset(&sSvrAddr, 0, sizeof(sSvrAddr));
 79     sSvrAddr.sin_family = AF_INET;
 80     sSvrAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
 81     sSvrAddr.sin_port = htons(8888);
 82
 83     // 创建tcpSocket(iSvrFd),监听本机8888端口
 84     iSvrFd = socket(AF_INET, SOCK_STREAM, 0);
 85     bind(iSvrFd, (struct sockaddr*)&sSvrAddr, sizeof(sSvrAddr));
 86     listen(iSvrFd, 10);
 87
 88     // 初始化base
 89     base = (struct event_base*)event_init();
 90
 91     struct event evListen;
 92     // 设置事件
 93     event_set(&evListen, iSvrFd, EV_READ|EV_PERSIST, onAccept, NULL);
 94     // 设置为base事件
 95     event_base_set(base, &evListen);
 96     // 添加事件
 97     event_add(&evListen, NULL);
 98
 99     // 事件循环
100     event_base_dispatch(base);
101
102     return 0;
103 }    

时间: 2024-10-08 12:56:07

libevent源码分析-TCP服务端代码的相关文章

zookeeper源码分析之五服务端(集群leader)处理请求流程

leader的实现类为LeaderZooKeeperServer,它间接继承自标准ZookeeperServer.它规定了请求到达leader时需要经历的路径: PrepRequestProcessor -> ProposalRequestProcessor ->CommitProcessor -> Leader.ToBeAppliedRequestProcessor ->FinalRequestProcessor 具体情况可以参看代码: @Override protected v

zookeeper源码分析之一服务端处理请求流程

上文: zookeeper源码分析之一服务端启动过程 中,我们介绍了zookeeper服务器的启动过程,其中单机是ZookeeperServer启动,集群使用QuorumPeer启动,那么这次我们分析各自一下消息处理过程: 前文可以看到在 1.在单机情况下NettyServerCnxnFactory中启动ZookeeperServer来处理消息: public synchronized void startup() { if (sessionTracker == null) { createSe

netty源码分析之服务端启动

ServerBootstrap与Bootstrap分别是netty中服务端与客户端的引导类,主要负责服务端与客户端初始化.配置及启动引导等工作,接下来我们就通过netty源码中的示例对ServerBootstrap与Bootstrap的源码进行一个简单的分析.首先我们知道这两个类都继承自AbstractBootstrap类 接下来我们就通过netty源码中ServerBootstrap的实例入手对其进行一个简单的分析. // Configure the server. EventLoopGrou

TeamTalk源码分析之服务端描述

TTServer(TeamTalk服务器端)主要包含了以下几种服务器: LoginServer (C++): 登录服务器,分配一个负载小的MsgServer给客户端使用 MsgServer (C++): 消息服务器,提供客户端大部分信令处理功能,包括私人聊天.群组聊天等 RouteServer (C++): 路由服务器,为登录在不同MsgServer的用户提供消息转发功能 FileServer (C++): 文件服务器,提供客户端之间得文件传输服务,支持在线以及离线文件传输 MsfsServer

【转】libevent源码分析

libevent源码分析 转自:http://www.cnblogs.com/hustcat/archive/2010/08/31/1814022.html 这两天没事,看了一下Memcached和libevent的源码,做个小总结. 1.入门 1.1.概述Libevent是一个用于开发可扩展性网络服务器的基于事件驱动(event-driven)模型的网络库.Libevent有几个显著的亮点: (1)事件驱动(event-driven),高性能:(2)轻量级,专注于网络,不如 ACE 那么臃肿庞

Libevent源码分析-timer和signal处理

timer处理 Signal处理 timerfd和signalfd timerfd signalfd timer处理 在Libevent源码分析-event处理流程中,使用了定时器,来看一下源码: evtimer_set(&ev, time_cb, NULL);//设置定时器事件 其中evtimer_set是个宏定义 #define evtimer_set(ev, cb, arg) event_set((ev), -1, 0, (cb), (arg)) //event_set原型 void ev

Libevent源码分析 (1) hello-world

Libevent源码分析 (1) hello-world ⑨月份接触了久闻大名的libevent,当时想读读源码,可是由于事情比较多一直没有时间,现在手头的东西基本告一段落了,我准备读读libevent的源码,凡是我觉得有必要的内容均一一记录,与君共勉. 首先要说说什么是libevent: libevent是一个事件通知库,libevent API提供一种机制使得我们可以在一个文件描述符(file descriptor)发生特定事件时或者timeout发生时执行指定的回调函数.libevent意

源码分析Dubbo服务消费端启动流程

通过前面文章详解,我们知道Dubbo服务消费者标签dubbo:reference最终会在Spring容器中创建一个对应的ReferenceBean实例,而ReferenceBean实现了Spring生命周期接口:InitializingBean,接下来应该看一下其afterPropertiesSet方法的实现. 1.源码分析ReferenceBean#afterPropertiesSet ReferenceBean#afterPropertiesSet if (getConsumer() ==

[libevent源码分析] event_init

libevent采用的是经典的reactor网络框架,集成了信号.定时.网络事件于一体 首先对event_init进行源码剖析 event_init 主要创建event_base对象, struct event_base { const struct eventop *evsel; //lievent支持select epoll kequeue..等网络api,包括init.add.del.dispatch的接口,每种网络框架都支持 void *evbase; //支持相应网络api的 结构对象