⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dgcli_mul.c

📁 Linux 下面多播程序发送接受例子程序
💻 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 + -