epoll使用示例
来源:互联网 发布:手机能编程么 编辑:程序博客网 时间:2024/05/21 20:47
- while (1)
- {
-
- nfds = epoll_wait(kdpfd, events, curfds, -1);
- if (nfds == -1)
- {
- perror("epoll_wait");
- break;
- }
-
- for (n = 0; n < nfds; ++n)
- {
- if (events[n].data.fd == listener)
- {
- new_fd = accept(listener, (struct sockaddr *) &their_addr,&len);
- if (new_fd < 0)
- {
- perror("accept");
- continue;
- }
- else
- {
- printf("有连接来自于: %d:%d, 分配的 socket 为:%d/n",
- inet_ntoa(their_addr.sin_addr), ntohs(their_addr.sin_port), new_fd);
- }
- setnonblocking(new_fd);
- ev.events = EPOLLIN | EPOLLET;
- ev.data.fd = new_fd;
- if (epoll_ctl(kdpfd, EPOLL_CTL_ADD, new_fd, &ev) < 0)
- {
- fprintf(stderr, "把 socket '%d' 加入 epoll 失败!%s/n",
- new_fd, strerror(errno));
- return -1;
- }
- curfds++;
- }
- else
- {
- ret = handle_message(events[n].data.fd);
- if (ret < 1 && errno != 11)
- {
- epoll_ctl(kdpfd, EPOLL_CTL_DEL, events[n].data.fd,&ev);
- curfds--;
- }
- }
- }
- }
- close(listener);
- return 0;
- }