📄 read_loop.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 + -