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

📄 strclinonb.c

📁 unix网络编程卷1:套接口API的全书源码
💻 C
字号:
/* include nonb1 */#include	"unp.h"voidstr_cli(FILE *fp, int sockfd){	int			maxfdp1, val, stdineof;	ssize_t		n, nwritten;	fd_set		rset, wset;	char		to[MAXLINE], fr[MAXLINE];	char		*toiptr, *tooptr, *friptr, *froptr;	val = Fcntl(sockfd, F_GETFL, 0);	Fcntl(sockfd, F_SETFL, val | O_NONBLOCK);	val = Fcntl(STDIN_FILENO, F_GETFL, 0);	Fcntl(STDIN_FILENO, F_SETFL, val | O_NONBLOCK);	val = Fcntl(STDOUT_FILENO, F_GETFL, 0);	Fcntl(STDOUT_FILENO, F_SETFL, val | O_NONBLOCK);	toiptr = tooptr = to;	/* initialize buffer pointers */	friptr = froptr = fr;	stdineof = 0;	maxfdp1 = max(max(STDIN_FILENO, STDOUT_FILENO), sockfd) + 1;	for ( ; ; ) {		FD_ZERO(&rset);		FD_ZERO(&wset);		if (stdineof == 0 && toiptr < &to[MAXLINE])			FD_SET(STDIN_FILENO, &rset);	/* read from stdin */		if (friptr < &fr[MAXLINE])			FD_SET(sockfd, &rset);			/* read from socket */		if (tooptr != toiptr)			FD_SET(sockfd, &wset);			/* data to write to socket */		if (froptr != friptr)			FD_SET(STDOUT_FILENO, &wset);	/* data to write to stdout */		Select(maxfdp1, &rset, &wset, NULL, NULL);/* end nonb1 *//* include nonb2 */		if (FD_ISSET(STDIN_FILENO, &rset)) {			if ( (n = read(STDIN_FILENO, toiptr, &to[MAXLINE] - toiptr)) < 0) {				if (errno != EWOULDBLOCK)					err_sys("read error on stdin");			} else if (n == 0) {#ifdef	VOL2				fprintf(stderr, "%s: EOF on stdin\n", gf_time());#endif				stdineof = 1;			/* all done with stdin */				if (tooptr == toiptr)					Shutdown(sockfd, SHUT_WR);/* send FIN */			} else {#ifdef	VOL2				fprintf(stderr, "%s: read %d bytes from stdin\n", gf_time(), n);#endif				toiptr += n;			/* # just read */				FD_SET(sockfd, &wset);	/* try and write to socket below */			}		}		if (FD_ISSET(sockfd, &rset)) {			if ( (n = read(sockfd, friptr, &fr[MAXLINE] - friptr)) < 0) {				if (errno != EWOULDBLOCK)					err_sys("read error on socket");			} else if (n == 0) {#ifdef	VOL2				fprintf(stderr, "%s: EOF on socket\n", gf_time());#endif				if (stdineof)					return;		/* normal termination */				else					err_quit("str_cli: server terminated prematurely");			} else {#ifdef	VOL2				fprintf(stderr, "%s: read %d bytes from socket\n",								gf_time(), n);#endif				friptr += n;		/* # just read */				FD_SET(STDOUT_FILENO, &wset);	/* try and write below */			}		}/* end nonb2 *//* include nonb3 */		if (FD_ISSET(STDOUT_FILENO, &wset) && ( (n = friptr - froptr) > 0)) {			if ( (nwritten = write(STDOUT_FILENO, froptr, n)) < 0) {				if (errno != EWOULDBLOCK)					err_sys("write error to stdout");			} else {#ifdef	VOL2				fprintf(stderr, "%s: wrote %d bytes to stdout\n",								gf_time(), nwritten);#endif				froptr += nwritten;		/* # just written */				if (froptr == friptr)					froptr = friptr = fr;	/* back to beginning of buffer */			}		}		if (FD_ISSET(sockfd, &wset) && ( (n = toiptr - tooptr) > 0)) {			if ( (nwritten = write(sockfd, tooptr, n)) < 0) {				if (errno != EWOULDBLOCK)					err_sys("write error to socket");			} else {#ifdef	VOL2				fprintf(stderr, "%s: wrote %d bytes to socket\n",								gf_time(), nwritten);#endif				tooptr += nwritten;	/* # just written */				if (tooptr == toiptr) {					toiptr = tooptr = to;	/* back to beginning of buffer */					if (stdineof)						Shutdown(sockfd, SHUT_WR);	/* send FIN */				}			}		}	}}/* end nonb3 */

⌨️ 快捷键说明

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