UDP实现广播传输

在生活中 ,广播无处不在 ,如大街上上叫卖的商人,但是在网络中广播是什么样子的呢?
网络上的广播指:由一台主机向该主机所在子网内(同一个局域网)的所有主机发送数据的方式。如下图的 1 号主机广播给 2、3、4、5 号主机发送数据:在这里插入图片描述

实现广播,离不开广播地址,同一个子网(局域网)的所有主机网卡都会接收所在网段广播地址的数据包。广播地址应用于局域网内的所有主机。

广播地址(Broadcast Address)是专门用于同时向网络中(通常指同一子网)所有工作站进行发送的一个地址。
广播只能用UDP或者原始IP实现,不能用tcp
下面我们写一个 UDP 广播发送数据包例子,目的端口指定为 808在这里插入代码片0,目的 IP 为受限广播地址:255.255.255.255,那样,同一个局域网的所有主机网卡都会收到这个数据,但是,只有端口为 8080 的网络应用程序才会收到这个数据包:

#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
int main(int argc,char *argv[] ){
unsigned short  port =8080;//端口
char *server_ip="255.255.255.255";//受限广播地址'
int sockfd ;
sockfd=socket(AF_INET,SOCK_DGRAM,0);//创建UDP套接字
if(sockfd<0){
perror("socket");
exit(-1);
}
struct sockaddr_in dest_addr;
bzero(&dest_addr,sizeof(dest_addr));
dest_addr.sin_family=AF_INET;
dest_addr.sin_port=htons(port);
printf("send data to UDP server%s :%d!\n",server_ip,port);
//设置套接字为广播类型 这个很重要
int opt=1;
setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&opt,sizeof(opt));
char send_buf[512]="this is a broadcast data";
sendto(sockfd,send_buf,strlen(send_buf),0,(struct sockaddr*)&dest_addr,sizeof(dest_addr));//发送数据
close(sockfd);
return 0;
}
注意:opt的值应该这样填,定义一个赋值为 1 的整型变量,int opt=1, 然后把这个变量的地址放这个位置,如:&opt
接下来写一个服务器段用于接收:

在这#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(int argc, char *argv[])
{
int server_sockfd;
int len;
struct sockaddr_in my_addr; //服务器网络地址结构体
struct sockaddr_in remote_addr; //客户端网络地址结构体
int sin_size;
char buf[BUFSIZ]; //数据传送的缓冲区
memset(&my_addr,0,sizeof(my_addr)); //数据初始化–清零
my_addr.sin_family=AF_INET; //设置为IP通信
my_addr.sin_addr.s_addr=INADDR_ANY;//服务器IP地址–允许连接到所有本地地址上
my_addr.sin_port=htons(8000); //服务器端口号

/*创建服务器端套接字--IPv4协议,面向无连接通信,UDP协议*/
if((server_sockfd=socket(PF_INET,SOCK_DGRAM,0))<0)
{  
	perror("socket error");
	return 1;
}

/*将套接字绑定到服务器的网络地址上*/
if (bind(server_sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))<0)
{
	perror("bind error");
	return 1;
}
sin_size=sizeof(struct sockaddr_in);
printf("waiting for a packet...\n");

/*接收客户端的数据并将其发送给客户端--recvfrom是无连接的*/
if((len=recvfrom(server_sockfd,buf,BUFSIZ,0,(struct sockaddr *)&remote_addr,&sin_size))<0)
{
	perror("recvfrom error"); 
	return 1;
}
printf("received packet from %s:\n",inet_ntoa(remote_addr.sin_addr));
buf[len]='\0';
printf("contents: %s\n",buf);

/*关闭套接字*/
close(server_sockfd);

    return 0;

}
下面加入运行结果:
客户端:
IPcom@ubuntu:~/网络编程/广播$ ./app1
send data to UDP server255.255.255.255 :8080!
IPcom@ubuntu:~/网络编程/广播$
服务器端:
IPcom@ubuntu:~/网络编程/广播$ ./app
waiting for a packet…
received packet from 127.0.0.1:
contents: this is a broadcast data
IPcom@ubuntu:~/网络编程/广播$

亲测可用
原文UDP广播


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值