日期:2014-05-16 浏览次数:20807 次
int main() { int i, maxi, listenfd, connfd, sockfd,epfd,nfds; ssize_t n; char line[MAXLINE]; socklen_t clilen; //声明epoll_event结构体的变量,ev用于注册事件,数组用于回传要处理的事件 struct epoll_event ev,events[20]; //生成用于处理accept的epoll专用的文件描述符 epfd=epoll_create(256); struct sockaddr_in clientaddr; struct sockaddr_in serveraddr; listenfd = socket(AF_INET, SOCK_STREAM, 0); //把socket设置为非阻塞方式 setnonblocking(listenfd); //设置与要处理的事件相关的文件描述符 ev.data.fd=listenfd; //设置要处理的事件类型 ev.events=EPOLLIN|EPOLLET; //ev.events=EPOLLIN; //注册epoll事件 epoll_ctl(epfd,EPOLL_CTL_ADD,listenfd,&ev); bzero(&serveraddr, sizeof(serveraddr)); serveraddr.sin_family = AF_INET; char *local_addr="0.0.0.0"; inet_aton(local_addr,&(serveraddr.sin_addr));//htons(SERV_PORT); serveraddr.sin_port=htons(SERV_PORT); bind(listenfd,(sockaddr *)&serveraddr, sizeof(serveraddr)); listen(listenfd, LISTENQ); maxi = 0; for ( ; ; ) { static int last_fd = 0; char empty[10240]; send(last_fd, empty, sizeof(empty), MSG_DONTWAIT); //等待epoll事件的发生 nfds=epoll_wait(epfd,events,20,500); //处理所发生的所有事件 for(i=0;i<nfds;++i) { if(events[i].data.fd==listenfd) { connfd = accept(listenfd,(sockaddr *)&clientaddr, &clilen); if(connfd<0){ perror("connfd<0"); exit(1); } //setnonblocking(connfd); char *str = inet_ntoa(clientaddr.sin_addr); cout << "accapt a connection from " << str << endl; //设置用于读操作的文件描述符 ev.data.fd=connfd; //设置用于注测的读操作事件 ev.events=EPOLLIN|EPOLLET; //ev.events=EPOLLIN; //注册ev epoll_ctl(epfd,EPOLL_CTL_ADD,connfd,&ev); } else if(events[i].events&EPOLLIN) { cout << "EPOLLIN" << endl; if ( (sockfd = events[i].data.fd) < 0) continue; if ( (n = read(sockfd, line, MAXLINE)) < 0) { if (errno == ECONNRESET) { close(sockfd); events[i].data.fd = -1; } else std::cout<<"readline error"<<std::endl; } else if (n == 0) { close(sockfd); events[i].data.fd = -1; } line[n] = '\0'; cout << "read " << line << endl; //设置用于写操作的文件描述符 ev.data.fd=sockfd; //设置用于注测的写操作事件 ev.events=EPOLLOUT|EPOLLET; //修改sockfd上要处理的事件为EPOLLOUT epoll_ctl(epfd,EPOLL_CTL_MOD,sockfd,&ev); last_fd = sockfd; } else if(events[i].events&EPOLLOUT) { sockfd = events[i].data.fd; write(sockfd, line, n); //设置用于读操作的文件描述符 ev.data.fd=sockfd; //设置用于注测的读操作事件 ev.events=EPOLLIN|EPOLLET; //修改sockfd上要处理的事件为EPOLIN epoll_ctl(epfd,EPOLL_CTL_MOD,sockfd,&ev); } } } return 0; }
![]()
推荐阅读更多>
- 大家好,VC程序員怎么轉Linux開發呢?VC/MFC社區很多人都有這個問題呀
- 在proc文件系统中实现程序输入和输出,如何实现
- liveCD如何用
- 《Linux Kernel Development》chapter 一 Introduction to Linux Kernel
- linux下怎么指定新建文件的默认权限
- ubuntu系统下怎么安装linuxqq_v1.0.2-beta1_loongson.tar.gz
- linux上什么函数是用来“创建软链接和硬链接的呢“有么,今天突然想到这个有关问题。
- Linux环境进程间通信(1)
- 企业级Linux服务攻略 小结
- linux 起步脚本调用顺序(测试平台 AM335X-ARM A9)
- [转]Linux网络配备命令——ifconfig
- linux的一些学问
- 虚拟机装linux 找不到CDROM解决方案
- 2011年最新录制的Linux(CentOS)视频教程,该如何处理
- Unix环境下的一个有关问题
- apache带SSL支持已做完,也认证完了,可是认证以后该怎么做呢
- Linux学习3:软件安装
- linux上V4L2编程,ioctl VIDIOC_DQBUF时,为什么总是返回-1呢?怎么解决
- 散点分,祝大家春节快乐,该如何处理
- (bash shell)怎样取某个指定内容在一个文件中所在的行数?解决方案