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 + -
显示快捷键?