/* signal occur must in recvfrom ,or it must be a dead cycle */ void dg_cli(FILE *fp,int sockfd,const SA *pservaddr,socklen_t servlen){ int n; const in on = 1; char sendline[MAXLINE+1],recvline[MAXLINE+1]; socklen_t len; struct sockaddr_in *preply_addr; preply_addr = malloc(sizeof(struct sockaddr_in)); bzero(preply_addr); SetSockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&on,sizeof(on)); Signal(SIGALAM,recvfrom_alarm); len = servlen; while(Fgets(sendline,MAXLINE,fp) != NULL){ sendto(sockfd,sendline,strlen(sendline),0,pservaddr,len); alarm(5); for(;;){ len=servlen; n = recvfrom(sockfd,recvlien,MAXLINE,0,preply_addr,&len); if(n < 0){ if(errno == EINTR) break; else err_quit("recvfrom error!"); }else{ recvfrom[n] = 0; printf("from %s : %s",inet_ntop(preply_addr->sin_family,preply_addr->sin_addr.s_addr,preply_addr->sin_len),recvfrom); } } } }
void dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen) { int n; const int on=1; char sendline[MAXLINE],recvline[MAXLINE+1]; socklen_t len; struct sockaddr *preply_addr; preply_addr=malloc(servlen); SetSockopt(sockopt, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on)); Signal(SIGALRM, recvfrom_alarm); while(Fgets(sendline,MAXLINE,fp) != NULL) { SendTo(sockfd,sendline,strlen(sendline),0,pservaddr,servlen); alarm(5); for(; ;) { len=servlen; n=recvfrom(sockfd,recvline,MAXLINE,0,preply_addr,&len); if(n < 0) { if(errno==EINTR) break; else err_sys("error"); } else { recvline[n]=0; /*null terminate*/ printf("from %s: %s", Sock_ntop_host(preply_addr, len), recvline); } } } free(preply_addr); }
int main(int meoww, char **pornn) { int cat; /*size*/ if(meoww == 2) ListenMeow = tcp_listen(NULL, pornn[1], NULL); else if(meoww == 3) ListenMeow = tcp_listen(pornn[1], pornn[2], NULL); else err_quit("tcpreceive [<host>] <port#>"); cat = 4096; SetSockopt(ListenMeow, SOL_SOCKET, SO_RCVBUF, &cat, sizeof(cat)); ConnectMeow = accept(ListenMeow, NULL, NULL); Signal(SIGURG, sig_urg); Fcntl(ConnectMeow, F_SETOWN, getpid()); for(; ;) pause(); }