dgclibcast4.c 1.3 KB

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