LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 656|回复: 2

帮帮我,select IO复用实现多个客户连接的问题

[复制链接]
发表于 2004-7-21 19:39:37 | 显示全部楼层 |阅读模式
源代码:printf()语句为测试所用
# include <sys/types.h>
# include <sys/socket.h>
# include <stdio.h>
# include <stdlib.h>
# include <netinet/in.h>
# include <string.h>
# include <sys/select.h>
# include <sys/time.h>
# include <sys/types.h>
# include <unistd.h>
# include <fcntl.h>
# include <errno.h>
# include <netinet/tcp.h>
# include <arpa/inet.h>
# define SA     struct sockaddr

int CheckSockets(int sockfd1);
int CliConnection(int sockfd2);
int ReadSocket(int sockfd3);
int CloseConnections();

fd_set  rfds, afds;
int         maxfd,client[FD_SETSIZE];

int main()
{
        int     listenfd,sockfd,i,retsec,maxi = -1,n,on = 1;
        struct sockaddr_in seraddr;

        if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
                printf("creat listenfd failed!\n");
                return -1;
        }

        memset((char *)&seraddr, 0, sizeof(seraddr));
        seraddr.sin_family = AF_INET;
        seraddr.sin_addr.s_addr = htonl(INADDR_ANY);
        seraddr.sin_port = htons(8001);

        if(setsockopt(listenfd, SOL_SOCKET,SO_REUSEADDR, (char *)&on, sizeof(on)) < 0) {
                printf("set sockopt failed!\n");
                return -1;
        }

        if (bind(listenfd,(struct sockaddr*)&seraddr,sizeof(seraddr)) < 0) {
                printf("bind failed!\n");
                return -1;
        }

        if (listen(listenfd, 5) < 0)    {
                printf("listening failed!\n");
                return -1;
        }
        for (i=0;i<FD_SETSIZE;i++)
                client = -1;
        maxfd = listenfd ;
   
            FD_ZERO(&afds);
            FD_SET(listenfd, &afds);printf("listenfd:%d\n",listenfd);

        printf("start listen...\n");
        for(;;) {
                if (retsec = CheckSockets(maxfd) > 0) {printf("check 1st\n");
                        for(i=0;i<=maxfd;i++) {printf("i::%d\n",i);
                                if (!FD_ISSET(i, &rfds))  continue ;printf("isset 1st...i::%d\n",i);
                                if (i == listenfd){
                                        if ((maxi = CliConnection(listenfd)) > -1)
                                                printf("client conn succ!\n");
                                        else
                                                printf("creat connfd failed!\n");
                                }
                        }printf("1st for after\n");
                }else if (retsec == 0){printf("check time out\n");
                                continue;}
                else        {printf("check failed!\n");
                        break;}
                printf("before maxi\n");
                printf("maxi::%d\n",maxi);
                if (maxi > -1)
                        for (i=0;i<=maxi;i++) {printf("for 2nd...client::%d\n",client);
                                if(sockfd = client < 0)
                                        continue;
                                if (FD_ISSET(sockfd,&afds)){printf("connfd is read\n");
                                        if (n = ReadSocket(sockfd) > 0)
                                                printf("read sockfd succ!\n");
                                        else if (n = 0)
                                                printf("read 0 byte!\n");
                                        else{
                                                close(sockfd);
                                                client = -1;       
                                                printf("read sockfd < 0\n");
                                        }
                                }
                        }
        }printf("close before\n");
        CloseConnections();
}
/*检查是否有描述字准备好*/
int CheckSockets(int sockfd1)
{      
        int     retval;
        struct timeval  xt;
               
        xt.tv_sec = 2 ;
        xt.tv_usec = 0;
        
        memcpy((char *)&rfds, (char *)&afds, sizeof(rfds));
        retval = select(sockfd1 + 1, &rfds, NULL,NULL, &xt);
        
        if (retval < 0) {
            
            if (errno == EINTR)   return 1 ;
            else {               
                return -1 ;
            }
        }else if (retval == 0)
                return 0;
        else
                return 1;
}
/*创建连接套接字,成功则将其值赋给client*/
int CliConnection(int sockfd2)
{
        int     i,connfd ;
            int         on = 1;
        struct timeval  xt;

        xt.tv_sec = 2 ;
        xt.tv_usec = 0;
        
            if ((connfd = accept(sockfd2, NULL,NULL)) < 0) {
                return -1;   
            }
   
            if (setsockopt(connfd, SOL_SOCKET, SO_KEEPALIVE, (char *)&on, sizeof(on)) < 0) {
                return -1;
            }

        /*if (setsockopt(connfd,SOL_SOCKET,SO_RCVTIMEO,&xt,sizeof(xt)) < 0)
                return -1;*/printf("connfd::%d\n",connfd);

        if (fcntl(connfd, F_SETFL, O_NONBLOCK) < 0) {
                return -1 ;   
             }

        for (i=0;i<FD_SETSIZE;i++)
                if (client < 0) {
                        client = connfd;
                        break;
                }

            if (maxfd < connfd)
                  maxfd = connfd;

            FD_SET(connfd, &afds);
        return i;
}
/*读可以读的描述字*/
int ReadSocket(int sockfd3)
{
       
        int     fpout1,n,fpout;
        FILE *  fpout2;
        char    line[512] = {NULL};
        char    file[100];
       
        sprintf(file,"logg");
        if((fpout1=open(file,O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR))==-1) {
                printf("creat file failed!\n");
                exit(1);
        }
        //fpout = fopen(file,"w");

        memset(line,0,sizeof(line));
        n = recvfrom(sockfd3,line,512,0,NULL,NULL);
        if (n < 0){
                   if (errno == EWOULDBLOCK){
                            printf("socket timeout!\n");
                             return 1;
                   }
        }else
                return -1;
        if (n = 0)
                return 0;
        line[n] = 0;
        printf("line:%s\n",line);
        write(fpout1,line,n);
        return 1;
}

int CloseConnections()
{
        int i,fd;
               
        for (i=0;i<FD_SETSIZE;i++) {
                if (fd = client < 0)
                        continue;
                    if (fd > 0) {
                        close(fd);
                        FD_CLR(fd, &afds);
                        client = -1;
                }
        }      
}
发表于 2004-7-21 22:15:30 | 显示全部楼层
你倒是把你想要问的问题写在文章里面啊?
就这样人家知道你想要大家解决什么问题啊?
发表于 2004-7-21 22:32:38 | 显示全部楼层
用代码模式,否则源码乱的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表