本质上依旧是整个事件的响应机制
这里的场景为,程序作为客户端连接服务器,每当socket可读时,便触发对应事件,在回调中进行读取等处理。
(代码比较粗糙,主要用以说明逻辑)
一、创建io事件
ev_io sock_w;
二、定义相关函数
1、回调函数cb
void sock_cb(EV_P_ ev_io *w)
{
int num;
extern int sockfd;
char buf[MAXDATASIZE]; /* buf will store received text */
if((num=recv(sockfd,buf,MAXDATASIZE,0))==-1)
{
printf("recv() error\n");
close(sockfd);
exit(1);
}
buf[num-1]='\0';
printf("server message: %s\n",buf);
//ev_io_stop (EV_A_ w); //对ev_io事件的监控不会自动停止,需要手动在需要的时候停止
//ev_break (EV_A_ EVBREAK_ALL); //整体的loop事件在所有监控停止时停止,也可以手动关闭全部的ev_run
}
2、socket client 初始化函数
void sock_init(void)
{
extern int sockfd;
struct hostent *he; /* structure that will get information about remote host */
struct sockaddr_in server;
he=gethostbyname("ip地址");
if((sockfd=socket(AF_INET,SOCK_STREAM, 0))==-1)
{
printf("socket() error\n");
exit(1);
}
bzero(&server,sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(PORT);
server.sin_addr = *((struct in_addr *)he->h_addr);
if(connect(sockfd, (struct sockaddr *)&server, sizeof(server))==-1)
{
printf("connect() error\n");
exit(1);
}
}
三、在主函数中进行调用
1、定义loop体
struct ev_loop *loop = EV_DEFAULT;
2、初始化网络连接 sock_init();
3、将事件加入loop
// 注意,关键就是这个sockfd,当其可读时触发回调
ev_io_init (&sock_w, sock_cb,sockfd, EV_READ);
ev_io_start (loop, &sock_w);
4、ev_run (loop, 0);
PS。
int main (void)
{
struct ev_loop *loop = EV_DEFAULT;
sock_init();
ev_io_init (&sock_w, sock_cb,sockfd, EV_READ);
ev_io_start (loop, &sock_w);
ev_run (loop, 0);
return 0;
}

博客介绍了程序作为客户端连接服务器时的事件响应机制,当socket可读时触发对应事件并在回调中处理。还给出了实现步骤,包括创建io事件、定义相关函数,以及在主函数中定义loop体、初始化网络连接、将事件加入loop等。
1221

被折叠的 条评论
为什么被折叠?



