并发服务器(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; }