EPOLL
来源:互联网 发布:linux黑客帝国代码雨 编辑:程序博客网 时间:2024/06/15 08:35
最近android项目 NDK用到的EPOLL
#define MAX_SIZE 4096#define BYTE unsigned charint epfd;int set_non_blocking(int socket_fd){ if (fcntl(socket_fd, F_SETFL, fcntl(socket_fd, F_GETFL)|O_NONBLOCK) == -1) { return -1; } return 0;}void startServer(int port,int Max_Buff_Size){ int server_id = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if(server_id < 0) { return; } int reuse = 1; if(setsockopt(server_id,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse)) < 0) { return; } int size = Max_Buff_Size; if(setsockopt(server_id,SOL_SOCKET,SO_RCVBUF,&size, sizeof(size)) < 0) { return; } set_non_blocking(server_id); struct sockaddr_in addr_in; memset(&addr_in,0,sizeof(sockaddr_in)); addr_in.sin_family = AF_INET; addr_in.sin_addr.s_addr = htons(INADDR_ANY); addr_in.sin_port = htons(port); if(bind(server_id,(const struct sockaddr*)&addr_in,sizeof(sockaddr_in)) < 0) { return; } if(listen(server_id,65535) < 0) { return; } epoll_event ev; epoll_event events[MAX_SIZE]; epfd = epoll_create(MAX_SIZE); ev.events = EPOLLIN; ev.data.fd = server_id; if(epoll_ctl(epfd,EPOLL_CTL_ADD,server_id,&ev) < 0) { return; } BYTE buf[Max_Buff_Size]; while(true) { int nfds = epoll_wait(epfd,events,MAX_SIZE,-1); if(nfds < 0 && errno != EINTR) { break; } for(int n = 0;n < nfds;++n) { if(events[n].data.fd == server_id) { struct sockaddr_in remote_in; socklen_t len_t = sizeof(remote_in); int client_socket = accept(server_id,(sockaddr*)&remote_in,&len_t); if(client_socket < 0) { continue; } set_non_blocking(client_socket); ev.events = EPOLLIN; ev.data.fd = client_socket; epoll_ctl(epfd,EPOLL_CTL_ADD,client_socket,&ev); } else if(events[n].events & EPOLLIN) { int client_socket = events[n].data.fd; if(client_socket < 0){ continue; } memset(&buf,0,sizeof(buf)); ssize_t ret = recv(client_socket,buf,sizeof(buf),0); if(ret <= 0) { close(client_socket); ev = events[n]; epoll_ctl(epfd, EPOLL_CTL_DEL, client_socket, &ev); continue; }else{ //处理接收的数据 /* ... */ } } } }}
阅读全文
0 0
- epoll
- epoll
- epoll
- epoll
- epoll
- epoll
- epoll
- epoll
- epoll
- epoll
- epoll
- epoll
- epoll
- epoll
- epoll
- epoll
- epoll
- epoll
- git 导出版本之间差异文件
- bzoj1004
- JavaMail创建邮件和发送邮件
- 10.12java
- 嵌入式linux内核启动过程简明描述
- EPOLL
- 一周小程序【资讯教程Demo】更新
- best-time-to-buy-and-sell-stock Java code
- python+selenium搜狗微信主页抓取
- AngularJS验证两次密码是否相同
- Httpclient 参数
- 第一次作业
- 解决异常报错org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible问题
- sql时间截取转换大全