void st_epoll_test(void) { int ret = 0; int lsocket = 0; ST_THREAD_MANAGE st_manage; P_ST_THREAD_MANAGE p_manage = &st_manage; if ( !st_threadpool_init(p_manage, 5)) { st_print("st_threadpool_init FAILED!\n"); return; } P_EPOLL_STRUCT p_epoll = NULL; lsocket = st_buildsocket(10, 7899); st_make_nonblock(lsocket); if (lsocket == -1) { st_print("st_buildsocket FAILED!\n"); return; } p_epoll = st_make_events(lsocket, 32); if (!p_epoll) { st_print("st_make_events FAILED!\n"); return; } st_event_loop(p_epoll, p_manage, response_func); }
int main(int argc, char* argv[]) { int lsocket = -1; //侦听套接字 int dsocket = -1; //连接套接字 ushort mix_socket[2]; memset(mix_socket, 0, sizeof(mix_socket)); P_EPOLL_STRUCT p_epoll = NULL; char buf[4096]; int cnt = 0; int ready = 0; // STAGE1, build local listen EXIT_IF_TRUE ( (lsocket = st_buildsocket(10, SERV_PORT)) == -1); st_make_nonblock(lsocket); EXIT_IF_TRUE( (p_epoll = st_make_events(lsocket, 64)) == NULL); st_print("SERVER prepared OK!\n"); int e_i = 0; while (TRUE) { ready = epoll_wait(p_epoll->event_fd, p_epoll->p_events, 64, 5000 /*5s*/); if (ready == -1) { SYS_ABORT("EPOLL_WAIT ERROR!\n"); } if( ready == 0) { st_print("PROCESS ALIVE!\n"); continue; } for (e_i = 0; e_i < ready; ++e_i) { if( (p_epoll->p_events[e_i].events & EPOLLERR) ) { st_d_error("Epoll Error!\n"); close(p_epoll->p_events[e_i].data.fd); continue; } if ( ( p_epoll->p_events[e_i].events & EPOLLHUP ) || ( p_epoll->p_events[e_i].events & EPOLLRDHUP) ) { st_d_error("Remote Disconnected!\n"); close(p_epoll->p_events[e_i].data.fd); continue; } if (p_epoll->p_events[e_i].data.fd == lsocket) { struct sockaddr in_addr; socklen_t in_len; dsocket = accept(lsocket, (struct sockaddr *) &in_addr, &in_len); if (dsocket == -1) { st_d_error("accept lsocket error!\n"); continue; } st_make_nonblock(dsocket); if (st_add_new_event(dsocket, p_epoll)) { st_d_error("Add socket:%d to event error!\n", dsocket); close(dsocket); dsocket = -1; //INVALID break; } st_print("Server accept new socket:%d\n", dsocket); if(mix_socket[0] == 0) mix_socket[0] = dsocket; else mix_socket[1] = dsocket; } else //数据转发部分 { if(p_epoll->p_events[e_i].data.fd == mix_socket[0]) { memset(buf, 0, sizeof(buf)); cnt = recv(mix_socket[0], buf, sizeof(buf), 0); if (cnt > 0) { //write(1, buf, cnt); send(mix_socket[1], buf, cnt, 0); } continue; } else if(p_epoll->p_events[e_i].data.fd == mix_socket[1]) { memset(buf, 0, sizeof(buf)); cnt = recv(mix_socket[1], buf, sizeof(buf), 0); if (cnt > 0) { //write(1, buf, cnt); send(mix_socket[0], buf, cnt, 0); } continue; } } } } st_print("PROCESS TERMINATED!\n"); return 0; }