示例#1
0
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);

}
示例#2
0
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;
}