实验九、广播编程(1)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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\n",argv[0]);

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\n",argv[0]);

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);

相关文档
最新文档