p12-15t.c
来自「SUN Solaris8平台下进程间通信」· C语言 代码 · 共 95 行
C
95 行
#include <sys/types.h>#include <sys/socket.h>#include <sys/time.h>#include <netinet/in.h>#include <netdb.h>#include <stdio.h>#define MAXBUFSIZE 1024#ifndef socklen_t#define socklen_t int#endifint socket_listen(const char *, const char *);int main(int argc, char **argv){ int i,maxi,maxfd,listenfd,connfd,sockfd; int nready,client[FD_SETSIZE]; ssize_t n; fd_set rset,allset; char buf[MAXBUFSIZE]; socklen_t clilen; struct sockaddr_in servaddr,cliaddr; int rval; struct timeval to; /* 创建服务套接字并建立侦听队列 */ listenfd = socket_listen(NULL, "2003"); /* 初始化描述字集合、最大描述字个数、客户数组client以及其索引maxi、 */ printf("listenfd=%d\n",listenfd); FD_ZERO(&allset); FD_SET(listenfd, &allset); maxfd = listenfd; for (i=0; i<FD_SETSIZE; i++) client[i] = -1; /* -1表示该登记项没有记录 */ maxi = -1; /* 等待客户 */ while (1) { rset = allset; /* 等待到达新的连接或者新的输入*/ printf("wait at select\n"); nready = select(maxfd + 1, &rset, NULL, NULL, NULL); printf("selected,nready=%d\n",nready); /* 判别就绪的是连接还是输入 */ if (FD_ISSET(listenfd, &rset)){ /*如果就绪的是listenfd,意味到达了新的连接 */ /* 接收连接 */ printf(" ready accept\n"); clilen = sizeof(cliaddr); connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &clilen); /* 加入这个新客户至客户数组 */ printf("accept ok connfd=%d,FD_SETSIZE=%d\n",connfd,FD_SETSIZE); for (i = 0; i<FD_SETSIZE; i++) if (client[i] < 0){ client[i] = connfd; printf("client[i]=%d,i=%d\n", client[i],connfd); break; } if (i == FD_SETSIZE) { printf("too many clients\n"); exit(1); } FD_SET(connfd,&allset); printf("record fd ok\n"); if (connfd > maxfd) maxfd = connfd; /* 记录最大连接数,用于select */ if(i > maxi) maxi = i; /* 记录当前最大客户数 */ if (--nready <= 0) /* 若无可读的套接字,回去等待下一个就绪套接字 */ continue; } /* 就绪集合中有可读套接字,逐一处理其中的每一个 */ printf(" input fd ,maxi=%d\n",maxi); sleep(5); for (i = 0; i <= maxi; i++) { if ((sockfd = client[i]) < 0){ /* 无效记录 */ printf("sockfd<0\n"); sleep(5); continue; } if (FD_ISSET(sockfd, &rset)){ /* 如果是读就绪套接字 */ /* 读该套接字。若遇到文件尾,关闭它并从就绪集合中清除 */ printf (" before read socket \n"); sleep(5); if ((n = read(sockfd, buf, MAXBUFSIZE)) == 0){ close(sockfd); FD_CLR(sockfd,&allset); client[i] = -1; } else /* 否则,回答客户 */ write(sockfd, buf, n); if (--nready <= 0) /* 已无可读套接字 */ break; } printf("i=%d,sockfd=%d\n",i,sockfd); } }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?