str_cli_kqueue04.c

来自「unix网络编程卷1:套接口API的全书源码」· C语言 代码 · 共 53 行

C
53
字号
#include	"unp.h"voidstr_cli(FILE *fp, int sockfd){	int				kq, i, n, nev, stdineof = 0, isfile;	char			buf[MAXLINE];	struct kevent	kev[2];	struct timespec	ts;	struct stat		st;	isfile = ((fstat(fileno(fp), &st) == 0) &&			  (st.st_mode & S_IFMT) == S_IFREG);	EV_SET(&kev[0], fileno(fp), EVFILT_READ, EV_ADD, 0, 0, NULL);	EV_SET(&kev[1], sockfd, EVFILT_READ, EV_ADD, 0, 0, NULL);	kq = Kqueue();	ts.tv_sec = ts.tv_nsec = 0;	Kevent(kq, kev, 2, NULL, 0, &ts);	for ( ; ; ) {		nev = Kevent(kq, NULL, 0, kev, 2, NULL);		for (i = 0; i < nev; i++) {			if (kev[i].ident == sockfd) {	/* socket is readable */				if ( (n = Read(sockfd, buf, MAXLINE)) == 0) {					if (stdineof == 1)						return;		/* normal termination */					else						err_quit("str_cli: server terminated prematurely");				}				Write(fileno(stdout), buf, n);			}			if (kev[i].ident == fileno(fp)) {  /* input is readable */				n = Read(fileno(fp), buf, MAXLINE);				if (n > 0)					Writen(sockfd, buf, n);				if (n == 0 || (isfile && n == kev[i].data)) {					stdineof = 1;					Shutdown(sockfd, SHUT_WR);	/* send FIN */					kev[i].flags = EV_DELETE;					Kevent(kq, &kev[i], 1, NULL, 0, &ts);	/* remove kevent */					continue;				}			}		}	}}

⌨️ 快捷键说明

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