开始之前先看一下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;