dgclibcast1.c 909 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  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. char sendline[MAXLINE], recvline[MAXLINE + 1];
  8. socklen_t len;
  9. struct sockaddr *preply_addr;
  10. preply_addr = Malloc(servlen);
  11. Signal(SIGALRM, recvfrom_alarm);
  12. while (Fgets(sendline, MAXLINE, fp) != NULL) {
  13. Sendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);
  14. alarm(5);
  15. for ( ; ; ) {
  16. len = servlen;
  17. n = recvfrom(sockfd, recvline, MAXLINE, 0, preply_addr, &len);
  18. if (n == -1) {
  19. if (errno == EINTR)
  20. break; /* waited long enough for replies */
  21. else
  22. err_sys("recvfrom error");
  23. } else {
  24. recvline[n] = 0; /* null terminate */
  25. printf("from %s: %s",
  26. Sock_ntop_host(preply_addr, servlen), recvline);
  27. }
  28. }
  29. }
  30. }
  31. static void
  32. recvfrom_alarm(int signo)
  33. {
  34. return; /* just interrupt the recvfrom() */
  35. }