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