⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 server5.c

📁 《Beginning linux programming》一书相应的源代码
💻 C
字号:
/*  For our final example, server5.c,     we include the sys/time.h and sys/ioctl.h headers in place of signal.h    in our last program and declare some extra variables to deal with select.  */#include <sys/types.h>#include <sys/socket.h>#include <stdio.h>#include <netinet/in.h>#include <sys/time.h>#include <sys/ioctl.h>#include <unistd.h>int main(){    int server_sockfd, client_sockfd;    int server_len, client_len;    struct sockaddr_in server_address;    struct sockaddr_in client_address;    int result;    fd_set readfds, testfds;/*  Create and name a socket for the server.  */    server_sockfd = socket(AF_INET, SOCK_STREAM, 0);    server_address.sin_family = AF_INET;    server_address.sin_addr.s_addr = htonl(INADDR_ANY);    server_address.sin_port = htons(9734);    server_len = sizeof(server_address);    bind(server_sockfd, (struct sockaddr *)&server_address, server_len);/*  Create a connection queue and initialize readfds to handle input from server_sockfd.  */    listen(server_sockfd, 5);    FD_ZERO(&readfds);    FD_SET(server_sockfd, &readfds);/*  Now wait for clients and requests.    Since we have passed a null pointer as the timeout parameter, no timeout will occur.    The program will exit and report an error if select returns a value of less than 1.  */    while(1) {        char ch;        int fd;        int nread;        testfds = readfds;        printf("server waiting\n");        result = select(FD_SETSIZE, &testfds, (fd_set *)0,             (fd_set *)0, (struct timeval *) 0);        if(result < 1) {            perror("server5");            exit(1);        }/*  Once we know we've got activity,    we find which descriptor it's on by checking each in turn using FD_ISSET.  */        for(fd = 0; fd < FD_SETSIZE; fd++) {            if(FD_ISSET(fd,&testfds)) {/*  If the activity is on server_sockfd, it must be a request for a new connection    and we add the associated client_sockfd to the descriptor set.  */                if(fd == server_sockfd) {                    client_len = sizeof(client_address);                    client_sockfd = accept(server_sockfd,                         (struct sockaddr *)&client_address, &client_len);                    FD_SET(client_sockfd, &readfds);                    printf("adding client on fd %d\n", client_sockfd);                }/*  If it isn't the server, it must be client activity.    If close is received, the client has gone away and we remove it from the descriptor set.    Otherwise, we 'serve' the client as in the previous examples.  */                else {                    ioctl(fd, FIONREAD, &nread);                    if(nread == 0) {                        close(fd);                        FD_CLR(fd, &readfds);                        printf("removing client on fd %d\n", fd);                    }                    else {                        read(fd, &ch, 1);                        sleep(5);                        printf("serving client on fd %d\n", fd);                        ch++;                        write(fd, &ch, 1);                    }                }            }        }    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -