xti_accept.c

来自「《unix网络编程第二卷》中的源代码」· C语言 代码 · 共 105 行

C
105
字号
/* include xti_accept1 */#include	"unpxti.h"static int		ncli = -1, ndisconn;static struct cli {  int			connfd;	/* connected fd or -1 if disconnected */  int			count;  struct t_call	*tcallp;/* ptr to t_alloc'ed structure */} *cli;					/* cli[0], cli[1], ..., cli[ncli-1] are in use */intxti_accept(int listenfd, struct netbuf *cliaddr, int rdwr){	int				i, event;	u_int			n;	char			*ptr;	struct t_discon	tdiscon;	if (ncli == -1) {		/* initialize first time through */		if (cli != NULL)			err_quit("already initialized");		if ( (ptr = getenv("LISTENQ")) != NULL)			n = atoi(ptr);		else			n = LISTENQ;		cli = Calloc(n, sizeof(struct cli));		for (i = 0; i < n; i++)			cli[i].tcallp = T_alloc(listenfd, T_CALL, T_ALL);		ncli = 0;	}/* end xti_accept1 *//* include xti_accept2 */	for ( ; ; ) {		if (ncli == 0) {	/* need to wait for a connection */			T_listen(listenfd, cli[ncli].tcallp);	/* block here */					/* 4following assumes caller called tcp_listen() */			cli[ncli].connfd = T_open(xti_serv_dev, O_RDWR, NULL);			T_bind(cli[ncli].connfd, NULL, NULL);			cli[ncli].count++;			ncli++;		}			if (t_accept(listenfd, cli[ncli-1].connfd,					 cli[ncli-1].tcallp) == 0) {			ncli--;			/* success */			if (rdwr)				Xti_rdwr(cli[ncli].connfd);					if (cliaddr) {		/* return client's protocol address */				n = min(cliaddr->maxlen, cli[ncli].tcallp->addr.len);				memcpy(cliaddr->buf, cli[ncli].tcallp->addr.buf, n);				cliaddr->len = n;			}			return(cli[ncli].connfd);				} else if (t_errno == TLOOK) {			if ( (event = T_look(listenfd)) == T_LISTEN) {				T_listen(listenfd, cli[ncli].tcallp);	/* won't block */				cli[ncli].connfd = T_open(xti_serv_dev, O_RDWR, NULL);				T_bind(cli[ncli].connfd, NULL, NULL);				cli[ncli].count++;				ncli++;				} else if (event == T_DISCONNECT) {				T_rcvdis(listenfd, &tdiscon);				for (i = 0; i < ncli; i++) {					if (cli[i].tcallp->sequence == tdiscon.sequence) {						T_close(cli[i].connfd);#ifdef	NOTDEF						printf("disconnect received from %s\n",								Xti_ntop(&cli[i].tcallp->addr));#endif						ndisconn++;						ncli--;						if ( (n = ncli - i) > 0)							memmove(&cli[i], &cli[i+1],									n*sizeof(struct cli));						break;					}				}			} else				err_quit("unexpected t_look event %d", event);		} else			err_xti("unexpected t_accept error");	}}/* end xti_accept2 */voidxti_accept_dump(void){	int		i, total;	for (i = total = 0; ; i++) {		if (cli[i].count == 0)			break;		printf("%2d %5d\n", i, cli[i].count);		total += cli[i].count;	}	printf("#disconnects = %d\n", ndisconn);	printf("total = %d\n", total);}

⌨️ 快捷键说明

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