23,217
社区成员




//cast_a.c
//网络广播UDP程序发送方
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main()
{
int fd;
int opt=1; //广播选项 0和非0两种,关或开
int r;
struct sockaddr_in dr;
//1.socket创建
fd=socket(PF_INET,SOCK_DGRAM,0);
//注意:广播对流无效,只能使用报文UDP
//2.选项设置广播BROADCAST
r=setsockopt(fd,SOL_SOCKET,SO_BROADCAST,
&opt,sizeof(opt));
//客户端代理描述符fd 设置通用层选项 具体选项名为广播
//选项值opt非0表示true, 选项值opt空间大小
//另,返回值0成功,-1失败
//3.构造广播地址结构体
dr.sin_family=AF_INET;
dr.sin_port=htons(9999);
dr.sin_addr.s_addr=inet_addr("192.168.126.255");
//注意:这里地址为广播地址:255
//4.sendto发送数据
//注意:sendto一般用于udp等无连接的数据传输,事先不要bind?
while(1)
{
r=sendto(fd,"Hello",5,0,
(struct sockaddr*)&dr,sizeof(dr));
//向fd发送数据 hello 共5个字节 标记0阻塞就等
//发往地址dr 地址长度dr
sleep(1);
}
close(fd);
return 0;
}
//cast_b.c
//网络广播UDP程序接收方 ===与发送方代码基本一致
//setsockopt设置网络数据选项
//设置SO_REUSEADDR 就可以同时开多个接收方,绑定多次不报错,有兴趣可以取消设置,启动第2个客户端立马出错
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main()
{
int fd;
int opt=1; //广播选项, 0和非0两种,关或开, 在下面负责SO_REUSEADDR是false还是true的开关
char buf[100];
int r;
struct sockaddr_in dr;
//1.socket创建
fd=socket(PF_INET,SOCK_DGRAM,0);
//注意:广播对流无效,只能使用报文UDP
//2.设置setsockopt选项 这里为REUSEADDR
r=setsockopt(fd,SOL_SOCKET,SO_REUSEADDR, //===广播改为重定IP
&opt,sizeof(opt));
//客户端代理描述符fd 设置通用层选项 具体选项名为广播
//选项值opt 选项值opt空间大小
//另,返回值0成功,-1失败
//3.bind绑定广播地址255===这点要注意是255!
dr.sin_family=AF_INET;
dr.sin_port=htons(9999);
dr.sin_addr.s_addr=inet_addr("192.168.126.255");
//注意:这里地址为广播地址:255
//===接收方需要增加bind地址, 注意:bind的地址仍然是255!
r=bind(fd,(struct sockaddr*)&dr,sizeof(dr));
//绑定fd 和地址
//4.recv接收广播数据
while(1)
{
r=recv(fd,buf,100,0);
//接收数据,存入buf 共100个字节 标记0阻塞就等
if(r>0) //当接收数据字节数大于0时,才打印数据
{
buf[r]=0;
printf("广播数据:%s\n",buf);
}
}
close(fd);
return 0;
}