epoll事件的处理

C、C++和Java语言
回复
weihua2008
帖子: 448
注册时间: 2008-07-10 15:08
送出感谢: 0
接收感谢: 0
联系:

epoll事件的处理

#1

帖子 weihua2008 » 2008-09-17 16:45

如何判断epoll事件,并做出相应的处理
假若我是客户端,想通过epoll轮询I/O事件
然后进行相应的接发数据
epollfd=epoll_create()
epoll_ctl(epollfd,EPOLL_CTL_ADD,sockfd,&ev)
nfdsepoll_wait(epollfd,events,30,-1);
for(;;){
for(i=0;i<nfds;i++){
if(events.events&EPOLLIN){
int err=recv(cli_sockfd,buff,100,0);
if(-1==err&& errno == EAGAIN){
fprintf(stderr,"读取数据失败%s\n",strerror(errno));
continue;

}else if (err==0){
perror(" 服务器已经断开,结束连接\n");
close(cli_sockfd);
close(epoll_fd);
time_to_exit=0;
_exit(0);
}else{
buff[err]='\0';
printf("接收到的数据为:%s\n",buff);
}
}
if(events.events&EPOLLOUT){
char send_buff[100];
printf("请输入要发送的信息(以'quit'来结束发送信息)\n");
scanf("%s",send_buff);
if(strlen(send_buff)==4&&(strncmp(send_buff,"quit",4)==0)){
time_to_exit=0;
perror("您按了退出键,系统推出\n");
close(cli_sockfd);
close(epoll_fd);
_exit(0);
}else{
if(send(cli_sockfd,send_buff,strlen(send_buff)+1,0)==-1){
perror("数据发送失败,请重新发送!\n");
continue;
}

}
按照这种方式接发数据的话,假设先接收数据,接收成功,然后开始发送数据,在发送数据期间若有数据传过来的话,不能及时接收,只有当把数据发送出去回过偷来才能接收数据


我感觉、这样用epoll肯定是错误的,有哪位高人对这个有了解,希望指教
就是如何用epoll轮询socket收发事件,因该如何处理相应的事件
谢谢
回复

回到 “C/C++/Java”