dgclibcast2.c 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  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(1);
  17. for ( ; ; ) {
  18. len = servlen;
  19. n = recvfrom(sockfd, recvline, MAXLINE, 0, preply_addr, &len);
  20. if (n == -1) {
  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. sleep(1);
  28. printf("from %s: %s",
  29. Sock_ntop_host(preply_addr, len), recvline);
  30. }
  31. }
  32. }
  33. free(preply_addr);
  34. }
  35. static void
  36. recvfrom_alarm(int signo)
  37. {
  38. return; /* just interrupt the recvfrom() */
  39. }