多进程服务器中epoll实现.docx_第1页
多进程服务器中epoll实现.docx_第2页
多进程服务器中epoll实现.docx_第3页
多进程服务器中epoll实现.docx_第4页
多进程服务器中epoll实现.docx_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

多进程服务器中,epoll的创建应该在创建子进程之后 看我的测试代码,似乎应该是在创建子进程之后创建epoll的fd,否则程序将会有问题,试将代码中两个CreateWorker函数的调用位置分别调用,一个在创建epoll fd之前,一个在之后,在调用在创建之前的代码会出问题,在我的机器上(linux内核2.6.26)表现的症状就是所有进程的epoll_wait函数返回0, 而客户端似乎被阻塞了:服务器端:#include#include#include#include#include#include#include#include#include#include#includeusingnamespacestd;#defineMAXLINE5#defineOPEN_MAX100#defineLISTENQ20#defineSERV_PORT5000#defineINFTIM1000typedefstructtask_tintfd;charbuffer100;intn;task_t;intCreateWorker(intnWorker)if(0nWorker)boolbIsChild;pid_tnPid;while(!bIsChild)if(00)bIsChild=false;-nWorker;elseif(0=nPid)bIsChild=true;printf(createworker%dsuccess!n,:getpid();elseprintf(forkerror:%sn,:strerror(errno);return-1;elseintnStatus;if(-1=:wait(&nStatus)+nWorker;return0;voidsetnonblocking(intsock)intopts;opts=fcntl(sock,F_GETFL);if(opts0)perror(fcntl(sock,GETFL);exit(1);opts=opts|O_NONBLOCK;if(fcntl(sock,F_SETFL,opts)0)perror(fcntl(sock,SETFL,opts);exit(1);intmain()inti,maxi,listenfd,connfd,sockfd,epfd,nfds;ssize_tn;charlineMAXLINE;socklen_tclilen;structepoll_eventev,events20;structsockaddr_inclientaddr;structsockaddr_inserveraddr;listenfd=socket(AF_INET,SOCK_STREAM,0);bzero(&serveraddr,sizeof(serveraddr);serveraddr.sin_family=AF_INET;char*local_addr=;inet_aton(local_addr,&(serveraddr.sin_addr);/htons(SERV_PORT);serveraddr.sin_port=htons(SERV_PORT);/地址重用intnOptVal=1;socklen_tnOptLen=sizeof(int);if(-1=:setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&nOptVal,nOptLen)return-1;setnonblocking(listenfd);bind(listenfd,(sockaddr*)&serveraddr,sizeof(serveraddr);listen(listenfd,LISTENQ);CreateWorker(5);/把socket设置为非阻塞方式/生成用于处理accept的epoll专用的文件描述符epfd=epoll_create(256);/设置与要处理的事件相关的文件描述符ev.data.fd=listenfd;/设置要处理的事件类型ev.events=EPOLLIN|EPOLLET;/ev.events=EPOLLIN;/注册epoll事件epoll_ctl(epfd,EPOLL_CTL_ADD,listenfd,&ev);/CreateWorker(5);maxi=0;task_ttask;task_t*ptask;while(true)/等待epoll事件的发生nfds=epoll_wait(epfd,events,20,500);/处理所发生的所有事件for(i=0;infds;+i)if(eventsi.data.fd=listenfd)connfd=accept(listenfd,NULL,NULL);if(connfd0)printf(connfd0,listenfd=%dn,listenfd);printf(error=%sn,strerror(errno);exit(1);setnonblocking(connfd);/设置用于读操作的文件描述符memset(&task,0,sizeof(task);task.fd=connfd;ev.data.ptr=&task;/设置用于注册的读操作事件ev.events=EPOLLIN|EPOLLET;/ev.events=EPOLLIN;/注册evepoll_ctl(epfd,EPOLL_CTL_ADD,connfd,&ev);elseif(eventsi.events&EPOLLIN)coutEPOLLINfd;if(ptask-n=read(sockfd,ptask-buffer,100)0)if(errno=ECONNRESET)close(sockfd);eventsi.data.ptr=NULL;elsestd:coutreadlineerrorn=0)close(sockfd);eventsi.data.ptr=NULL;ptask-bufferptask-n=0;coutreadbufferendl;/设置用于写操作的文件描述符ev.data.ptr=ptask;/设置用于注测的写操作事件ev.events=EPOLLOUT|EPOLLET;/修改sockfd上要处理的事件为EPOLLOUTepoll_ctl(epfd,EPOLL_CTL_MOD,sockfd,&ev);elseif(eventsi.events&EPOLLOUT)coutEPOLLOUTfd;write(sockfd,ptask-buffer,ptask-n);/设置用于读操作的文件描述符ev.data.ptr=ptask;/修改sockfd上要处理的事件为EPOLINepoll_ctl(epfd,EPOLL_CTL_DEL,sockfd,&ev);coutwritebuffer;memset(ptask,0,sizeof(*ptask);close(sockfd);return0;测试客户端:#!/usr/bin/perlusestrict;useSocket;useIO:Handle;subechoclientmy$host=;my$port=5000;my$protocol=getprotobyname(TCP);$host=inet_aton($host);socket(SOCK,AF_INET,SOCK_STREAM,$protocol)ordiesocket()failed:$!;my$dest_addr=sockaddr_in($port,$host);connect(SOCK,$dest_addr)ordieconnect()failed:$!;SOCK-autoflush(1);my$msg_out=helloworldn;printout=,$msg_out;printSOCK$msg_out;my$msg_in=;printin=,$msg_in;closeSOCK;#&echoclient;#exit(0);for(my$i=0;$i9999;$i+)echoclient;我查看了lighttpd的实现,也是在创建完子进程之后才创建的epoll的fd.请问谁知道哪里有讲解这个的文档?这是美丽的分割线:-感谢luke, 他帮我解释了这个问题

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论