zoukankan      html  css  js  c++  java
  • libevent实现TCP 客户端

     ibevent实现Tcp Client基于bufferevent实现

    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <string.h>
    #include <fcntl.h>
    #include <event2/event.h>
    
    void read_cb(struct bufferevent *bev, void *arg)
    {
        char buf[1024] = {0};
        bufferevent_read(bev, buf, sizeof(buf));
        printf("say:%s
    ", buf);
        bufferevent_write(bev, buf, strlen(buf) +1);
        sleep(1);
    }
    
    void write_cb(struct bufferevent *bev, void *arg)
    {
        printf("我是客户端的写回调函数,没卵用
    ");
    }
    void event_cb(struct bufferevent *bev, short events, void * arg)
    {
        if(events & BEV_EVENT_EOF)
        {
            printf("connection closed 
    );
        }
        else if(events & BEV_EVENT_ERROR)
        {
            printf("some other error
    ");
        }
        else if(events & BEV_EVENT_CONNECTED)
        {
            printf("已经连接了服务器.....
    ");
            return ;
        }
        
        //释放资源
        bufferevent_free(bev);
    }
    //客户端与用户教会,从终端读取数据给服务器
    void read_terminal(evutil_socket_t fd, short what, void *arg)
    {
        //读数据
        char buf[1024] = {0};
        int len = read(fd, buf, sizeof(buf));
        
        struct bufferevent* bev = (struct bufferevent*)arg;
        
        //发送数据
        bufferevent_write(bev, buf, len+1);
    }
    int main()
    {
        struct event_base* base = NULL;
        base = event_base_new();
        
        //通信的fd放到bufferevent中
        struct bufferevent *bev = NULL;
        bev = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE);
        
        // init server info
        struct sockaddr_in serv;
        memset(&serv, 0, sizeof(serv));
        serv.sin_family = AF_INET;
        serv.sin_port = htons(9999);
        inet_pton(AF_INET, "127.0.0.1", &serv.sin_addr.s_addr);
        
        //连接服务器
        bufferevent_socket_connect(bev, (struct sockaddr*)&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);
        
        //添加事件
        avent_add(ev, NULL);
        event_base_dispatch(base);
        event_free(ev);
        event_base_free(base);
    }

  • 相关阅读:
    python类型转换
    手机抓包
    java容器collection的一些简单特点
    WIN7 如何将BAT文件附加到任务栏
    Android新权限机制 AppOps
    记录一写Android常用API
    关于java建立的的包import的问题
    Android组件安全
    查看字节码
    数据库分表之Mybatis+Mysql实践(含部分关键代码)
  • 原文地址:https://www.cnblogs.com/woniu201/p/11694507.html
Copyright © 2011-2022 走看看