7156|8

72

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

vxworks下跨网段无法ping通??? [复制链接]

 老弟最近在开发过程遇到一个问题,就是开发出的vxworks程序
1、跨网段无法ping通,报文也过不去。
现象与现状:
   同网段可以ping通,报文也可以过去。
   目前的所跨的两个采用B类地址,从第二位开始有区别区分子网。分别是168.4.0.*和168.1.0.*,掩码已设置成255.255.0.0,本地网关已经设置成168.4.254.254
   是不是网关或者子网掩码哪里设置不合适。

源码粘贴如下,请高手指教,分数不是问题,因为事情紧急,请大家多多捧场!

ipAttach(0, fei);
ifMaskSet(fei0, nC2Mask);
ifAddrSet(fei0, cC2LocalAddr); /*cC2LocalAddr为本机地址,nC2Mask为掩码地址 */

int udpMCSocketCreate(char* cLocalName, char* cMultiCastAddr, int nPort)/*cLocalName为本机地址,cMultiCastAddr为组播地址,nPort为端口号*/
{
        int nSocketID = -1;
        struct sockaddr_in socketLocalAddr;
        int nSockAddrSize = sizeof(struct sockaddr_in);

        struct ip_mreq ipMreq;

        int nOval = 0;
       
        /* Create client's socket */
        if((nSocketID = socket(AF_INET, SOCK_DGRAM, 0)) == ERROR)
        {
                perror("socket initial error\n");
                return -1;
        }

        /* build local socket address */
        bzero((char*)&socketLocalAddr, nSockAddrSize);
        socketLocalAddr.sin_len = nSockAddrSize;
        socketLocalAddr.sin_family = AF_INET;
        socketLocalAddr.sin_port = htons(nPort);        /*htons(INADDR_ANY);*/

        if(((socketLocalAddr.sin_addr.s_addr = inet_addr(cLocalName)) == ERROR) &&
                ((socketLocalAddr.sin_addr.s_addr = hostGetByName(cLocalName)) == ERROR))
        {
                perror("unknown local name\n");
                udpSocketClose(nSocketID);
                return -1;
        }

        /* bind to special socket address and port*/
        if(bind(nSocketID, (struct sockaddr*)&socketLocalAddr, nSockAddrSize) == ERROR)
        {
                perror("socket bind error!\n");
                udpSocketClose(nSocketID);
                return -1;
        }

        nOval = 1;
        if(setsockopt(nSocketID, SOL_SOCKET, SO_REUSEADDR, (char*)&nOval, sizeof(nOval)) == ERROR)
        {
                perror("set the socket reuseable error!\n");
                udpSocketClose(nSocketID);
                return -1;
        }

   
        /* fill in the argument structure to join the multicast group */
    /* initialize the multicast address to join */
    ipMreq.imr_multiaddr.s_addr = inet_addr (cMultiCastAddr);

    /* unicast interface addr from which to receive the multicast packets */
    ipMreq.imr_interface.s_addr = inet_addr (cLocalName);
      
    /* set the socket option to join the MULTICAST group */
    if (setsockopt (nSocketID, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&ipMreq, sizeof (ipMreq)) == ERROR)
    {
            perror ("setsockopt IP_ADD_MEMBERSHIP error!\n");
            return -1;
    }

        nOval = 15;
        if(setsockopt(nSocketID, IPPROTO_IP, IP_MULTICAST_TTL, (char *)&nOval, sizeof(nOval)) == ERROR)
        {
                perror("set the socket multicast TTL error!\n");
                udpSocketClose(nSocketID);
                return -1;
        }

        mRouteAdd(cGroupAddr, cRouteAddr, 0xFFFF0000, 0, 0 ); /*cGroupAddr为组播地址,cRouteAddr为网关地址 */

        nReturnValue = mRouteAdd (cC2LocalAddr, cRouteAddr, 0xFFFF0000, 0, 0 ); /*cC2LocalAddr为本机地址,cRouteAddr为网关地址 */
        printf("add route is = %d\n",nReturnValue);

   
        return nSocketID;
}

最新回复

选用组播需要在前面加网关; mRouteAdd(cGroupAddr, cRouteAddr, 0xFFFF0000, 0, 0 ); /*cGroupAddr为组播地址,cRouteAddr为网关地址 */ nReturnValue = mRouteAdd (cC2LocalAddr, cRouteAddr, 0xFFFF0000, 0, 0 ); /*cC2LocalAddr为本机地址,cRouteAddr为网关地址 */ printf("add route is = %d\n",nReturnValue); 把这几句放在程序前面执行看看。  详情 回复 发表于 2009-9-20 23:06
点赞 关注
 

回复
举报

74

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
网关(路由器)是正常工作的么?
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
抓包看看
如果是跨网段的包,MAC目标地址是否是网关的MAC地址
如果是的话,那说明是网关设置错误
如果不是的话,说明本地设置错误
 
 
 

回复

56

帖子

0

TA的资源

一粒金砂(初级)

4
 
vxworks如何查看mac地址?如何查看网关的MAC地址?
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

5
 
在增加了routeAdd “0”,“网关地址”后可以跨网段ping通,但是组播报文过不去,有没有高招?
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

6
 
学习学习
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

7
 
来学习下,呵呵
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(中级)

8
 
组播报文其实已经可以跨网段,但是VLAN的其他网段的主机上用EtherPeek抓不到,接收的主机是否要进行什么设置?
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

9
 
选用组播需要在前面加网关;
mRouteAdd(cGroupAddr, cRouteAddr, 0xFFFF0000, 0, 0 ); /*cGroupAddr为组播地址,cRouteAddr为网关地址 */

nReturnValue = mRouteAdd (cC2LocalAddr, cRouteAddr, 0xFFFF0000, 0, 0 ); /*cC2LocalAddr为本机地址,cRouteAddr为网关地址 */
printf("add route is = %d\n",nReturnValue);
把这几句放在程序前面执行看看。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表