libevent简单echo示例

echoserver

本实例是基于libevent2版本

#include <stdio.h>  
#include <stdlib.h>  
#include <strings.h>  
#include <errno.h>  
#include <assert.h>  

#include <event2/event.h>  
#include <event2/bufferevent.h>  
#include <event2/listener.h>
#define LISTEN_PORT 9999  
#define LISTEN_BACKLOG 32  

#define oops(msg) { perror(msg); exit(EXIT_FAILURE); }  

void read_cb(struct bufferevent *bev, void *arg) {  
    #define MAX_LINE    256  
    char line[MAX_LINE+1];  
    int n;  
    evutil_socket_t fd = bufferevent_getfd(bev);  

    while (n = bufferevent_read(bev, line, MAX_LINE), n > 0) {  
        line[n] = '\0';  
        printf("fd=%u, read line: %s\n", fd, line);  

        bufferevent_write(bev, line, n);  
    }  
}  

void write_cb(struct bufferevent *bev, void *arg) {}  

void error_cb(struct bufferevent *bev, short event, void *arg) {  
    evutil_socket_t fd = bufferevent_getfd(bev);  
    printf("fd = %u, ", fd);  
    if (event & BEV_EVENT_TIMEOUT) {  
        printf("Timed out\n"); //if bufferevent_set_timeouts() called  
    }  
    else if (event & BEV_EVENT_EOF) {  
        printf("connection closed\n");  
    }  
    else if (event & BEV_EVENT_ERROR) {  
        printf("some other error\n");  
    }  
    bufferevent_free(bev);  
}  

void accept_cb(evutil_socket_t sockfd, short event_type, void *arg){  
    evutil_socket_t fd;  
    struct sockaddr_in sin;  
    socklen_t slen;  

    fd = accept(sockfd, (struct sockaddr *)&sin, &slen);  
    if (fd < 0) oops("ERROR: accept: ");  
    if (fd > FD_SETSIZE) oops("ERROR: fd > FD_SETSIZE");  

    printf("ACCEPT: fd = %u\n", fd);  

    struct event_base *base;  
    base = (struct event_base *)arg;  
    struct bufferevent *bev = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE);  
    bufferevent_setcb(bev, read_cb, NULL, error_cb, arg);  
    bufferevent_enable(bev, EV_READ|EV_WRITE|EV_PERSIST);  
}  
void do_accept_cb(struct evconnlistener *listener, evutil_socket_t fd,
    struct sockaddr *sa, int socklen, void *arg){  
    printf("ACCEPT: fd = %u\n", fd);  
    struct event_base *base;  
    base = (struct event_base *)arg;  
    struct bufferevent *bev = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE);  
    bufferevent_setcb(bev, read_cb, NULL, error_cb, arg);  
    bufferevent_enable(bev, EV_READ|EV_WRITE|EV_PERSIST);  
} 

int main(int argc, char **argv){  
    struct event_base *base;  
    base = event_base_new();  
    struct evconnlistener *listener;
    struct sockaddr_in sin;  
    bzero(&sin,sizeof(sin)); 
    sin.sin_family = AF_INET;  
    sin.sin_addr.s_addr = inet_addr("192.168.8.94");
    sin.sin_port =  htons(LISTEN_PORT);  
    listener = evconnlistener_new_bind(base, do_accept_cb, (void *)base,
        LEV_OPT_REUSEABLE|LEV_OPT_CLOSE_ON_FREE, -1,
        (struct sockaddr*)&sin,
        sizeof(sin));
    if (!listener) {
        fprintf(stderr, "Could not create a listener!\n");
        return 1;
    }     
    puts("Listening...");  
    assert(base != NULL);  
    if(base == NULL) oops("ERROR: event_base_new() :");  
    event_base_dispatch(base);  
    evconnlistener_free(listener);
    event_base_free(base);
    puts("The End.");  
    return 0;  
}  

echoclient

客户端使用socket api

#include<stdio.h>  
#include<stdlib.h>  
#include<string.h>  
#include<unistd.h>  

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

#define oops(msg) { perror(msg); exit(EXIT_FAILURE); }  
#define SIZE 256  

#define LISTEN_PORT 9999  

int main(){  
        int socket_fd = socket(PF_INET, SOCK_STREAM, 0);  
        if(socket_fd == -1) oops("socket initiating error...");  

        struct sockaddr_in address;  
        bzero(&address, sizeof(address));  
        address.sin_family = AF_INET;  
        address.sin_addr.s_addr = inet_addr("192.168.8.94");  
//        address.sin_addr.s_addr = 0;  
        address.sin_port =  htons(LISTEN_PORT);  

        int connect_result = connect(socket_fd, (struct sockaddr*)&address, sizeof(address));  
        if(connect_result == -1) oops("connect error...");  

        char buffer[1024];
        while(1){
            memset(buffer,0,sizeof(buffer));
            scanf("%s",buffer);
            ssize_t write_length = write(socket_fd, buffer, strlen(buffer)+1); //write to socket_fd  
            if(write_length != (strlen(buffer)+1)) oops("error: write ...");  


            ssize_t read_length = read(socket_fd, buffer, strlen(buffer)+1);  
            if(read_length == -1) oops("error: read data from socket...");  

            printf("the ret msg is: %s\n", buffer);  
        }
        close(socket_fd);  
        return EXIT_SUCCESS;  
}  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值