丢失UDP发送的数据包

丢失UDP发送的数据包,udp,winsock,Udp,Winsock,我是Winsock编程新手,如果这是一个“愚蠢”的问题,请提前道歉 我已经编写了一个Windows应用程序,它通过UDP将数据发送到外部设备。由于UDP是外部设备支持的唯一协议,因此我无法使用更健壮的协议,如TCP 现在,如果我的程序连续6次快速调用WSASentTo,将发生以下两种情况之一: 如果上一条消息是最近发送的,而目标设备仍在Windows的ARP缓存中,则所有6条消息都将发送到外部设备 但是,如果设备不再位于Windows的ARP缓存中,则只发送一到两条消息。其他人似乎在某处消失了

我是Winsock编程新手,如果这是一个“愚蠢”的问题,请提前道歉

我已经编写了一个Windows应用程序,它通过UDP将数据发送到外部设备。由于UDP是外部设备支持的唯一协议,因此我无法使用更健壮的协议,如TCP

现在,如果我的程序连续6次快速调用WSASentTo,将发生以下两种情况之一:

  • 如果上一条消息是最近发送的,而目标设备仍在Windows的ARP缓存中,则所有6条消息都将发送到外部设备

  • 但是,如果设备不再位于Windows的ARP缓存中,则只发送一到两条消息。其他人似乎在某处消失了

  • 我的应用程序每次调用WSASendTo时都使用不同的缓冲区,所以我的应用程序不应该覆盖它自己的数据。我还认为我必须为重叠I/O正确设置WSASEND。消息非常小(每个只有大约50个数据字节),因此我无法想象我会在任何地方溢出缓冲区。“网络”仅由PC和目标设备组成,由一根cat5电缆将两者连接起来

    虽然我可以添加一个常规的“心跳”来将设备保持在Windows的ARP缓存中(可能会),但我仍然担心某些东西没有按应有的方式工作


    有什么想法吗?

    不幸的是,由于UDP对传输没有任何保证,网络堆栈可以出于任何原因随时丢弃您发送的数据包,因此不可能将此类问题归类为无法正常工作

    对于您的特定场景,Microsoft在过去的ARP解析过程中已经解决了这种类型的UDP丢弃问题。该行为可能/可能保留在当前的实现中

    ARP只对给定目标地址的一个出站IP数据报排队,而该IP地址正在解析为MAC地址。如果基于UDP的应用程序将多个IP数据报发送到单个目标地址,而在它们之间没有任何暂停,则如果没有ARP缓存项,则可能会删除一些数据报。在发送数据包流之前,应用程序可以通过调用iphlapi.dll例程SendArp()来建立arp缓存条目来补偿这一点。有关更多信息,请参阅平台软件开发工具包(SDK)


    非常感谢。这和我的观察结果一致。目前,我已经通过ARP命令添加了一个静态ARP表项。到时候我会找到更好的方法。