备注:以下代码只是架构,具体编译不能通过,仍需修改defineBUFFERLEN1024defineMAXEPOLLEVENT1024typedefint(NCALLBACK)(intfd,intevent,voidarg)structitem{intfd;intevents;voidarg;if1NCALLBACKcallback;elseNCALLBACKreadcb;EPOLLINNCALLBACKwritecb;EPOLLOUTNCALLBACKacceptcb;EPOLLINendifunsignedcharrbuffer〔BUFFERLEN〕;intrlen;recv的长度unsignedcharwbuffer〔BUFFERLEN〕;intwlen;send的长度};如果超过MAXEPOLLEVENT,可以使用itemblockstructitemblock{structitemblocknext;structitemitems;};structreactor{intepfd;structitemblockhead;所有io集合structitemblocklast;}intreadcallback(intfd,intevent,voidarg){structreactorrgetInstance();unsignedcharbufferRheaditems〔fd〕。rbuffer;intindex0;intret0;while(indexBUFFERLEN){retrecv(fd,bufferindex,BUFFERLENindex,0);if(ret1)break;elseif(ret0){indexret;}else{break;}}if(indexBUFFERLENret!1)需要继续读SetEvent(fd,readcallback,READCB,NULL);elseif(ret0){从epoll中清除fdDelEvent(fd,NULL,0,NULL);close(fd);}else{读完了,调用写SetEvent(fd,writecallback,WRITECB,NULL);}}intwritecallback(intfd,intevent,voidarg){structreactorRgetInstance();unsignedcharbufferRheaditems〔fd〕。wbuffer;intlenRheaditems〔fd〕。wlen;intretsend(fd,buffer,len,0);if(retlen){如果没有全部发送,继续发送SetEvent(fd,writecallback,WRITECB,NULL);}else{发送成功SetEvent(fd,readcallback,READCB,NULL);}return0;}intacceptcallback(intfd,intevent,voidarg){intconnfd;structsockaddrinclient;socklentlensizeof(client);if((connfdaccept(fd,(structsockaddr)client,len))1){printf(acceptsocketerror:s(errno:d),strerror(errno()));return1;}SetEvent(connfd,readcallback,READCB,NULL);}intInitReactor(structreactorr){if(!r)return1;intepfdepollcreate(1);repfdepfd;fditemrhead(structitemblock)malloc(sizeof(structitemblock));if(rheadNULL){close(epfd);return2;}运行久了可能产生脏数据memset(rhead,0,sizeof(structitemblock));rheaditemsmalloc(MAXEPOLLEVENTsizeof(structitem));if(rheaditemsNULL){free(rhead);close(epfd);return2;}memset(rheaditems,0,MAXEPOLLEVENTsizeof(structitem));rheadnextNULL;return0;}defineREADCB0defineWRITECB1defineACCEPTCB2intSetEvent(intfd,NCALLBACKcb,intevents,intarg){structreactorrgetInstance();structepolleventev{0};ev。data。ptrarg;switch(event){caseREADCB:rheaditems〔fd〕。fdfd;rheaditems〔fd〕。readcbcb;rheaditems〔fd〕。argarg;ev。eventsEPOLLIN;break;caseWRITECB:rheaditems〔fd〕。fdfd;rheaditems〔fd〕。writecbcb;rheaditems〔fd〕。argarg;ev。eventsEPOLLOUT;break;caseACCEPTCB:rheaditems〔fd〕。fdfd;rheaditems〔fd〕。acceptcbcb;rheaditems〔fd〕。argarg;ev。eventsEPOLLIN;break;}epollctl(repfd,EPOLLCTLADD,fd,ev);return0;}intDelEvent(intfd,NCALLBACKcb,intevents,intarg){structreactorrgetInstance();structepolleventev{0};ev。data。ptrarg;epollctl(repfd,EPOLLCTLDEL,fd,ev);}structreactorinstanceNULL;structreactorgetInstance(void){if(instanceNULL){instancemalloc(sizeof(structreactor));if(instanceNULL)returnNULL;memset(instance,0,sizeof(structreactor));if(0InitReactor(instance)){returnNULL;}}}voidreactorloop(){while(true){intnReadyepollwait(epfd,events,POLLSIZE,5);if(nReady1)continue;for(inti0;inReady;i){intclientfdevents〔i〕。data。fd;if(clientfdlistenfd){Rheaditems〔listenfd〕。acceptcb(listenfd,0,NULL);}if(events〔i〕。eventsEPOLLIN){Rheaditems〔listenfd〕。readcb(clientfd,0,NULL);}if(events〔i〕。eventsEPOLLOUT){Rheaditems〔listenfd〕。writecb(clientfd,0,NULL);}}}}voidmain(){intlistenfdinitServer(9999);SetEvent(listenfd,acceptcallback,ACCEPTCB,NULL);reactorloop();}