丢失UDP发送的数据包
我是Winsock编程新手,如果这是一个“愚蠢”的问题,请提前道歉 我已经编写了一个Windows应用程序,它通过UDP将数据发送到外部设备。由于UDP是外部设备支持的唯一协议,因此我无法使用更健壮的协议,如TCP 现在,如果我的程序连续6次快速调用WSASentTo,将发生以下两种情况之一:丢失UDP发送的数据包,udp,winsock,Udp,Winsock,我是Winsock编程新手,如果这是一个“愚蠢”的问题,请提前道歉 我已经编写了一个Windows应用程序,它通过UDP将数据发送到外部设备。由于UDP是外部设备支持的唯一协议,因此我无法使用更健壮的协议,如TCP 现在,如果我的程序连续6次快速调用WSASentTo,将发生以下两种情况之一: 如果上一条消息是最近发送的,而目标设备仍在Windows的ARP缓存中,则所有6条消息都将发送到外部设备 但是,如果设备不再位于Windows的ARP缓存中,则只发送一到两条消息。其他人似乎在某处消失了
有什么想法吗?不幸的是,由于UDP对传输没有任何保证,网络堆栈可以出于任何原因随时丢弃您发送的数据包,因此不可能将此类问题归类为无法正常工作 对于您的特定场景,Microsoft在过去的ARP解析过程中已经解决了这种类型的UDP丢弃问题。该行为可能/可能保留在当前的实现中 从 ARP只对给定目标地址的一个出站IP数据报排队,而该IP地址正在解析为MAC地址。如果基于UDP的应用程序将多个IP数据报发送到单个目标地址,而在它们之间没有任何暂停,则如果没有ARP缓存项,则可能会删除一些数据报。在发送数据包流之前,应用程序可以通过调用iphlapi.dll例程SendArp()来建立arp缓存条目来补偿这一点。有关更多信息,请参阅平台软件开发工具包(SDK)
非常感谢。这和我的观察结果一致。目前,我已经通过ARP命令添加了一个静态ARP表项。到时候我会找到更好的方法。