广播

来源:互联网 发布:易语言自动关注源码 编辑:程序博客网 时间:2024/05/18 02:58
广播就是实现一对多的通讯,它通过广播地址发送数据报文实现的,注意:广播只可以用于UDP中。可以用于同一网段不通计算机的聊天室中。
//UDP才可以使用广播/*******************************************************///接受者就是一个服务器端,绑定一个广播地址,开始监听,接收文件.receiver.c#include#include#include#include#include#includeint sockfd;void sig_handler(int signo){if(signo == SIGINT){printf("receiver will exited\n");close(sockfd);exit(1);}}int main(int argc,char **argv){if(argc < 2){fprintf(stderr,"usage: %s port\n",argv[0]);exit(1);}sockfd = socket(AF_INET,SOCK_DGRAM,0);if(sockfd < 0){perror("socket error");exit(1);}struct sockaddr_in serveraddr;memset(&serveraddr,0,sizeof(serveraddr));serveraddr.sin_family = AF_INET;serveraddr.sin_port = htons(atoi(argv[1]));/*atoi字符类型转换为整形*/serveraddr.sin_addr.s_addr = INADDR_ANY;//bindif(bind(sockfd,(struct sockaddr*)&serveraddr,sizeof(serveraddr)) < 0){perror("bind error");exit(1);}//char buffer[1024];struct sockaddr_in clientaddr;socklen_t len = sizeof(clientaddr);while(1){memset(&buffer,0,sizeof(buffer));memset(&clientaddr,0,sizeof(clientaddr));if(recvfrom(sockfd, buffer, sizeof(buffer),0,(struct sockaddr*)&clientaddr,&len) < 0){perror("recvfrom error");exit(1);}else{char ip[16];inet_ntop(AF_INET,&clientaddr.sin_addr.s_addr,ip,sizeof(ip));int port = ntohs(clientaddr.sin_port);printf("%s (%d) : %s\n",ip,port,buffer);}}return 0;}/********************************************************************************///广播发送者程序broadcast.c#include#include#include#include#includeint main(int argc,char **argv){if(argc < 3){fprintf(stderr,"Usage: %s  ip  port \n",argv[0]);exit(1);}int sockfd ;sockfd = socket(AF_INET,SOCK_DGRAM,0);if(sockfd < 0){perror("socket error");exit(1);}//设置套接字选项,采用广播方式发送int opt = 1;setsocket(sockfd,SOL_SOCKET,SO_BROADCAST,&opt,sizeof(opt));//设置广播地址struct sockaddr_in serveraddr;memset(&serveraddr,0,sizeof(serveraddr));serveraddr.sin_family = AF_INET;serveraddr.sin_port = htons(atoi(argv[2]));//点分十进制转换成二进制inet_pton(AF_INET,argv[1],&serveraddr.sin_addr.s_addr);printf("I will broadcast ..........");char *info = "Today  is  a  lucky  day!";size_t size = strlen(info) *sizeof(char);if(sendto(sockfd,info,size,0,(struct sockaddr *)&serveraddr,sizeof(serveraddr)) < 0){perror("sendto  error");exit(1);}else{printf("broadcast success\n");}close(sockfd);return 0;}