libevent的服务器和客户端的使用

server.c

#include <event2/event.h>
#include <event2/bufferevent.h>
#include <event2/listener.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <fcntl.h>

void read_cb(struct bufferevent *bev, void *ctx)
{
    //read data form buffer.
    char buf[1024] = {0};
    bufferevent_read(bev,buf,sizeof(buf));
    printf("recv buf : %s\n",buf);

    char* pt = "i have received the data you send!!!\n";
    bufferevent_write(bev,pt,strlen(pt) + 1);
    printf("ISEND DATA TO CLIENT!!!\n");
}

void write_cb(struct bufferevent *bev, void *arg)
{
    printf("from write_cb, the data have send\n");
}

void event_cb(struct bufferevent *bev, short events, void *ctx)
{
    if(events & BEV_EVENT_EOF)
    {
        printf("connection closed\n");
    }
    else if(events & BEV_EVENT_ERROR)
    {
        printf("some errors\n");
    }

    //free resources.
    bufferevent_free(bev);
}

void listen_cb(struct evconnlistener *listener,
               evutil_socket_t fd,
               struct sockaddr *addr,
               int socklen, void *ptr)
{
    struct event_base* base = (struct event_base*)ptr;
    struct bufferevent* bev = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE);
    //set cb for bufferevent buffer.
    bufferevent_setcb(bev, read_cb, write_cb, event_cb, NULL);
    bufferevent_enable(bev, EV_READ);
}

int main01()
{
    //libevent context.
    struct event_base* base = event_base_new();
    //init serv info.
    struct sockaddr_in serv;
    memset(&serv,0, sizeof (serv));
    serv.sin_family = AF_INET;
    serv.sin_port = htons(8765);
    serv.sin_addr.s_addr = htonl(INADDR_ANY);

    struct evconnlistener * listen = NULL;
    listen = evconnlistener_new_bind(base, listen_cb, base,
                                     LEV_OPT_CLOSE_ON_FREE | LEV_OPT_REUSEABLE,
                                     -1, (struct sockaddr*)&serv, sizeof (serv));
    // event loop.
    event_base_dispatch(base);
    evconnlistener_free(listen);
    event_base_free(base);
    return 0;
}

client.c

#include <event2/event.h>
#include <event2/bufferevent.h>
#include <event2/listener.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <fcntl.h>
#include <arpa/inet.h>
void read_cb(struct bufferevent *bev, void *ctx)
{
    //read data form buffer.
    char buf[1024] = {0};
    bufferevent_read(bev,buf,sizeof(buf));
    printf("recv buf : %s\n",buf);

//    char* pt = "i have received the data you send!!!\n";
//    bufferevent_write(bev,pt,strlen(pt) + 1);
    printf("ISEND DATA TO CLIENT!!!\n");
}

void write_cb(struct bufferevent *bev, void *arg)
{
    printf("from write_cb, the data have send\n");
}

void event_cb(struct bufferevent *bev, short events, void *ctx)
{
    if(events & BEV_EVENT_EOF)
    {
        printf("connection closed\n");
        //free resources.
        bufferevent_free(bev);
    }
    else if(events & BEV_EVENT_ERROR)
    {
        printf("some errors\n");
        //free resources.
        bufferevent_free(bev);
    }
    else if(events & BEV_EVENT_CONNECTED)
    {
        printf("connetct successful\n");
    }
}

void read_terminal(evutil_socket_t fd, short events, void *args)
{
    struct bufferevent *bev = (struct bufferevent *)args;
    char buf[1024] = {0};
    ssize_t len = read(fd, buf, sizeof (buf));
    bufferevent_write(bev, buf, len + 1);
}

int main(void)
{
    int fd = socket(AF_INET,SOCK_STREAM,0);
    struct sockaddr_in serv;
    memset(&serv,0, sizeof (serv));
    serv.sin_family = AF_INET;
    serv.sin_port = htons(8765);
    inet_aton("127.0.0.1", (struct in_addr*)&serv.sin_addr.s_addr);

    //libevent context.
    struct event_base* base = event_base_new();

    struct bufferevent *bev = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE);
    bufferevent_socket_connect(bev, &serv, sizeof (serv));

    bufferevent_setcb(bev,read_cb, write_cb, event_cb, NULL);
    bufferevent_enable(bev, EV_READ);

    struct event* ev = event_new(base,STDIN_FILENO, EV_READ | EV_PERSIST,
              read_terminal,bev);
    event_add(ev, NULL);
    //loop.
    event_base_dispatch(base);

    event_base_free(base);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值