libevent简单非阻塞异步程序示例.pptx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
libevent简单非阻塞异步程序示例

Libevent简介;;使用Libevent的基本流程;Libevent对事件的处理流程;Libevent buffer实现异步传输;;示例程序一:;//on_write函数中向客户端回写数据 void on_write(int sock, short event, void* arg) { char* buffer = (char*)arg; send(sock, buffer, strlen(buffer), 0); free(buffer); } //读事件 void on_read(int sock, short event, void* arg) { struct event* write_ev; int size; struct sock_ev* ev = (struct sock_ev*)arg; ev-buffer = (char*)malloc(MEM_SIZE); bzero(ev-buffer, MEM_SIZE); size = recv(sock, ev-buffer, MEM_SIZE, 0); printf(receive data:%s, size:%d\n, ev-buffer, size); //当从socket读返回0标志对方已经关闭了连接,因此这个时候就没必要继续监听该套接口上的事件 if (size == 0) { release_sock_event(ev); close(sock); return; } //传参给on_write 准备写时间 event_set(ev-write_ev, sock, EV_WRITE, on_write, ev-buffer); event_base_set(base, ev-write_ev); event_add(ev-write_ev, NULL); } ; void on_accept(int sock, short event, void* arg) { struct sockaddr_in cli_addr; int newfd, sin_size; struct sock_ev* ev = (struct sock_ev*)malloc(sizeof(struct sock_ev)); //之所以是在堆申请内存,是防止在栈分配而导致的访问未知内存而使得程序崩溃 ev-read_ev = (struct event*)malloc(sizeof(struct event)); ev-write_ev = (struct event*)malloc(sizeof(struct event)); sin_size = sizeof(struct sockaddr_in); //创建新的套接字进行连接,sock是正在监听连接的套接字,而中间参数则是客户端的地址信息 newfd = accept(sock, (struct sockaddr*)cli_addr, sin_size); //在newfd文件描述符上监听可读事件,如果有数据到达则调用on_read函数 event_set(ev-read_ev, newfd, EV_READ|EV_PERSIST, on_read, ev); event_base_set(base, ev-read_ev); event_add(ev-read_ev, NULL); }; int main(int argc, char* argv[]) { //创建一个套接字地址对象 struct sockaddr_in my_addr; int sock; //创建套接字描述符,实质是一个文件描述符 //AF_INET表示使用IP地址,SOCK_STREAM表示使用流式套接字 sock = socket(AF_INET, SOCK_STREAM, 0); int yes = 1; setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, yes, sizeof(int)); memset(my_addr, 0, sizeof(my_addr)); //实例化对象的属性 my_addr.sin_family = AF_INET;//主机字节顺序 my_addr.sin_port = htons

文档评论(0)

dajuhyy + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档