实验九、广播编程(1)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验九、广播编程
一、实验目的
1、掌握编写UDP广播服务器程序设计的基本方法;
2、分析广播服务器套接字编程的基本特点;
3、掌握IP广播地址的用法和特点;
4、分析广播服务器与普通的UDP服务器的区别。
二、实验内容
本次实验主要学习如何以广播方式进行套接字编程,广播方式主要指使用UDP套接字发送数据,发送数据所指定的目的地址不同于普通地址而是某网络的广播地址,所谓广播地址是指IP地址中主机地址部分为全1的IP地址,例如在192.168.1.XXX的网络中192.168.1.255即为192.168.1网络段的广播地址。
以下程序是采用广播方式发送数据,接收程序可以是前面实验中任何UDP接收程序,即为普通的UDP程序。
1、以广播方式发送数据的程序
/*
文件名:BSender.c
广播服务器程序。
*/
/*
*/
#include
#include
#include
#include
#define BUFLEN 255
void getcurtime(char *curtime)
{
time_t tm;
time(&tm);
snprintf(curtime,BUFLEN,"%s\n",ctime(&tm));
}
int main(int argc,char **argv)
{
struct sockaddr_in peeraddr;
int sockfd,on=1;
int num,i;
char msg[BUFLEN+1];
if(argc!=3){
printf("usage:%s
exit(0);
}
sockfd=socket(AF_INET,SOCK_DGRAM,0);
if(sockfd<0){
fprintf(stderr,"socket creating error in tserv.c\n");
exit(1);
}
setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&on,sizeof(int));
memset(&peeraddr,0,sizeof(struct sockaddr_in));
peeraddr.sin_family=AF_INET;
if(inet_pton(AF_INET,argv[1],&peeraddr.sin_addr)<=0){
printf("Wrong dest IP address\n");
exit(0);
}
peeraddr.sin_port=htons(atoi(argv[2]));
for(;;){
getcurtime(msg);
int a;
a=sendto(sockfd,msg,strlen(msg),0,(struct sockaddr *)&peeraddr,sizeof(struct sockaddr_in));
printf("%d",a);
fflush(stdout);
sleep(3);
}
}
2、接收广播方式发送的数据的接收程序
/*
文件名:BRecv.c
广播接收端
#include
#include
#include
#include
#define BUFLEN 255
int main(int argc,char** argv)
{
struct sockaddr_in localaddr;
int sockfd,n;
char msg[BUFLEN+1];
if(argc!=2){
printf("usage:%s
exit(0);
}
sockfd=socket(AF_INET,SOCK_DGRAM,0);
if(sockfd<0){
fprintf(stderr,"socket creating error in tcli.c\n");
exit(1);
}
memset(&localaddr,0,sizeof(struct sockaddr_in));
localaddr.sin_port=htons(atoi(argv[1]));
localaddr.sin_addr.s_addr=htonl(INADDR_ANY);
int opt = SO_REUSEADDR;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
if(bind(sockfd,(struct sockaddr *)&localaddr,sizeof(struct sockaddr_in))<0){ fprintf(stderr,"bind error in tcli.c\n");
exit(2);
}
n=read(sockfd,msg,BUFLEN);
if(n==-1)
{
fprintf(stderr,"read error in tcli.c\n");
exit(3);
}
else
{
msg[n]=0;
printf("%s",msg);