libevent2 bufferevent应用示例

/*************************************************
 * 本代码使用libevent连接、登录远程POP3邮件服务器.
 */
#include <event2/event.h>
#include <event2/util.h>
#include <event2/bufferevent.h>
 
// 根据ip和端口生成sockaddr结构并返回其地址,同时输出addrlen(实现略)
struct sockaddr * make_sock_addr(const char *ip, int port, int *addrlen);
 
// socket读取事件回调函数,每收到一条远程消息,该函数将会被调用一次。
void bufferevent_read_callback(struct bufferevent *bufevt, void *arg)
{
    static int i = 0;
    char buf[1024];
    // 从bufferevent中,读取接收到的消息并打印
    size_t sz = bufferevent_read(bufevt, buf, 1024);
    printf("received bytes: %d\n", sz);
    if ( sz > 0 ) {
        printf("received: %s\n", buf);
    }
 
    // 按顺序发送pop3指令
    if ( i == 0 ) bufferevent_write(bufevt, "user user1\n", 11);
    else if ( i == 1 ) bufferevent_write(bufevt, "pass 12345678\n", 14);
    else if ( i == 2) bufferevent_write(bufevt, "list\n", 5);
    else bufferevent_disable(bufevt, EV_READ);
    i++;
}
 
int main(int argc, char **argv)
{
    int addrlen = 0;
    struct sockaddr * paddr = make_sock_addr("10.1.1.201", 110, &addrlen);
 
    int fd = socket(AF_INET, SOCK_STREAM, 0);
 
    // 创建event base并绑定bufferevent
    struct event_base * evbase = event_base_new();
    struct bufferevent * bufevt = bufferevent_socket_new(evbase, fd, 0);
 
    // 设置sock读取事件回调函数(bufferevent_read_callback),
    // 写回调和错误回调暂不设置, 并开启读取事件通知开关。
    bufferevent_setcb(bufevt, bufferevent_read_callback, NULL, NULL, NULL);
    bufferevent_enable(bufevt, EV_READ);
 
    // 连接服务器, 并启动事件循环
    bufferevent_socket_connect(bufevt, paddr, addrlen);
    event_base_dispatch(evbase);
 
    if ( bufevt )  bufferevent_free(bufevt);
    if ( evbase )  event_base_free(evbase);
    if ( fd >= 0 ) { close(fd); }
    return 0;
}

你可能感兴趣的:(socket,libevent,bufferevent)