VxWorks 6.6 实现以太网帧的发送

ysuzyc 2012-10-21 06:04:15
小弟想用mux层去直接发送以太网帧,但却不知道具体怎么做,希望各位大侠给点指导啊~~,可以有偿提供代码啊!!!
...全文
3221 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
阿莉派 2015-06-14
  • 打赏
  • 举报
回复
楼主能分发一份获取以太网帧的代码吗?
ambercctv 2012-10-31
  • 打赏
  • 举报
回复
主机的防火墙关了嘛?
viphj 2012-10-30
  • 打赏
  • 举报
回复
Waiting for the answer
zhenghn2010 2012-10-30
  • 打赏
  • 举报
回复
ping 其他网段不通? 抓包看了吗,真的发出去了吗?
要明白tcp/ip数据报文发送的基本过程。

如果是同一网段的,能找到相应路由项,就从相应的接口发送出去,包括arp, ping等。
如果不是同一网段,就要找默认路由,从这个接口发送出去,目的方是默认网关/路由,是同一网段的,然后由这个网关实现转发。
你看看你的路由表,是否有默认路由,是否正确。
ysuzyc 2012-10-28
  • 打赏
  • 举报
回复
to huangdx13:TCP UDP都是在IP之上,以太网数据帧是在IP之下,是数据链路层,所以TCP、UDP是无法实现以太网帧的发送的。

目前已经完成IP数据的转发。并且在开发过程中,实现了arp欺骗以及对任意子网网段内的ping的回复。但是对子网段外的ping无法回复,不知道怎么回事。如局域网掩码为255.255.255.0;vxworks ip :10.2.120.2,PC IP:10.2.120.5;PC ping 10.2.120.x都能ping通(PC只与VXWorks相连),但ping其他ip 如 ping 10.2.2.2就ping不通,不清楚怎么回事啊!!
hdxccc 2012-10-28
  • 打赏
  • 举报
回复
个人认为利用UDP或者TCP协议就可以对以太网的数据帧进行传送了。
ysuzyc 2012-10-27
  • 打赏
  • 举报
回复
谢谢楼上啊,目前以太网包的抓取和转发已经实现了。现在我想实现对ping的回复,我直接将接受到的icmp报文的''类型''区设置为0,将ip报文的源ip和目的ip互换,添加以太桢头发送出去(确定已经发出去),可ping的发起端却收不到回复。不知道怎么回事啊!请大侠帮我分析分析吧
ysuzyc 2012-10-23
  • 打赏
  • 举报
回复
帖子很冷清啊
sxyandsl 2012-10-23
  • 打赏
  • 举报
回复
可以的,比较麻烦,你要自己添加IP报文头和相关协议报文头,网上有现成的步骤
1、首先进行绑定,将需要发送接收的绑定到程序中(在说明中都说绑定到驱动上,其实在应用程序中也是可以的,只是感觉破坏了程序的结构,但是在一些实时任务中,为了保证程序的延时小于毫秒级,也就直接发送数据给MUX层)

/*测试mux发送*/
pSlot->pSendCookie=muxBind("motfcc",0,(FUNCPTR)stackRcvRtn,NULL,NULL,NULL,
MUX_PROTO_SNARF,"RealUDP",NULL);
if(NULL == pSlot->pSendCookie)
{
LOG_Dbg_Msg("MUX bind fail./n", 0, 0, 0, 0, 0, 0);
pSlot->pSendCookie = NULL;

return ERROR;
}

2、根据绑定的结果获取获取的发送MUX ID

/*获取发送数据ID*/
pEnd = ((MUX_ID)gpSlotTest->pSendCookie)->pEnd;
if(NULL == pEnd)
{
LOG_Dbg_Msg("pEnd is NULL./n", 0, 0, 0, 0, 0, 0);
muxUnbind(gpSlotTest->pSendCookie,MUX_PROTO_PROMISC,(FUNCPTR)stackRcvRtn);
gpSlotTest->pSendCookie = NULL;

return ;
}
3、申请发送数据的数据缓冲区,同时进行缓冲区的设置。将报文复制之后,该缓冲区可以直接发送。

/*获取网络数据缓冲区*/
pMblk = netTupleGet (pEnd->pNetPool, 1480, M_DONTWAIT, MT_DATA, FALSE);
if(NULL == pMblk )
{
LOG_Dbg_Msg("can't get net pool flag./n", 0, 0, 0, 0, 0, 0);

return ;
}

pMblk->mBlkHdr.mFlags |= M_PKTHDR;
pMblk->mBlkHdr.mLen = 0;
pMblk->mBlkHdr.mData = pMblk->pClBlk->clNode.pClBuf;

3、数据的发送,首先进行发送报文内容的复制,在将报文发送;在MUX这个发送,如果发送成功将不需要进行报文的释放,而如果发送失败缓冲区是需要手动的将这个缓冲区释放。

pData = pMblk->mBlkHdr.mData;
bcopy(gpSlotTest->pDataBuf,pData,sizeof(cTempBuf));

pMblk->mBlkHdr.mLen = sizeof(cTempBuf);
pMblk->mBlkPktHdr.len = pMblk->mBlkHdr.mLen;

if(muxSend(gpSlotTest->pSendCookie,pMblk)!=OK)
{
LOG_Dbg_Msg("socket is invalid./n", 0, 0, 0, 0, 0, 0);
netMblkClChainFree(pMblk);
//muxUnbind(SendCookie,MUX_PROTO_PROMISC,(FUNCPTR)stackRcvRtn);
return ;
}
ysuzyc 2012-10-21
  • 打赏
  • 举报
回复
自己顶一下

2,179

社区成员

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

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