广播
只有用户数据报(使用UDP协议)套接字才能广播
一般被设计成局域网搜索协议
广播地址
以192.168.1.0 (255.255.255.0) 网段为例,最大的主机地址192.168.1.255代表该网段的广播地址
发到该地址的数据包被所有的主机接收
广播发送流程
1.创建用户数据报套接字
2.缺省创建的套接字不允许广播数据包,需要设置属性(setsockopt)
int on = 1;
setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));
1.接收方地址指定为广播地址
2.指定端口信息
3.发送数据包
send.c
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
int sockfd=socket(AF_INET,SOCK_DGRAM,0);
if(sockfd < 0)
{
perror("socket err.");
return -1;
}
//设置发送广播属性
int optval=1;
setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&optval,sizeof(optval));
//填充端口和广播ip
struct sockaddr_in raddr;
raddr.sin_family=AF_INET;
raddr.sin_port=htons(atoi(argv[2]));
raddr.sin_addr.s_addr=inet_addr(argv[1]);
char buf[128];
while(1)
{
fgets(buf,sizeof(buf),stdin);
sendto(sockfd,buf,sizeof(buf),0,\
(struct sockaddr *)&raddr,sizeof(raddr));
}
close(sockfd);
return 0;
}
广播接收 流程
1.创建用户数据报套接字
2.绑定IP地址(广播IP或0.0.0.0)和端口
3.绑定的端口必须和发送方指定的端口相同
4.等待接收数据
recv.c
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
int sockfd=socket(AF_INET,SOCK_DGRAM,0);
if(sockfd < 0)
{
perror("socket err.");
return -1;
}
//填充端口和广播ip
struct sockaddr_in raddr,saddr;
raddr.sin_family=AF_INET;
raddr.sin_port=htons(atoi(argv[1]));
raddr.sin_addr.s_addr=inet_addr("0.0.0.0");
socklen_t len=sizeof(saddr);
if(bind(sockfd,(struct sockaddr *)&raddr,sizeof(raddr))< 0)
{
perror("bind err.");
return -1;
}
char buf[128];
while(1)
{
int recvbyte=recvfrom(sockfd,buf,sizeof(buf),0,\
(struct sockaddr *)&saddr,&len);
if(recvbyte < 0)
{
perror("recvfrom err.");
return -1;
}
printf("%s %d buf:%s\n",inet_ntoa(saddr.sin_addr),\
ntohs(saddr.sin_port),buf);
}
close(sockfd);
return 0;
}