libevent 一个简单的event示例

本示例程序使用libevent监控一个处于监听状态的tcp服务端socket,
并在有连接进来时打印一条消息。

 #include <event.h>
 
 int sock_fd;       // tcp侦听句柄
 
 // 事件回调函数,当有socket连接时执行
 void event_occurs(int fd, short evt, void *arg)
 {
  if ( evt == EV_READ && fd == sock_fd )
      printf("new connection\n");
  else if ( evt == EV_TIMEOUT)
      printf("event timeout\n");
 }
 
 int main (int argc, char **argv)
 {
  int sock_fd = open_server_socket();  // 调用一个自定义的socket端口侦听函数
                                       // 返回socket句柄。
      
  struct event evt;     // 声明一个event
  struct timeval timeout = {30, 0}; // 设置一次event超时为30秒
  event_init();         // 初始化当前libevent, 在调用其他libevent函数之前调用一次
  
  // 将socket句柄、监控的触发事件(EV_READ),事件发生后的回调函数、
  // 回调函数参数,绑定到evt中。
  event_set(&evt, sock_fd, EV_READ, event_occurs, NULL);
  
  event_add(&evt, &timeout);  // 设置一次监控的超时时间
  event_dispach();    // 执行事件监控,直至超时或事件发生
                      // 如果要在事件发生后连续执行,需要重新add和dispatch
  
  close(sock_fd);
  return 0;
 }

转载于:https://my.oschina.net/luckysym/blog/201982

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的异步模型示例,使用了libevent库: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <event2/event.h> void on_read(evutil_socket_t fd, short events, void *arg) { char buf[1024]; int len = recv(fd, buf, sizeof(buf), 0); if (len <= 0) { printf("client closed\n"); event_del((struct event*)arg); close(fd); return; } buf[len] = '\0'; printf("recv: %s", buf); } void on_accept(evutil_socket_t fd, short events, void *arg) { struct event_base *base = (struct event_base*)arg; struct sockaddr_in client_addr; socklen_t client_len = sizeof(client_addr); int client_fd = accept(fd, (struct sockaddr*)&client_addr, &client_len); if (client_fd < 0) { printf("accept failed\n"); return; } printf("accept a client: %s:%d\n", inet_ntoa(client_addr.sin_addr), client_addr.sin_port); struct event *ev = event_new(base, client_fd, EV_READ | EV_PERSIST, on_read, event_self_cbarg()); event_add(ev, NULL); } int main(int argc, char *argv[]) { if (argc < 2) { printf("usage: %s <port>\n", argv[0]); return 0; } int port = atoi(argv[1]); struct event_base *base = event_base_new(); if (!base) { printf("event_base_new failed\n"); return 0; } int server_fd = socket(AF_INET, SOCK_STREAM, 0); if (server_fd < 0) { printf("socket failed\n"); return 0; } struct sockaddr_in server_addr; memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htonl(INADDR_ANY); server_addr.sin_port = htons(port); if (bind(server_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) { printf("bind failed\n"); return 0; } if (listen(server_fd, 10) < 0) { printf("listen failed\n"); return 0; } struct event *ev = event_new(base, server_fd, EV_READ | EV_PERSIST, on_accept, (void*)base); event_add(ev, NULL); event_base_dispatch(base); return 0; } 希望这个示例对你有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值