VxWorks网络接口结构:
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 ;
}