2016-08-01 20 views
0

ユニキャスト(1対1)UDP通信、受信したパケットが同じでないとき。 500msの間隔で1000パケットを送信している場合、9パケットが失われます。私はWindowsプラットフォームVCC 6.0で作業しています。 sendtoシステムコールを使用してイーサネットパケットを送信します。ホスト側では、チェックサムエラーまたはヘッダーエラーによってパケットが欠落します。ユニキャストUDPパケットミス

詳細が必要な場合はお知らせください。私のアジェンダは、ターゲット側でパケットを逃してはいけないということです。 この問題に関するご支援をいただければ幸いです。

{ 
    //Initialize local variables 
    MAINAPP(pAppPtr); 
    int iResult = 0; 
    int sRetVal = 0; 
    static char cTransmitBuffer[1024]; 
    unsigned long ulTxPacketLength =0; 
    int in_usTimeOut = 0; 
    unsigned short usTimeout = 0; 

    S_QJB_POWER_CNTRL S_Out_QJB_Power_Cntrl = {0}; 

    pAppPtr->S_Tcp_Handle.Tcp_Tx_Msg.m_ucHeader[0] = QJB_TCP_HEADER_BYTE1; 

    pAppPtr->S_Tcp_Handle.Tcp_Tx_Msg.m_ucHeader[1] = QJB_TCP_HEADER_BYTE2; 

    pAppPtr->S_Tcp_Handle.Tcp_Tx_Msg.m_usCmdID = QJB_ETH_POWER_ON; 

    pAppPtr->S_Tcp_Handle.Tcp_Tx_Msg.m_usCmdResults = 0; 

    pAppPtr->S_Tcp_Handle.Tcp_Tx_Msg.m_usDataSize = sizeof(S_QJB_POWER_CNTRL); 

    //Fill the controls & delay 
    sRetVal = PowerCntrlStructFill(&pAppPtr->S_Tcp_Handle.Tcp_Tx_Msg.U_Tcp_Msg.S_QJB_PowerCntrl,&usTimeout); 

    if(sRetVal) 
    { 
     return sRetVal; 
    } 

    pAppPtr->S_Tcp_Handle.Tcp_Tx_Msg.m_usReserved = 0; 

    pAppPtr->S_Tcp_Handle.Tcp_Tx_Msg.m_usChecksum = 0; 
    //Perform Endian Swap 
    pAppPtr->objEndianConv.EndianSwap(&pAppPtr->S_Tcp_Handle.Tcp_Tx_Msg.U_Tcp_Msg.S_QJB_PowerCntrl, &S_Out_QJB_Power_Cntrl); 

    //Frame the transmission packet 
    QJB_Frame_TXBuffer(cTransmitBuffer, &(pAppPtr->S_Tcp_Handle.Tcp_Tx_Msg), &ulTxPacketLength,(void *)&S_Out_QJB_Power_Cntrl); 

    //Send the data to the target 
    iResult = sendto(pAppPtr->sktConnectSocket,cTransmitBuffer,ulTxPacketLength,0,(struct sockaddr *)&pAppPtr->g_dest_sin, sizeof(pAppPtr->g_dest_sin)); 
    if(iResult == SOCKET_ERROR) 
    { 
     return QJB_TARGET_DISCONNECTED; 
    } 

    memset(&pAppPtr->S_Tcp_Handle.Tcp_Rx_Msg,0,sizeof(S_QJB_ETHERNET_PKT));// 1336 
    //Send the Command and obtain the response 
    sRetVal = QJB_ETHResRev(pAppPtr->sktConnectSocket,&pAppPtr->S_Tcp_Handle.Tcp_Rx_Msg,3); 
    return sRetVal; 
} 

Sathishkumar。

+1

UDPは配信保証を行わないため、一部のパケットが失われる可能性があります。すべてのパケットを配信する必要がある場合は、TCPを使用します。そして、いくつかのサンプルコードを提供してください。 –

答えて

0

残念ながら、UDPは配信を保証しないため、送信されたパケットは何らかの理由でいつでも破棄される可能性があります。パケットが到着する注文の注文保証人がいないことは注目に値する。

ご注文と配送がアプリケーションにとって最優先と思われる場合は、TCPに切り替えることを検討してください。

+0

私はTCPを使うべきではないプロジェクトで働いています。私たちが実装する方法を実装することができる場合、UDPliteはmsdnで実装できますか? – satiz01bravo

+0

UDP-liteは、パケット配信を保証するのではなく、アプリケーションが「破損した」データを処理できるようにします。しかし、まだ進めたいのであれば、Linuxは2.6.20のカーネルを追加したサポートを組み込みました。 Windowsの場合、WULLライブラリがありますが、私はそれが無料だとは思いません。その実装については、https://www.irisa.fr/temics/softwares/WULLUserGuide.pdfをご覧ください。 –