vxworks下跨网段无法ping通???

ltr 2009-09-07 09:51:04
老弟最近在开发过程遇到一个问题,就是开发出的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;
}
...全文
455 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jorn 2009-09-20
  • 打赏
  • 举报
回复
选用组播需要在前面加网关;
mRouteAdd(cGroupAddr, cRouteAddr, 0xFFFF0000, 0, 0 ); /*cGroupAddr为组播地址,cRouteAddr为网关地址 */

nReturnValue = mRouteAdd (cC2LocalAddr, cRouteAddr, 0xFFFF0000, 0, 0 ); /*cC2LocalAddr为本机地址,cRouteAddr为网关地址 */
printf("add route is = %d\n",nReturnValue);
把这几句放在程序前面执行看看。
sxb198512 2009-09-09
  • 打赏
  • 举报
回复
来学习下,呵呵
sxb198512 2009-09-09
  • 打赏
  • 举报
回复
学习学习
ltr 2009-09-09
  • 打赏
  • 举报
回复
组播报文其实已经可以跨网段,但是VLAN的其他网段的主机上用EtherPeek抓不到,接收的主机是否要进行什么设置?
ltr 2009-09-08
  • 打赏
  • 举报
回复
在增加了routeAdd “0”,“网关地址”后可以跨网段ping通,但是组播报文过不去,有没有高招?
ltr 2009-09-08
  • 打赏
  • 举报
回复
vxworks如何查看mac地址?如何查看网关的MAC地址?
wolong98 2009-09-08
  • 打赏
  • 举报
回复
抓包看看
如果是跨网段的包,MAC目标地址是否是网关的MAC地址
如果是的话,那说明是网关设置错误
如果不是的话,说明本地设置错误
wolong98 2009-09-08
  • 打赏
  • 举报
回复
网关(路由器)是正常工作的么?

2,180

社区成员

发帖
与我相关
我的任务
社区描述
xworks是美国 Wind River System 公司( 以下简称风河公司 ,即 WRS 公司)推出的一个实时操作系统。
社区管理员
  • VxWorks开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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