libev

本文介绍了libev,一个简洁且高性能的异步事件库,对比了libevent和libuv。libev在Linux下利用epoll,Windows上使用其他机制。文章通过一个简单的Buffer类展示了libev如何用于网络服务器,并强调了异步架构设计原则:回调函数应快速执行,尽量使用库的内部时间机制。
摘要由CSDN通过智能技术生成

开始之前先看一下libevent libev libuv,参考附录1.

本着我自己的个性,我喜欢简单的东西,越简单越好,越傻越好,所以在此我考虑libev,只是tmd,libev的官网打不开,真是无语了。

上例子:

buffer.h

 
#include<iostream>
#include<stdio.h>
#include<string.h>
 
using namespace std;
#define default_buf_size 256
class Buffer
{
    public:
        Buffer()
        {
            buf = new char[default_buf_size];
            buflen = default_buf_size;
        }
        ~Buffer()
        {
            delete[] buf;
        }
        void set_write_buf_size(int needsize)
        {
            int buf_size = writeIdx + needsize;
            if(buf_size <= buflen)
                return;                
            if(needsize < readIdx)
            {
                memmove(buf, buf+readIdx, writeIdx-readIdx);
                writeIdx -= readIdx;
                readIdx = 0;
                return;
            }
            while(buflen < buf_size)
                buflen *= 2;
 
            char *oldbuf = buf;
            buf = new char[buflen];
            memcpy(buf, oldbuf+readIdx, writeIdx-readIdx);
            delete[] oldbuf;
            writeIdx -= readIdx;
            readIdx = 0;
            
        }
        int get_readable_size()
        {
            return writeIdx-readIdx;
        }
        int get_writeable_size()
        {
            return buflen-writeIdx;
        }
 
        void writebuf(void *data, int datalen)
        {
            set_write_buf_size(datalen);
            memcpy(buf+writeIdx, data, datalen);
            writeIdx += datalen;
        }
 
        int writeIdx;
        int readIdx;
        int buflen;
        char *buf;
};
 

 

libev_server.cpp:

#include <iostream>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
#include <netinet/in.h>
#include <errno.h>
#include <stdlib.h>
#include "./libev/ev++.h"
#include "./libev/ev.h"
#include <stdio.h>
#include <linux/tcp.h>
#include "buffer.h"
 
class NetServer{
public:
   NetServer(){ sockfd = -1;}
   ~NetServer(){}
   void start();
   void accept_cb(ev::io &watcher, int revents);
   void read_cb(ev::io &watcher, int revents);
   void write_cb(ev::io &wather, int revents);
   void timer_cb(ev::timer &watcher, int revents);
   void Close();
private:
   int sockfd;
   ev::default_loop loop;
   ev::io read_io;
   ev::io write_io;
   Buffer readbuf;

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值