libevent(3):event_loop是如何处理网络I/O的?

RT

参考libevent自带的例子client_test来分析。

#include <stdio.h>
#include <winsock2.h>
#include <windows.h>
#include <event.h>

void on_event( int s, short ev, void *arg )
{
    static int count = 0;
    count ++;
    if( count < 10 )
    {
        //event_add( (event*)arg, 0 );
    }

    if( ev & EV_READ )
    {
        printf( "read event\n" );
        char buf[256] = {0};
        int ret = recv( (SOCKET)s, buf, sizeof( buf ), 0 );
        if( ret > 0 )
        {
            printf( "read data : %s[%d bytes]\n", buf, ret );
            send( (SOCKET)s, buf, ret, 0 );
        }
        else
        {
            printf( "read failed : %d\n", WSAGetLastError() );
        }
    }

    if( ev & EV_WRITE )
    {
        printf( "write event\n" );
    }

    Sleep( 10 );
}

int main()
{
    int ret = 0;
    sockaddr_in addr;

    event_base *base = event_init();
    printf( "%s\n", event_base_get_method( base ) );

    SOCKET s = socket( AF_INET, SOCK_STREAM, 0 );
    memset( &addr, 0, sizeof( addr ) );
    addr.sin_family = AF_INET;
    addr.sin_port = htons( 8001 );
    addr.sin_addr.s_addr = inet_addr( "127.0.0.1" );

    ret = connect( s, (sockaddr*)&addr, sizeof( addr ) );
    if( ret >= 0 ) {
        printf( "connect ok\n" );
    } else {
        printf( "connect failed : %d\n", WSAGetLastError() );
    }

    event ev;
    event_set( &ev, (int)s, EV_READ | EV_WRITE, on_event, &ev );
    event_add( &ev, 0 );
    
    event_dispatch();
    
    closesocket( s );
    event_base_free( base );
    return 0;
}

其具体执行流程为:

event_set --> event_add --> evsel->dispatch --> win32_dispatch --> select --> event_process_active --> (*ev->ev_callback)((int)ev->ev_fd, ev->ev_res, ev->ev_arg);

event_set:用户将指定在该套接字上面进行READ和WRITE监听事件。

event_add:加到主事件循环中

evsel->dispatch:多路复用器使用不同的组件分发事件(例如:在windows上面就是用win32_dispatch来分发事件)

select:标准的select监听套接字是否可用

event_process_active:若套接字还活着,就执行其预先设定的回调函数


问:我如何不断的发送/接收数据?

答:都在on_event里面处理。








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值