libev 开发流程(二)# 简单引入socket通信客户端

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

本质上依旧是整个事件的响应机制

这里的场景为,程序作为客户端连接服务器,每当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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值