【问题标题】:Unicast UDP packet miss单播 UDP 数据包丢失
【发布时间】:2016-08-01 07:48:48
【问题描述】:

单播(一对一)UDP通信,每次收到的包不一样;如果我在 500 毫秒的间隔内发送 1000 个数据包,我会丢失 9 个数据包。我在 Windows 平台 VCC 6.0 上工作;使用 sendto 系统调用发送以太网数据包。在主机端,我因校验和错误或标头错误而错过了数据包。

如果您需要更多详细信息,请告诉我。我的议程是我不应该错过目标端的任何数据包。 任何有关此问题的帮助将不胜感激。

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

萨蒂什库马尔。

【问题讨论】:

  • UDP 不保证传送,因此某些数据包可能会丢失。如果您需要传送所有数据包,请使用 TCP。请提供一些示例代码。

标签: c udp


【解决方案1】:

不幸的是,由于 UDP 不保证传送,网络堆栈可以随时出于任何原因丢弃您发送的数据包。值得注意的是,数据包到达的订单也没有订单保证。

如果订购和交付是您的应用程序的首要任务(我认为确实如此),请考虑切换到 TCP。

【讨论】:

  • 我在一个不应该使用 TCP 的项目中工作; UDPlite可以在msdn中实现吗,如果可以实现怎么实现??
  • UDP-lite 仍然不能保证数据包的传递,它只是允许应用程序处理“损坏”的数据。但是,如果您仍然希望继续使用它,Linux 已内置支持添加内核 > 2.6.20。对于windows,有一个WULL 库,我不认为它是免费的。你可以在这里了解它的实现:irisa.fr/temics/softwares/WULLUserGuide.pdf
猜你喜欢
  • 2016-07-04
  • 2015-06-30
  • 2018-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-06
  • 1970-01-01
相关资源
最近更新 更多