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

📄 read_loop.c

📁 关于linux 网络编程的一些代码 关于linux 网络编程的一些代码
💻 C
字号:
/* include loop1 */#include	"sntp.h"/* *INDENT-OFF* */static int		 check_loop(struct sockaddr *, socklen_t);static int		 check_dup(socklen_t);static char		 buf1[MAXLINE], buf2[MAXLINE];static char		*buf[2] = { buf1, buf2 };struct sockaddr	*from[2];static size_t	 nread[2] = { -1, -1 };static int		 currb = 0, lastb = 1;/* *INDENT-ON* */voidread_loop(void){	int				nsel, maxfd;	Addrs			*aptr;	fd_set			rset, allrset;	socklen_t		len;	struct timeval	now;		/* 4allocate two socket address structures */	from[0] = Malloc(addrs[0].addr_salen);	from[1] = Malloc(addrs[0].addr_salen);	maxfd = -1;	for (aptr = &addrs[0]; aptr < &addrs[naddrs]; aptr++) {		FD_SET(aptr->addr_fd, &allrset);		if (aptr->addr_fd > maxfd)			maxfd = aptr->addr_fd;	}/* end loop1 *//* include loop2 */	for ( ; ; ) {		rset = allrset;		nsel = Select(maxfd+1, &rset, NULL, NULL, NULL);		Gettimeofday(&now, NULL);	/* get time when select returns */		for (aptr = &addrs[0]; aptr < &addrs[naddrs]; aptr++) {			if (FD_ISSET(aptr->addr_fd, &rset)) {				len = aptr->addr_salen;				nread[currb] = recvfrom(aptr->addr_fd,										buf[currb], MAXLINE, 0,										from[currb], &len);				if (aptr->addr_flags & ADDR_MCAST) {					printf("%d bytes from %s", nread[currb],							Sock_ntop(from[currb], aptr->addr_salen));					printf(" multicast to %s", aptr->addr_ifname);				} else if (aptr->addr_flags & ADDR_BCAST) {					printf("%d bytes from %s", nread[currb],							Sock_ntop(from[currb], aptr->addr_salen));					printf(" broadcast to %s",							Sock_ntop(aptr->addr_sa, aptr->addr_salen));				} else {					printf("%d bytes from %s", nread[currb],							Sock_ntop(from[currb], aptr->addr_salen));					printf(" to %s",							Sock_ntop(aptr->addr_sa, aptr->addr_salen));				}				if (check_loop(from[currb], aptr->addr_salen)) {					printf(" (ignored)\n");					continue;		/* it's one of ours, looped back */				}				if (check_dup(aptr->addr_salen)) {					printf(" (dup)\n");					continue;		/* it's a duplicate */				}				sntp_proc(buf[lastb], nread[lastb], &now);				if (--nsel <= 0)					break;		/* all done with selectable descriptors */			}		}	}}/* end loop2 *//* include check_loop */intcheck_loop(struct sockaddr *sa, socklen_t salen){	Addrs	*aptr;	for (aptr = &addrs[0]; aptr < &addrs[naddrs]; aptr++) {		if (sock_cmp_addr(sa, aptr->addr_sa, salen) == 0)			return(1);		/* it is one of our addresses */	}	return(0);}/* end check_loop *//* include check_dup */intcheck_dup(socklen_t salen){	int		temp;	if (nread[currb] == nread[lastb] &&		memcmp(from[currb], from[lastb], salen) == 0 &&		memcmp(buf[currb], buf[lastb], nread[currb]) == 0) {			return(1);	/* it is a duplicate */	}	temp = currb;	/* swap currb and lastb */	currb = lastb;	lastb = temp;	return(0);}/* end check_dup */

⌨️ 快捷键说明

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