📄 dgcli_mul.c
字号:
/* * datagram multicast client for daytime service * receive all reply * use SIGALRM to interrup recvfrom * has race condiction problem */#include "stdio.h"#include "errno.h"#include "signal.h"#include "netinet/in.h"#include "netdb.h"#include "sys/socket.h"#define DAYTIME 1113 /* port of UDP echo server */#define MAXLINE 120void dg_cli(FILE *fp,int sockfd,struct sockaddr_in *pser_addr ,int sock_len) ;void recv_timeout(int sig_num);int main(int argc, char *argv[]){ int sockfd; short i; struct sockaddr_in ser_addr; /* connector's address information */ struct in_addr host; if (argc != 2) { fprintf(stderr,"usage: client multicastip\n"); exit(1); } if (inet_aton(argv[1],&host)<0) { /* get the host info */ perror("inet_ntoa"); exit(1); } if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { /* Udp */ perror("socket"); exit(1); } ser_addr.sin_family = AF_INET; /* host byte order */ ser_addr.sin_port = htons(DAYTIME); /* short, network byte order */ ser_addr.sin_addr = host; bzero(&(ser_addr.sin_zero), 8); /* zero the rest of the struct */ printf("send to %s \n",inet_ntoa(ser_addr.sin_addr)); dg_cli(stdin,sockfd,&ser_addr,sizeof(ser_addr)); close(sockfd); exit(0);}void dg_cli(FILE *fp,int sockfd,struct sockaddr_in *pser_addr ,int socklen) { char sendline[MAXLINE], recvline[MAXLINE]; int n ; int len_sock; struct sigaction sig_alrm,save_act; struct sockaddr_in *preply_addr=(struct sockaddr_in*)malloc(socklen); len_sock=socklen; sig_alrm.sa_handler=recv_timeout; sigemptyset(&sig_alrm.sa_mask); sig_alrm.sa_flags=0; sig_alrm.sa_flags&=~SA_RESTART; sigaction(SIGALRM,&sig_alrm,&save_act); /* set SIGALRM hander */ while(fgets(sendline,MAXLINE,fp)!=NULL){ if(sendto(sockfd,sendto,strlen(sendline),0, (struct sockaddr*)pser_addr,socklen)<0){ perror("sendto"); return ; } alarm(3); /* time out for receive all datagram */ for(;;){ n=recvfrom(sockfd,recvline,MAXLINE, MSG_WAITALL, (struct sockaddr*)preply_addr,&socklen); if(n<0) { if(errno==EINTR) break; perror("read"); return ; } else if(n>0) { recvline[n]='\0'; printf("%s recv from %s \n",recvline, inet_ntoa(preply_addr->sin_addr)); } } /*end of for */ }/**/ sigaction(SIGALRM,&save_act,NULL); free(preply_addr);}void recv_timeout(int sig_num){ return ; /* just generate EINTR */}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -