dgclibcast1.c 1008 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. #include "unp.h"
  2. static void recvfrom_alarm(int);
  3. void
  4. dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)
  5. {
  6. int n;
  7. const int on = 1;
  8. char sendline[MAXLINE], recvline[MAXLINE + 1];
  9. socklen_t len;
  10. struct sockaddr *preply_addr;
  11. preply_addr = Malloc(servlen);
  12. Setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));
  13. Signal(SIGALRM, recvfrom_alarm);
  14. while (Fgets(sendline, MAXLINE, fp) != NULL) {
  15. Sendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);
  16. alarm(5);
  17. for ( ; ; ) {
  18. len = servlen;
  19. n = recvfrom(sockfd, recvline, MAXLINE, 0, preply_addr, &len);
  20. if (n < 0) {
  21. if (errno == EINTR)
  22. break; /* waited long enough for replies */
  23. else
  24. err_sys("recvfrom error");
  25. } else {
  26. recvline[n] = 0; /* null terminate */
  27. printf("from %s: %s",
  28. Sock_ntop_host(preply_addr, len), recvline);
  29. }
  30. }
  31. }
  32. free(preply_addr);
  33. }
  34. static void
  35. recvfrom_alarm(int signo)
  36. {
  37. return; /* just interrupt the recvfrom() */
  38. }