linux下,a程序广播数据给b,b为什么接不到数据?

zhouyunj 2013-02-21 10:48:50

//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;
}


=============================
linux下,a程序广播数据给b,b为什么接不到数据?
...全文
154 3 点赞 打赏 收藏 举报
写回复
3 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
czy455475537 2013-10-07
我也是的recvfrom不能解决,奇怪的是以前编译后recv能够接收到数据,不知道楼主有没有解决
  • 打赏
  • 举报
回复
langeldep 2013-02-26
用recvfrom 试试
  • 打赏
  • 举报
回复
jxhqb 2013-02-22
你是采用UDP发的包,为什么收包的时候采用TCP的recv格式,而不是recvfrom
  • 打赏
  • 举报
回复
相关推荐
发帖
Linux/Unix社区
加入

2.1w+

社区成员

Linux/Unix社区 应用程序开发区
申请成为版主
帖子事件
创建了帖子
2013-02-21 10:48
社区公告
暂无公告