dgclibcast3.c 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  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. sigset_t sigset_alrm;
  10. socklen_t len;
  11. struct sockaddr *preply_addr;
  12. preply_addr = Malloc(servlen);
  13. Setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));
  14. Sigemptyset(&sigset_alrm);
  15. Sigaddset(&sigset_alrm, SIGALRM);
  16. Signal(SIGALRM, recvfrom_alarm);
  17. while (Fgets(sendline, MAXLINE, fp) != NULL) {
  18. Sendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);
  19. alarm(5);
  20. for ( ; ; ) {
  21. len = servlen;
  22. Sigprocmask(SIG_UNBLOCK, &sigset_alrm, NULL);
  23. n = recvfrom(sockfd, recvline, MAXLINE, 0, preply_addr, &len);
  24. Sigprocmask(SIG_BLOCK, &sigset_alrm, NULL);
  25. if (n < 0) {
  26. if (errno == EINTR)
  27. break; /* waited long enough for replies */
  28. else
  29. err_sys("recvfrom error");
  30. } else {
  31. recvline[n] = 0; /* null terminate */
  32. printf("from %s: %s",
  33. Sock_ntop_host(preply_addr, len), recvline);
  34. }
  35. }
  36. }
  37. free(preply_addr);
  38. }
  39. static void
  40. recvfrom_alarm(int signo)
  41. {
  42. return; /* just interrupt the recvfrom() */
  43. }