- 论坛徽章:
- 0
|
程序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");
}
}
}
}
|
|