免费注册 查看新帖 |

Chinaunix

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

寻求一个关于epoll的tcp长连接的服务器模型 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-11-08 15:41 |只看该作者 |倒序浏览
如题

论坛徽章:
0
2 [报告]
发表于 2006-11-08 15:46 |只看该作者
我自己做了一个发现越来越多的端口处于CLOSE_WAIT状态

论坛徽章:
0
3 [报告]
发表于 2006-11-08 15:48 |只看该作者
源码如下,请各位大虾帮忙查查问题

#include <sys/epoll.h>
#include "wtcppack.h"
#include "pubfunctions.h"
#include <pthread.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#define  MY_SOCKET int

MY_SOCKET listenfd;
MY_SOCKET g_listenfd;

int epfd  = 0;

void *thread_main(void *data);
void setnonblocking(int sock)

{

        int opts;

        opts = fcntl(sock,F_GETFL);
        if (opts < 0) {
                perror("fcntl(F_GETFL)");
                exit(0);
        }
        opts = (opts | O_NONBLOCK);
        if (fcntl(sock,F_SETFL,opts) < 0) {
                perror("fcntl(F_SETFL)");
                exit(1);
        }
        return;

}

int mylisten(void)
{
        epfd = epoll_create(512);
        if (epfd == -1)
        {
                printf("epoll_create error, errono = %d\n", errno);
                return epfd;
        }

        g_listenfd = socket(AF_INET, SOCK_STREAM, 0);
        if (g_listenfd == -1)
        {
                printf("create listen socket error, errono = %d\n", errno);
                return g_listenfd;
        }
        else
                printf("create listen socket ok, socket = %d\n", g_listenfd);

        setnonblocking(g_listenfd);

        struct epoll_event ev;
        ev.data.fd = g_listenfd;
        ev.events=EPOLLIN | EPOLLET;//EPOLLPRI | EPOLLERR | EPOLLHUP;
        if (epoll_ctl(epfd,EPOLL_CTL_ADD, g_listenfd, &ev))
        {
                printf("cpoll_ctl listen socket error, errono = %d\n", errno);
                return -1;               
        }

        struct sockaddr_in serveraddr;
        bzero(&serveraddr, sizeof(serveraddr));
        serveraddr.sin_family = AF_INET;

        char *local_addr = "192.168.1.18";
        inet_aton(local_addr,&(serveraddr.sin_addr));
        serveraddr.sin_port=htons(10002);
        if (bind(g_listenfd, (sockaddr *)&serveraddr, sizeof(serveraddr)) == -1)
        {
                printf("bind listen socket error, errono = %d\n", errno);
                return -1;       
        }
        if (listen(g_listenfd, 1024) == -1)
        {
                printf("listen socket error, errono = %d\n", errno);
                return -1;       
        }

        return 0;
}

void thread_make()
{
        pthread_t tid;       
        pthread_attr_t threadAttr1;
        pthread_attr_init(&threadAttr1);
        pthread_attr_setstacksize(&threadAttr1, 1024 * 1024);
        if(pthread_create(&tid,&threadAttr1,&thread_main,NULL)!=0)
        {
                printf("Create tcp thread error\n");
                return;
        }

}

void *thread_main(void *data)
{
        struct epoll_event events[100];

        for ( ; ; ) {
                printf("begin epoll wait, threadid = %d\n", pthread_self());
               
                int nfds=epoll_wait(epfd,events,100, -1);
                printf("time=%u, count= %d\n", time(NULL), nfds);
                for(int i=0;i<nfds;++i)
                {
                        printf("%u begin epoll wait, fd  = %d, events = %lu\n", i, events[i].data.fd, events[i].events);
                        if(events[i].data.fd == g_listenfd )
                        {

                                struct sockaddr_in clientaddr;
                                socklen_t clilen = sizeof(clientaddr);
                                memset(&clientaddr, 0, sizeof(clientaddr));

                                int connfd = accept(g_listenfd,(sockaddr *)&clientaddr, &clilen);
                                if(connfd<0){
                                        printf("error in g_listenfd %s\n",strerror(errno));
                                        continue;
                                }

                                setnonblocking(connfd);

                                printf("new connection fd = %d\n", connfd);

                                struct epoll_event ev;
                                ev.data.fd=connfd;
ev.events=EPOLLIN | EPOLLET | EPOLLHUP;
                                //ev.events=EPOLLHUP|EPOLLERR|EPOLLIN|EPOLLET|EPOLLPRI;
                                epoll_ctl(epfd, EPOLL_CTL_ADD, connfd ,&ev);

                                //sleep(5);
                        }

                        else if(events[i].events&EPOLLIN)
                        {

                char buffer[102400] = {0};
                                if ( (events[i].data.fd) < 0) continue;
                                int connfd = events[i].data.fd;       
                                while(1)
                                {

                                        int a = recv(connfd, buffer, 55, 0);
                                        //if(a>=0)
                                            printf("a = %d\n",a);
                                        if (a == 0)
                                        {
                                                struct epoll_event ev;
                                                ev.data.fd=connfd;
                                                if (epoll_ctl(epfd, EPOLL_CTL_DEL, connfd ,&ev) == 0)
                                                {
                                                        //ev.events=EPOLLHUP|EPOLLERR|EPOLLOUT|EPOLLET|EPOLLPRI;
                                                        //printf("epoll_ctl after del return = %d\n", epoll_ctl(epfd, EPOLL_CTL_MOD, connfd ,&ev));
                                                }

                                                if (myclose(connfd) == 0)
                                                        printf("close success\n");
                                                else
                                                        printf("close error\n");

                                                break;
                                        }
                                        else //if(a>0)
                                        {
                                                usleep(1000 * 10);
                                                struct epoll_event ev;
                                                ev.data.fd=connfd;
                                                ev.events=EPOLLIN | EPOLLET|EPOLLHUP;
                                                //ev.events=EPOLLHUP|EPOLLERR|EPOLLIN|EPOLLET|EPOLLPRI;
                                                int s = epoll_ctl(epfd, EPOLL_CTL_MOD, connfd ,&ev);
                                                printf("s = %d, %s\n",s, strerror(errno));

                                                break;
                                        }
                                        /*else
                                                continue;*/
                                }
                                printf("while break;\n");
                               
                        }

                        else if(events[i].events&EPOLLOUT)
                        {   
                                if ( (events[i].data.fd) < 0) continue;
                                int connfd = events[i].data.fd;

                                //send(connfd, buffer, strlen(buffer), 0);

                                struct epoll_event ev;
                                ev.data.fd=connfd;
                                ev.events=EPOLLHUP|EPOLLERR|EPOLLIN|EPOLLET|EPOLLPRI;
                                epoll_ctl(epfd, EPOLL_CTL_MOD, connfd ,&ev);

                        }
                        else if(events[i].events&EPOLLERR)
                        {
                                printf("error on fd = %d\n", events[i].data.fd);
                        }
                        else if(events[i].events&EPOLLHUP)
                        {
                                printf("hup on fd = %d\n", events[i].data.fd);
                        }
                        else if (events[i].events & EPOLLPRI)
                        {
                                printf(" epollpri %d\n", events[i].data.fd);
                        }
                        else if (events[i].events & EPOLLET)
                                printf("epollet %d\n", events[i].data.fd);
                }
        }
}

int main()
{
        mylisten();
       
        thread_make();
       
        while (1)
        {
        }
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP