(十一)libevent库的使用

参考:

1. libevent

使用第三方库我一般都偏爱最新的版本,libevent也是如此,所以我以 libevent-2.1.8-stable.tar.gz为例,在官网上可以下载。

编译、使用

./configure
make

头文件在include文件夹下,编译生成的动态库在.libs文件夹下。

使用时,需要包含头文件和连接libevent.so动态库。

2. 示例

2.1 TcpServer.h

#ifndef TCP_SERVER_H
#define TCP_SERVER_H

struct event_base;

class TcpServer
{
public:
    using callback = void(int, short, void*);
    //typedef void (callback)(int, short, void*);

public:
    TcpServer(const int port);
    ~TcpServer();

    int Initialize();

    int Start();

    void Process();

private:
    int m_fd;
    int m_port;
    event_base* m_base;
    callback *m_accept_callback;
};

#endif  // TCP_SERVER_H

2.2 TcpServer.cpp

#include "TcpServer.h"

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>

#include "event.h"

void accept_cb(int fd, short events, void* arg)
{
    struct sockaddr_in client;
    socklen_t len = sizeof(client);

    int sockfd = ::accept(fd, (struct sockaddr*)&client, &len );
    printf("accept a client %d\n", sockfd);

    TcpServer *pServer = static_cast<TcpServer*>(arg);
    pServer->Process();

    close(sockfd);
}

TcpServer::TcpServer(const int port):
    m_fd(-1),
    m_port(port),
    m_base(nullptr),
    m_accept_callback(nullptr)
    {
        m_accept_callback = accept_cb;
    }

TcpServer::~TcpServer()
{

}

int TcpServer::Initialize()
{
    m_fd = ::socket(AF_INET, SOCK_STREAM, 0);
    if( m_fd == -1 )
        return -1;

    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_addr.s_addr = 0;
    sin.sin_port = htons(m_port);

    if( ::bind(m_fd, (struct sockaddr *)&sin, sizeof(sin)) < 0 )
    {
        return -2;
    }

    if( ::listen(m_fd, 10) < 0)
    {
        return -3;
    }

    return 0;
}

int TcpServer::Start()
{
    m_base = event_base_new();
    if(nullptr == m_base)
    {
        return -4;
    }

    //添加监听客户端请求连接事件
    struct event* ev_listen = event_new(m_base, m_fd, EV_READ | EV_PERSIST,
                                        m_accept_callback, this);
    event_add(ev_listen, NULL);

    event_base_dispatch(m_base);

    return 0;
}

void TcpServer::Process()
{
    printf("process...\n");
}

2.3 server.cpp

#include "TcpServer.h"

#include <unistd.h>
#include <memory>
#include <iostream>
using namespace std;

int main()
{
    shared_ptr<TcpServer> spServer = make_shared<TcpServer>(999);
    spServer->Initialize();
    spServer->Start();

    // while(true)
    // {
    //  sleep(1);
    // }
    return 0;
}

2.4 CMakeLists.txt

cmake_minimum_required(VERSION 2.6)
project(demo)

# 设置编译器(gcc/g++)
set(CMAKE_CXX_COMPILER "g++")

#设置Debug/Release
set(CMAKE_BUILD_TYPE "Debug")

# 设置编译选项
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread -g -Wall")

# 设置可执行二进制文件的目录
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)

# 设置存放编译出来的库文件的目录
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
# 并把该目录设置为链接目录
link_directories(${PROJECT_SOURCE_DIR}/lib)

# 设定头文件目录
include_directories(${PROJECT_SOURCE_DIR}/include)

# 增加子文件夹(src路径是通过子文件夹形式添加)
add_subdirectory(${PROJECT_SOURCE_DIR}/src)
# 编译静态链接库libhello.a
# add_library(hello hello.cpp)

add_executable(server server.cpp TcpServer.cpp)
target_link_libraries(server libevent.so)

2.5 测试

可以通过curl命令来查看是否可以连接服务器

curl http://ip:port

原文地址:https://www.cnblogs.com/walkinginthesun/p/9403648.html

时间: 2024-11-14 12:11:32

(十一)libevent库的使用的相关文章

R1:创建Libevent库

