1 #include "unp.h"
2 #include <setjmp.h>
3
4 static void recvfrom_alarm(int);
5 static sigjmp_buf jmpbuf;
6
7 void
dg_cli(FILE * fp,int sockfd,const SA * pservaddr,socklen_t servlen)8 dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)
9 {
10 int n;
11 char sendline[MAXLINE], recvline[MAXLINE + 1];
12 socklen_t len;
13 struct sockaddr *preply_addr;
14
15 preply_addr = Malloc(servlen);
16
17 Signal(SIGALRM, recvfrom_alarm);
18
19 while (Fgets(sendline, MAXLINE, fp) != NULL) {
20
21 Sendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);
22
23 alarm(5);
24 for ( ; ; ) {
25 if (sigsetjmp(jmpbuf, 1) != 0)
26 break;
27 len = servlen;
28 n = Recvfrom(sockfd, recvline, MAXLINE, 0, preply_addr, &len);
29 recvline[n] = 0; /* null terminate */
30 printf("from %s: %s",
31 Sock_ntop_host(preply_addr, servlen), recvline);
32 }
33 }
34 }
35
36 static void
recvfrom_alarm(int signo)37 recvfrom_alarm(int signo)
38 {
39 siglongjmp(jmpbuf, 1);
40 }
41