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里面处理。