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

📄 tcpservselect01.c

📁 unix网络编程第一卷socket编程书上的全部源代码
💻 C
字号:
/* include fig01 */#include	"unp.h"intmain(int argc, char **argv){	int					i, maxi, maxfd, listenfd, connfd, sockfd;	int					nready, client[FD_SETSIZE];	ssize_t				n;	fd_set				rset, allset;	char				buf[MAXLINE];	socklen_t			clilen;	struct sockaddr_in	cliaddr, servaddr;	listenfd = Socket(AF_INET, SOCK_STREAM, 0);	bzero(&servaddr, sizeof(servaddr));	servaddr.sin_family      = AF_INET;	servaddr.sin_addr.s_addr = htonl(INADDR_ANY);	servaddr.sin_port        = htons(SERV_PORT);	Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));	Listen(listenfd, LISTENQ);	maxfd = listenfd;			/* initialize */	maxi = -1;					/* index into client[] array */	for (i = 0; i < FD_SETSIZE; i++)		client[i] = -1;			/* -1 indicates available entry */	FD_ZERO(&allset);	FD_SET(listenfd, &allset);/* end fig01 *//* include fig02 */	for ( ; ; ) {		rset = allset;		/* structure assignment */		nready = Select(maxfd+1, &rset, NULL, NULL, NULL);		if (FD_ISSET(listenfd, &rset)) {	/* new client connection */			clilen = sizeof(cliaddr);			connfd = Accept(listenfd, (SA *) &cliaddr, &clilen);#ifdef	NOTDEF			printf("new client: %s, port %d\n",					Inet_ntop(AF_INET, &cliaddr.sin_addr, 4, NULL),					ntohs(cliaddr.sin_port));#endif			for (i = 0; i < FD_SETSIZE; i++)				if (client[i] < 0) {					client[i] = connfd;	/* save descriptor */					break;				}			if (i == FD_SETSIZE)				err_quit("too many clients");			FD_SET(connfd, &allset);	/* add new descriptor to set */			if (connfd > maxfd)				maxfd = connfd;			/* for select */			if (i > maxi)				maxi = i;				/* max index in client[] array */			if (--nready <= 0)				continue;				/* no more readable descriptors */		}		for (i = 0; i <= maxi; i++) {	/* check all clients for data */			if ( (sockfd = client[i]) < 0)				continue;			if (FD_ISSET(sockfd, &rset)) {				if ( (n = Read(sockfd, buf, MAXLINE)) == 0) {						/*4connection closed by client */					Close(sockfd);					FD_CLR(sockfd, &allset);					client[i] = -1;				} else					Writen(sockfd, buf, n);				if (--nready <= 0)					break;				/* no more readable descriptors */			}		}	}}/* end fig02 */

⌨️ 快捷键说明

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