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

📄 strclinonb.lc

📁 unix网络编程卷1:套接口API的全书源码
💻 LC
字号:
/* include nonb1 */#include    "unp.h"##  1 ##src/nonblock/strclinonb.c##void##  2 ##src/nonblock/strclinonb.c##str_cli(FILE *fp, int sockfd)##  3 ##src/nonblock/strclinonb.c##{##  4 ##src/nonblock/strclinonb.c##    int     maxfdp1, val, stdineof;##  5 ##src/nonblock/strclinonb.c##    ssize_t n, nwritten;##  6 ##src/nonblock/strclinonb.c##    fd_set  rset, wset;##  7 ##src/nonblock/strclinonb.c##    char    to[MAXLINE], fr[MAXLINE];##  8 ##src/nonblock/strclinonb.c##    char   *toiptr, *tooptr, *friptr, *froptr;##  9 ##src/nonblock/strclinonb.c##    val = Fcntl(sockfd, F_GETFL, 0);## 10 ##src/nonblock/strclinonb.c##    Fcntl(sockfd, F_SETFL, val | O_NONBLOCK);## 11 ##src/nonblock/strclinonb.c##    val = Fcntl(STDIN_FILENO, F_GETFL, 0);## 12 ##src/nonblock/strclinonb.c##    Fcntl(STDIN_FILENO, F_SETFL, val | O_NONBLOCK);## 13 ##src/nonblock/strclinonb.c##    val = Fcntl(STDOUT_FILENO, F_GETFL, 0);## 14 ##src/nonblock/strclinonb.c##    Fcntl(STDOUT_FILENO, F_SETFL, val | O_NONBLOCK);## 15 ##src/nonblock/strclinonb.c##    toiptr = tooptr = to;       /* initialize buffer pointers */## 16 ##src/nonblock/strclinonb.c##    friptr = froptr = fr;## 17 ##src/nonblock/strclinonb.c##    stdineof = 0;## 18 ##src/nonblock/strclinonb.c##    maxfdp1 = max(max(STDIN_FILENO, STDOUT_FILENO), sockfd) + 1;## 19 ##src/nonblock/strclinonb.c##    for (;;) {## 20 ##src/nonblock/strclinonb.c##        FD_ZERO(&rset);## 21 ##src/nonblock/strclinonb.c##        FD_ZERO(&wset);## 22 ##src/nonblock/strclinonb.c##        if (stdineof == 0 && toiptr < &to[MAXLINE])## 23 ##src/nonblock/strclinonb.c##            FD_SET(STDIN_FILENO, &rset);    /* read from stdin */## 24 ##src/nonblock/strclinonb.c##        if (friptr < &fr[MAXLINE])## 25 ##src/nonblock/strclinonb.c##            FD_SET(sockfd, &rset);  /* read from socket */## 26 ##src/nonblock/strclinonb.c##        if (tooptr != toiptr)## 27 ##src/nonblock/strclinonb.c##            FD_SET(sockfd, &wset);  /* data to write to socket */## 28 ##src/nonblock/strclinonb.c##        if (froptr != friptr)## 29 ##src/nonblock/strclinonb.c##            FD_SET(STDOUT_FILENO, &wset);   /* data to write to stdout */## 30 ##src/nonblock/strclinonb.c##        Select(maxfdp1, &rset, &wset, NULL, NULL);## 31 ##src/nonblock/strclinonb.c##/* end nonb1 *//* include nonb2 */        if (FD_ISSET(STDIN_FILENO, &rset)) {## 32 ##src/nonblock/strclinonb.c##            if ((n = read(STDIN_FILENO, toiptr, &to[MAXLINE] - toiptr)) < 0) {## 33 ##src/nonblock/strclinonb.c##                if (errno != EWOULDBLOCK)## 34 ##src/nonblock/strclinonb.c##                    err_sys("read error on stdin");## 35 ##src/nonblock/strclinonb.c##            } else if (n == 0) {## 36 ##src/nonblock/strclinonb.c##                fprintf(stderr, "%s: EOF on stdin\n", gf_time());## 37 ##src/nonblock/strclinonb.c##                stdineof = 1;   /* all done with stdin */## 38 ##src/nonblock/strclinonb.c##                if (tooptr == toiptr)## 39 ##src/nonblock/strclinonb.c##                    Shutdown(sockfd, SHUT_WR);  /* send FIN */## 40 ##src/nonblock/strclinonb.c##            } else {## 41 ##src/nonblock/strclinonb.c##                fprintf(stderr, "%s: read %d bytes from stdin\n", gf_time(),## 42 ##src/nonblock/strclinonb.c##                        n);## 43 ##src/nonblock/strclinonb.c##                toiptr += n;    /* # just read */## 44 ##src/nonblock/strclinonb.c##                FD_SET(sockfd, &wset);  /* try and write to socket below */## 45 ##src/nonblock/strclinonb.c##            }## 46 ##src/nonblock/strclinonb.c##        }## 47 ##src/nonblock/strclinonb.c##        if (FD_ISSET(sockfd, &rset)) {## 48 ##src/nonblock/strclinonb.c##            if ((n = read(sockfd, friptr, &fr[MAXLINE] - friptr)) < 0) {## 49 ##src/nonblock/strclinonb.c##                if (errno != EWOULDBLOCK)## 50 ##src/nonblock/strclinonb.c##                    err_sys("read error on socket");## 51 ##src/nonblock/strclinonb.c##            } else if (n == 0) {## 52 ##src/nonblock/strclinonb.c##                fprintf(stderr, "%s: EOF on socket\n", gf_time());## 53 ##src/nonblock/strclinonb.c##                if (stdineof)## 54 ##src/nonblock/strclinonb.c##                    return;     /* normal termination */## 55 ##src/nonblock/strclinonb.c##                else## 56 ##src/nonblock/strclinonb.c##                    err_quit("str_cli: server terminated prematurely");## 57 ##src/nonblock/strclinonb.c##            } else {## 58 ##src/nonblock/strclinonb.c##                fprintf(stderr, "%s: read %d bytes from socket\n",## 59 ##src/nonblock/strclinonb.c##                        gf_time(), n);## 60 ##src/nonblock/strclinonb.c##                friptr += n;    /* # just read */## 61 ##src/nonblock/strclinonb.c##                FD_SET(STDOUT_FILENO, &wset);   /* try and write below */## 62 ##src/nonblock/strclinonb.c##            }## 63 ##src/nonblock/strclinonb.c##        }## 64 ##src/nonblock/strclinonb.c##/* end nonb2 *//* include nonb3 */        if (FD_ISSET(STDOUT_FILENO, &wset) && ((n = friptr - froptr) > 0)) {## 65 ##src/nonblock/strclinonb.c##            if ((nwritten = write(STDOUT_FILENO, froptr, n)) < 0) {## 66 ##src/nonblock/strclinonb.c##                if (errno != EWOULDBLOCK)## 67 ##src/nonblock/strclinonb.c##                    err_sys("write error to stdout");## 68 ##src/nonblock/strclinonb.c##            } else {## 69 ##src/nonblock/strclinonb.c##                fprintf(stderr, "%s: wrote %d bytes to stdout\n",## 70 ##src/nonblock/strclinonb.c##                        gf_time(), nwritten);## 71 ##src/nonblock/strclinonb.c##                froptr += nwritten; /* # just written */## 72 ##src/nonblock/strclinonb.c##                if (froptr == friptr)## 73 ##src/nonblock/strclinonb.c##                    froptr = friptr = fr;   /* back to beginning of buffer */## 74 ##src/nonblock/strclinonb.c##            }## 75 ##src/nonblock/strclinonb.c##        }## 76 ##src/nonblock/strclinonb.c##        if (FD_ISSET(sockfd, &wset) && ((n = toiptr - tooptr) > 0)) {## 77 ##src/nonblock/strclinonb.c##            if ((nwritten = write(sockfd, tooptr, n)) < 0) {## 78 ##src/nonblock/strclinonb.c##                if (errno != EWOULDBLOCK)## 79 ##src/nonblock/strclinonb.c##                    err_sys("write error to socket");## 80 ##src/nonblock/strclinonb.c##            } else {## 81 ##src/nonblock/strclinonb.c##                fprintf(stderr, "%s: wrote %d bytes to socket\n",## 82 ##src/nonblock/strclinonb.c##                        gf_time(), nwritten);## 83 ##src/nonblock/strclinonb.c##                tooptr += nwritten; /* # just written */## 84 ##src/nonblock/strclinonb.c##                if (tooptr == toiptr) {## 85 ##src/nonblock/strclinonb.c##                    toiptr = tooptr = to;   /* back to beginning of buffer */## 86 ##src/nonblock/strclinonb.c##                    if (stdineof)## 87 ##src/nonblock/strclinonb.c##                        Shutdown(sockfd, SHUT_WR);  /* send FIN */## 88 ##src/nonblock/strclinonb.c##                }## 89 ##src/nonblock/strclinonb.c##            }## 90 ##src/nonblock/strclinonb.c##        }## 91 ##src/nonblock/strclinonb.c##    }## 92 ##src/nonblock/strclinonb.c##}## 93 ##src/nonblock/strclinonb.c##/* end nonb3 */

⌨️ 快捷键说明

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