dgclitimeo3.c 699 B

123456789101112131415161718192021222324252627282930313233343536
  1. #include "unp.h"
  2. static void sig_alrm(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. Signal(SIGALRM, sig_alrm);
  9. while (Fgets(sendline, MAXLINE, fp) != NULL) {
  10. Sendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);
  11. alarm(5);
  12. if ( (n = recvfrom(sockfd, recvline, MAXLINE, 0, NULL, NULL)) < 0) {
  13. if (errno == EINTR)
  14. fprintf(stderr, "socket timeout\n");
  15. else
  16. err_sys("recvfrom error");
  17. } else {
  18. alarm(0);
  19. recvline[n] = 0; /* null terminate */
  20. Fputs(recvline, stdout);
  21. }
  22. }
  23. }
  24. static void
  25. sig_alrm(int signo)
  26. {
  27. return; /* just interrupt the recvfrom() */
  28. }