向255.255.255.255发送UDP广播包时出错!

dxyaopengfei 2009-02-12 11:03:00
以下这个程序向受限广播地址255.255.255.255发广播信息出错:Network is unreachable
是什么原因啊?该怎么解决呢,我都弄了好久啊。。。


#include<stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define SERVPORT 3333
#define MAXDATASIZE 100
int main(void)
{
int sockfd, recvbytes;
int ret;
char buf[MAXDATASIZE];
struct sockaddr_in serv_addr;
int addrlen;
int ret1,ret2;
const int on = 1;
// char ToIP[] = "255.255.255.255";
// char ToIP[] = "192.168.0.230";
// char ToIP[] = "192.168.0.255";

printf("version:broadcast,255.255.255.255\n");

memset(buf,0,MAXDATASIZE);
strcpy(buf,"This is Yaopengfei\n");
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1){
perror("socket�");
exit(1);
}
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(SERVPORT);

//以下这部分是给目的IP地址赋值
// ret1 = inet_aton(ToIP,&serv_addr.sin_addr);
// printf("ret1 is: %d\n",ret1);

serv_addr.sin_addr.s_addr = htonl(INADDR_BROADCAST);
//serv_addr.sin_addr.s_addr = INADDR_BROADCAST;
bzero(&(serv_addr.sin_zero),8);

ret2 = setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&on,sizeof(on));
printf("ret2 is:%d\n",ret2);

ret = sendto(sockfd,buf,19,0,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr ) );
if( ret<=0 )
{
perror("sendto error\n");
}
printf("ret is %d\n",ret);

ret = recvfrom(sockfd,buf,MAXDATASIZE,0,(struct sockaddr *)&serv_addr,&addrlen );
printf("ret for recv is:%d\n",ret);
if( ret<=0 )
{
printf("receive error\n");
}

buf[ret] = '\0';
printf("Received: %s",buf);
close(sockfd);
return 0;
}


运行到sendto时,就提示错误了:Network is unreachable
但是,当我向192.168.0.255发送广播时,就完全OK哦,都可以收到我的server返回的信息呢。。

请问一下各位大虾,这是怎么回事呢?我的系统是linux 2.6(在我的开发板linux2.4.18上面跑也是一样的错误提示哦),IP地址配置为192.168.0.X

谢谢各位了!
...全文
1941 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ymj00011 2011-03-22
  • 打赏
  • 举报
回复 1
[root@server ~]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
169.254.0.0 * 255.255.0.0 U 0 0 0 eth0
22.0.0.0 * 255.0.0.0 U 0 0 0 eth0


[root@server ~]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
255.255.255.255 * 255.255.255.255 UH 0 0 0 eth0
169.254.0.0 * 255.255.0.0 U 0 0 0 eth0
22.0.0.0 * 255.0.0.0 U 0 0 0 eth0
看到上面两个的区别没有?


并且在程序里加上
const int on = 1;
setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&on,sizeof(on));
设置允许广播.
rolim 2010-11-04
  • 打赏
  • 举报
回复
楼主配置好网关了否
cnliving 2010-09-01
  • 打赏
  • 举报
回复
linux 不能发"255.255.255.255"的广播包, windows 能发"255.255.255.255"的广播包
dxyaopengfei 2009-02-12
  • 打赏
  • 举报
回复
我的嵌入式设备是要卖给用户的,然后我们想做一个PC软件提供给用户,这个软件可以在任何时候修改嵌入式设备的IP地址(我的意思是说不管其IP地址被改成什么样子),这样的话,我的软件并不知道某个时候嵌入式设备的IP啦,也就不知道它的网段啦。。。
xingkongmori 2009-02-12
  • 打赏
  • 举报
回复
想跟哪个网段通信就广播那个网段的广播地址就好了
dxyaopengfei 2009-02-12
  • 打赏
  • 举报
回复
不是啊,我看资料中说的很明白:路由器默认不转发发往255.255.255.255的数据包,因此这种包只会出现在本地局域网中。我写这个程序的目的也就是想实现局域网内的广播啊。

因为我是想实现这样的功能:我的PC机想对我的嵌入式设备(其IP地址不和我主机一个网段)进行通信,所以这个时候就不能用子网广播地址192.168.0.255啦。。。
gogoDNA 2009-02-12
  • 打赏
  • 举报
回复


兄弟,你这样发包是想发给谁?全世界的人?
怎么可能让你发出去,肯定会unreachable的啊!!!
gogoDNA 2009-02-12
  • 打赏
  • 举报
回复


可以搞个脚本获取当前网段么?

23,217

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