简单的libevent例子

server.cpp

#include <stdio.h>
#include <iostream>
#include <map>
#include <string.h>

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

#include <event2/event.h>
#include <event2/event_struct.h>
#include <event2/bufferevent.h>
#include <event2/buffer.h>

event_base *m_event_base = NULL;
evutil_socket_t m_listenfd = 0;
event *m_listenevent;
using namespace std;

map<evutil_socket_t, bufferevent*> map_tcpHander;

void tcperror_cb(struct bufferevent *bev, short what, void* ctx)
{
    evutil_socket_t bufferfd = bufferevent_getfd(bev);
    evutil_closesocket(bufferfd);
    map<evutil_socket_t, bufferevent*>::iterator it = map_tcpHander.find(bufferfd);
    if (it != map_tcpHander.end())
    {
        map_tcpHander.erase(it);
    }

}

void tcpwrite_cb(struct bufferevent *bev, void *ctx)
{
    cout << "write success!" << endl;
    return;
}

void tcpread_cb(struct bufferevent *bev, void *ctx)
{
    evutil_socket_t bufferfd = bufferevent_getfd(bev);
    map<evutil_socket_t, bufferevent*>::iterator it = map_tcpHander.find(bufferfd);
    if (it != map_tcpHander.end())
    {
        bufferevent* buffer_event = it->second;
        evbuffer *inputbuf = bufferevent_get_input(buffer_event);
        size_t inputLen = evbuffer_get_length(inputbuf);
        while (inputLen > 0)
        {
            char data[1024] = { 0 };
            size_t len = bufferevent_read(buffer_event, data, 1024);
            cout << " read data = " << data << endl;
            inputLen -= len;
        }
        
        char * resp = "server resp data.";
        size_t n = bufferevent_write(buffer_event, resp, strlen(resp));
        if (n < 0)
        {
            cout << "write to client failed." << endl;
            return;
        }
        bufferevent_enable(buffer_event, EV_WRITE);
    }
}
void listen_accept_cb(evutil_socket_t fd, short what, void *p)
{
    sockaddr_in serveraddr;
    memset(&serveraddr, 0, sizeof(serveraddr));
    size_t addrlen = sizeof(serveraddr);

    evutil_socket_t acceptfd = accept(fd, (sockaddr *)&serveraddr, (socklen_t *)&addrlen);
    if (acceptfd == -1)
    {
        printf("accept failed.\n");
        return;
    }

    event_base *eventbase = (event_base*)p;
    bufferevent *buffersocket = bufferevent_socket_new(eventbase, acceptfd, BEV_OPT_CLOSE_ON_FREE);
    bufferevent_setcb(buffersocket, tcpread_cb, tcpwrite_cb, tcperror_cb, eventbase);
    bufferevent_enable(buffersocket, EV_READ);

    cout << "new connect accept:" << inet_ntoa(serveraddr.sin_addr) << endl;

    map_tcpHander.insert(make_pair(acceptfd, buffersocket));
}

int initevent()
{
    m_event_base = event_base_new();
    m_listenfd = socket(AF_INET, SOCK_STREAM, 0);
    if (m_listenfd == -1)
    {
        printf("socket init failed.\n");
        return -1;
    }
    sockaddr_in listenAddr;
    memset(&listenAddr, 0, sizeof(listenAddr));

    listenAddr.sin_addr.s_addr = INADDR_ANY;//INADDR_ANY 0.0.0.0 ,泛指本机
    listenAddr.sin_family = AF_INET;
    listenAddr.sin_port = htons(9955);
    evutil_make_socket_nonblocking(m_listenfd);

    int one = 1;
    setsockopt(m_listenfd, SOL_SOCKET, SO_REUSEADDR, (char*)&one, sizeof(one));
    int bindres = bind(m_listenfd, (sockaddr*)&listenAddr, sizeof(listenAddr));
    if (bindres == -1)
    {
        printf("bind socket failed.\n");
        return -1;
    }
    listen(m_listenfd, 128);
    //accept callback
    m_listenevent = event_new(m_event_base, m_listenfd, EV_READ | EV_PERSIST, listen_accept_cb, m_event_base);
    event_add(m_listenevent, NULL);
    return 0;
}

int main(int argc, char **argv)
{
    initevent();
    event_base_dispatch(m_event_base);

    event_base_free(m_event_base);
    event_free(m_listenevent);
    evutil_closesocket(m_listenfd);

    map_tcpHander.clear();

    getchar();
}
 

client.cpp

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

int main(int argc, char**argv)
{
   int sockfd = socket(AF_INET, SOCK_STREAM, 0);
   struct hostent *server = gethostbyname("127.0.0.1");
    if (server == NULL) {
        printf("ERROR, no such host\n");
        exit(0);

    }

   struct sockaddr_in serv_addr;
   memset((char*)&serv_addr, 0, sizeof(serv_addr));

   serv_addr.sin_family = AF_INET;
   memcpy((char*)server->h_addr,
           (char*)&serv_addr.sin_addr.s_addr,
            server->h_length);
    serv_addr.sin_port = htons(9955);
    if (connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {
        printf("error connect:%d\n", errno);
        exit(0);

    }

    char *buf = "data from client";
    int n = write(sockfd, buf, strlen(buf));
    char recv[1024] = { 0 };
    n = read(sockfd, recv, sizeof(recv));
    recv[n] = '\0';
    printf("%s\n", recv);

    close(sockfd);
    return 0;
}
 

猜你喜欢

转载自blog.csdn.net/XiaoWhy/article/details/87808387