查看: 3017|回复: 7

向255.255.255.255发UDP包出错!

[复制链接]
发表于 2009-2-12 10:48:59 | 显示全部楼层 |阅读模式
以下这个程序向受限广播地址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&#65533;");
                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

谢谢各位了!
回复

使用道具 举报

发表于 2009-2-12 11:33:30 | 显示全部楼层
首先看看数据包构造对不,然后看看网卡有255.255.255.255的路由吗。
另外要是把地址设成DHCP获取,获取成功的话,那就说明路由没问题,
剩下的就是你程序的问题了。

[ 本帖最后由 Se7en 于 2009-2-12 11:49 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2009-2-12 13:03:00 | 显示全部楼层
谢谢楼上的兄弟!
在我自己的局域网中发送目的地址为255.255.255.255的数据包,也需要网卡有255.255.255.255的路由吗?
还有,如果我的网卡没有这个路由的话呢,那该怎么添加呢?

呵呵,我的局域网内没有DHCP server啦,所以没有办法测试是不是能够自动获取到IP地址啦。。。。

我看过一下DHCP的协议哦,它其实也是发送目的地址为255.255.255.255的UDP包哦。。为什么我的程序就出错呢?
回复

使用道具 举报

发表于 2009-2-12 13:18:21 | 显示全部楼层
linux添加路由好像是route add -net 255.255.255.255 255.255.255.255 eth0 metric 1试试,我没做过这种路由,你的程序我看不懂,其他的我帮不了你了。
回复

使用道具 举报

 楼主| 发表于 2009-2-12 15:50:13 | 显示全部楼层
谢谢楼上的大哥啊,真的就是你说的这个问题啊。。
我添加了到255.255.255.255的路由就可以发送成功啊,添加的 命令是:
route add -net 255.255.255.255 netmask 255.255.255.255 dev eth0 metric 1
或者
route add -host 255.255.255.255 dev eth0

这样就OK了!
真的很感谢兄弟你啊,我弄了几天了。。。。

回复

使用道具 举报

发表于 2009-2-12 16:25:04 | 显示全部楼层
这样的配置路由重启会丢失,好像得写到一个配置文件中去。
回复

使用道具 举报

 楼主| 发表于 2009-2-12 17:07:49 | 显示全部楼层
是啊,重启会丢失,只能是写到启动的脚本中去了。。。。
不过看到网上说route命令有-p选项可以使路由固化,不过我的这个发行版本中的route很老啊,还没这个选项啊,呵呵~~
回复

使用道具 举报

发表于 2009-4-24 11:21:35 | 显示全部楼层
这个问题我也遇到了,头痛了两天,后来看了你的帖子,受到了启发,问题解决。现在跟大家分享一下:

我的ip是192.168.0.X, 路由IP是192.168.0.254,子网掩码255.255.255.0,广播发送的地址为255.255.255.255

在没有设置网关的情况下,sendto函数返回-1,perror显示network is unreachable.

用wireshark检测,发现本机根本就没有数据包发出。

设置网关后发送正常,即使设置了错误的网关(route add default gw 192.168.0.1)。

后面把广播地址改为192.168.0.255,发现即使没有网关,发送接收广播都是正常的。


我的理解:

Linux可能认为192.168.0.255和自己是一个网段,故没有网关的情况下也允许数据传递到下一层处理,
所以能够生成报文,发送出去。

而255.255.255.255,Linux也认为他是一个普通IP,且跟自己不是一个网段,而没有网关的情况下,
直接报错处理。故无法生成报文,当然不能发送。我设置了一个错误的网关,192.168.0.1(我实际
网关是192.168.0.254),把操作系统欺骗过去,就一切正常了。

我认为这是Linux的一个小BUG,请大家指正!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | CSNA会员注册

本版积分规则

快速回复 返回顶部 返回列表