免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1685 | 回复: 0
打印 上一主题 下一主题

[C] 新手epoll问题请教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-04-01 20:38 |只看该作者 |倒序浏览
程序1:在epoll主循环中

else if(events[n].events&EPOLLIN){
                                   struct ep_event write_event;
                                                   write_event.ev_fd = event->ev_fd;
                                                   write_event.ev_type = ev_conn_write;
                                                   int x = 123;
                                                   write_event.data_ptr = &x;

                                                   struct epoll_event eep;
                                                   eep.data.ptr = &write_event;
                                                   eep.events=EPOLLOUT|EPOLLET;
                                                   if(epoll_ctl(server.ep_fd,EPOLL_CTL_MOD,event->ev_fd,&eep)<0)
                                                           perror("register_event");

在处理EPOLLOUT中获取的事件内容正常。改成

void test(int fd){
        printf("test fd--->%d\n",fd);
        struct ep_event write_event;
                        write_event.ev_fd = fd;
                        write_event.ev_type = ev_conn_write;
                        int x = 123;
                        write_event.data_ptr = &x;

                        struct epoll_event eep;
                        eep.data.ptr = &write_event;
                        eep.events=EPOLLOUT|EPOLLET;
                        if(epoll_ctl(server.ep_fd,EPOLL_CTL_MOD,fd,&eep)<0)
                                perror("register_event");
}

  else if(events[n].events&EPOLLIN){
                                   test(event->ev_fd);


结果就不正常了。。。


程序全部逻辑为:
#include <stdio.h>
#include <sys/epoll.h>
#include <sys/socket.h>
#include <sys/fcntl.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/epoll.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <errno.h>
#include "server.h"
#include "protocol.h"
#include <strings.h>
#include <string.h>
//void read_client_data(struct ep_event *event){
////        struct cmd c = parse_protocol(event->ev_fd);
//        printf("read_client_data_fd->%d\n",event->ev_fd);
////        if (c.success ==1){
//                printf("read success\n");
////                struct ep_event write_event;
////                write_event.ev_fd = event->ev_fd;
////                write_event.ev_type = ev_conn_write;
////                int x = 123;
////                write_event.data_ptr = &x;
////
////                struct epoll_event eep;
////                eep.data.ptr = &write_event;
////                eep.events=EPOLLOUT|EPOLLET;
////                if(epoll_ctl(server.ep_fd,EPOLL_CTL_MOD,event->ev_fd,&eep)<0)
////                        perror("register_event");
//        }
////}

void test(int fd){
        printf("test fd--->%d\n",fd);
        struct ep_event write_event;
                        write_event.ev_fd = fd;
                        write_event.ev_type = ev_conn_write;
                        int x = 123;
                        write_event.data_ptr = &x;

                        struct epoll_event eep;
                        eep.data.ptr = &write_event;
                        eep.events=EPOLLOUT|EPOLLET;
                        if(epoll_ctl(server.ep_fd,EPOLL_CTL_MOD,fd,&eep)<0)
                                perror("register_event");
}

void write_data_to_client(struct ep_event *event){
        printf("write_data_to_client\n");
        printf("write fd->%d\n",event->ev_fd);
//        struct ep_event read_event;
//        read_event.ev_fd = event->ev_fd;
//        read_event.ev_type = ev_conn_read;
//        if(register_event(server.ep_fd,&read_event,1)<0)
//                perror("register_event");
}

void server_init(int port){
        server.listen_fd = socket(AF_INET, SOCK_STREAM, 0);
        fcntl(server.listen_fd, F_SETFL, O_NONBLOCK);
        server.ep_fd = epoll_create(MAX_EVENTS);
        bzero(&server.sock_addr, sizeof(server.sock_addr));
        server.sock_addr.sin_family = AF_INET;
        server.sock_addr.sin_addr.s_addr = INADDR_ANY;
        server.sock_addr.sin_port = htons(port);
        bind(server.listen_fd, (const struct sockaddr*)&server.sock_addr, sizeof(server.sock_addr));
        listen(server.listen_fd, 5);
}

/**
* type=0 add
* type=1 mod
* type=2 delete
*/
int register_event(int ep_fd,struct ep_event *e,int type){
        struct epoll_event ev;
        ev.data.ptr = e;
        switch(e->ev_type){
        case ev_conn_read:
                ev.events=EPOLLIN|EPOLLET;
                break;
        case ev_conn_write:
                ev.events=EPOLLOUT|EPOLLET;
                break;
        }
        if(type==2){
                return epoll_ctl(ep_fd,EPOLL_CTL_DEL,e->ev_fd,&ev);
        }

        if(type==1){
                return epoll_ctl(ep_fd,EPOLL_CTL_MOD,e->ev_fd,&ev);
        }
        return epoll_ctl(ep_fd,EPOLL_CTL_ADD,e->ev_fd,&ev);
}

void ep_main_start(){
        int n,client_fd;
        struct sockaddr clinet_addr;
        socklen_t addr_size;
        struct epoll_event events[20];
        while(1){
                int num = epoll_wait(server.ep_fd, events, 20, -1);
                 for(n = 0; n < num; ++n) {
                                           struct ep_event *event = (struct ep_event *)events[n].data.ptr;
                                           //int innerFD = event->ev_fd;
                                           printf("ev_fd=>%d\n",event->ev_fd);
                               if(event->ev_fd == server.listen_fd) {
                                       memset(&clinet_addr, 0, sizeof(struct sockaddr_in));
                                       addr_size = 1;
                                       client_fd = accept(server.listen_fd, &clinet_addr,&addr_size);
                                       //printf("client_fd->%d\n",client_fd);
                                   if(client_fd < 0){
                                       perror("accept");
                                       continue;
                                   }
                                   fcntl(client_fd, F_SETFL, O_NONBLOCK);

                                   struct ep_event e;
                                   e.ev_fd = client_fd;
                                   e.ev_type = ev_conn_read;
                                   if (register_event(server.ep_fd,&e,0)< 0) {
                                       fprintf(stderr, "epoll set insertion error: fd=%d\n",
                                                       client_fd);
                                       return;
                                   }
                               }
                               else if(events[n].events&EPOLLIN){
                                   //read_client_data(event);
                                       printf("start----------->%d\n",event->ev_fd);
                                   test(event->ev_fd);
                                   printf("end----------->%d\n",event->ev_fd);
                                   printf("read_client_data_finish !\n");
//                                   struct ep_event write_event;
//                                                   write_event.ev_fd = event->ev_fd;
//                                                   write_event.ev_type = ev_conn_write;
//                                                   int x = 123;
//                                                   write_event.data_ptr = &x;
//
//                                                   struct epoll_event eep;
//                                                   eep.data.ptr = &write_event;
//                                                   eep.events=EPOLLOUT|EPOLLET;
//                                                   if(epoll_ctl(server.ep_fd,EPOLL_CTL_MOD,event->ev_fd,&eep)<0)
//                                                           perror("register_event");
//                                   struct ep_event write_event;
//                                                   write_event.ev_fd = event->ev_fd;
//                                                   write_event.ev_type = ev_conn_write;
//                                                   int x = 123;
//                                                   write_event.data_ptr = &x;
//                                                   if(register_event(server.ep_fd,&write_event,1)<0)
//                                                           perror("register_event");
                               }
                               else if(events[n].events&EPOLLOUT){
                                       printf("before write_fd\n");
                                       printf("write fd->%d\n",event->ev_fd);
//                                       int *x = (int *)(event->data_ptr);
//                                       printf("write data ptr addr->%d\n",event->data_ptr);
                                       printf("write data ptr value->%d\n",*(event->data_ptr));
                                       write_data_to_client(event);
                               }
                               else if(events[n].events&EPOLLPRI){

                               }

                               else {
                                       printf("else logic \n");
                               }
                           }
                       }
}




您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP