并发服务器(select)

#include "tcp.h"
#include "all.h"
#include "db.h"

#define N 100


int main(void)
{
    int skt = tcp_server_init("0.0.0.0", 8888, 10);
    
    //创建一张文件描述符集合表
    fd_set table;
    //清空表
    FD_ZERO(&table);
    //将skt加入表
    FD_SET(skt, &table);
    //监听最大值
    int max = skt;
    int nfd = 0;
    int ret = 0;
    int i;
    char buf[N]={'\0'};
    while(1)
    {
        fd_set tableTmp = table;
        ret = select(max+1, &tableTmp, NULL, NULL, NULL);
        if(ret <= 0)
        {
            continue;
        }
        
        for(i = 0; i < max+1; i++)
        {
            //判断是哪路响应
            if(FD_ISSET(i, &tableTmp))
            {
                printf("%d号通道响应\n",i);
                //判断是不是socket通道响应
                if(i == skt)
                {    
                    //如果是,再开辟一条软通道传输数据
                    nfd = tcp_server_connect(skt);
                    if(nfd < 0)
                    {
                        continue;
                    }
                    printf("%d号通道被开通!\n",nfd);
                    //将开通的通道加到真实表中去
                    FD_SET(nfd, &table);
                    if(max < nfd)
                    {
                        max = nfd;
                    }
                }
                else
                {
                    //若不是socket通道响应则读取数据
                    ret = recv(i,buf,N,0);
                    if(ret > 0)
                    {
                        //数据处理
                        fun_db(buf, i);
                    }
                    else
                    {
                        printf("%d号通道关闭\n",i);
                        //若读取到的数据为空则关闭通道
                        close(i);
                        FD_CLR(i, &table);
                    }
                        
                }
            }
        }
    }
    close(skt);
    return 0;
}

 

posted @ 2022-05-26 23:44  西北小蚂蚁  阅读(24)  评论(0编辑  收藏  举报