缺少UDP发送的数据包

时间:2015-04-21 06:50:43

标签: udp winsock

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

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

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

  1. 如果最近发送了上一条消息,并且目标设备仍在Windows的ARP缓存中,则所有6条消息都将发送到外部设备。

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

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

    虽然我可以添加一个常规的“心跳”来保持设备在Windows的ARP缓存中(并且可能会),但我仍然担心某些东西不能正常工作。

    有什么想法吗?

1 个答案:

答案 0 :(得分:1)

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

对于您的特定方案,Microsoft在过去的ARP解析期间解决了此类UDP丢弃问题。行为可能/可能仍然存在于当前实现中。

来自 ARP and UDP Messages

  

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