原文链接:http://www.wangafu.net/~nickm/libevent-book/Ref1_libsetup.html Setting up the Libevent library Libevent有一些被整个进程共享的全局设置.这些设置会影响到整个库.在使用Libevent库的其余部分之前,你应该先对这些设置做些修改.否则的话Libevent可能会以一种前后矛盾的状态终止( If you don’t, Libevent could wind up in an inconsis

Libevent库学习笔记

Libevent是一个事件触发的网络库,适用于windows.linux.bsd等多种平台,Libevent在底层select.pool.kqueue和epoll等机制基础上,封装出一致的事件接口.可以注册可读.可写.超时等事件,指定回调函数:当事件发生后,Libevent调用回调函数,可以在回调函数里实现自定义功能.编译库代码,编译脚本会判断OS支持哪种类型的事件机制(select.epoll或kqueue),然后条件编译相应代码,供上层使用的接口仍然是保持统一的. 著名分布式缓存软件memc

MAC OS下编译apple跨平台的libevent库 (可延申到其它第三库)

apple下的跨平台是指不同设备上的苹果系统以及同一系统在不同cpu体系的不同版本. 前面一篇介绍如何用ndk编译android跨平台的第三库,那样的方法却不能应用在apple上. 网上可以找到这么一个脚本,其主要过程和功能如下图: 脚本主要依靠了xcrun -sdk命令来搜索出平台关联的编译程序和SDK目录位置.不像ndk的目录结构,苹果的目录结构不清晰有些又不统一,xcrun就是这个咨客,问它就是了. 只要将脚本中相应的容器修改就可以应用到其它第三库的编译中去. 接下来就编译过程中的怪问题.

C10K问题和Libevent库介绍

http://blog.chinaunix.net/uid-20761674-id-75056.html 一.C10K的问题 C10K的问题在上个世纪90年代就被提出来了.大概的意思是当用户数超过1万时,很多设计不良好的网络服务程序性能都将急剧下降.甚至瘫痪.并且,这个问题并不能通过升级硬件设备解决,是操作系统固有的问题,也就是说,如果你的服务器最高能支撑1000个并发,尽管你升级了计算能力高一倍的 cpu,内存再翻一番,硬盘转速在快一倍,也无法支撑2000个并发. 经典的网络编程模型有4个:

Libevent源码分析—从使用Libevent库开始

练习libevent库的使用,主要是几个API的调用顺序.根据event.h的开头注释部分可知,要使用libevent库,主要的几个API及调用顺序为: event_base()初始化event_base event_set()初始化event event_base_set()将event绑定到指定的event_base上 event_add()将event添加到事件链表上,注册事件 event_base_dispatch()循环.检测.分发事件 写个测试程序,每隔1s打印一条信息 #inclu

libevent库简单使用

一.libevent库简介 Libevent是一个用于开发可扩展性网络服务器的基于事件驱动(event-driven)模型的网络库.Libevent有几个显著的亮点: (1)事件驱动(event-driven),高性能:(2)轻量级,专注于网络,不如 ACE 那么臃肿庞大: (3)源代码相当精炼.易读: (4)跨平台,支持 Windows.Linux.*BSD和 Mac Os: (5)支持多种 I/O多路复用技术, epoll.poll.dev/poll.select 和kqueue 等: (6

cocos2dx加libevent库

路径: $path = cocos2dx/platform/third_party 1.win32 将生成的libevent_core.lib,libevent_extras.lib放到$path/win32/libraries中 头文件event2和event-config.h 放到$path/win32/libevent中 VS中设置include path和 add lib 2.ios 生成IOS平台的库文件(libevent_core.a,libevent_extra.a,libeven

Libevent库 编译与使用

Libevent官网:http://libevent.org/ windows 7下编译: 编译环境: windows 7 + VS2010 (1)解压libevent到F:\libevent\libevent-2.0.21-stable (2)打开Microsoft visual studio 2010命令行工具或者(call "C:/Program Files/Microsoft Visual Studio 10.0/VC/bin/vcvars32.bat" ) 设置vc10环境

&lt;C++学习十一&gt;标准库string的使用(未完待续)

使用: 1.C++标准库负责管理和存储字符串所占用的内存: 2.头文件:#include<string> 3.空间域:using namespace std. string的对象的初始化的方法: string();//空串 string(size_type length,char ch);//以length为长度的ch拷贝 string(const char *str);//以str为初值 string(const char *str,size_type length);//同上 string