2015-04-21 113 views
0

我是Winsock編程新手,所以如果這是一個「愚蠢」的問題,請提前道歉。缺少UDP發送數據包

我寫了一個Windows應用程序,通過UDP發送數據到外部設備。由於UDP是外部設備支持的唯一協議,因此我無法使用更強大的協議,例如TCP。現在

,如果我的程序使說6調用快速連續WSASentTo,兩件事情將會發生:

  1. 如果以前的消息最近被髮送的,並且目標設備仍然在Windows' ARP緩存,然後所有6條消息都發送到外部設備。

  2. 但是,如果設備不再位於Windows的ARP緩存中,則只會發送一個或兩個消息。其他人似乎在某處消失。

我的應用程序使用它調用的每個WSASendTo不同的時間緩衝,所以我的應用程序不應該覆蓋它自己的數據。我也認爲我有WSASendTo設置正確的重疊I/O。消息非常小(每個消息只有大約50個數據字節),所以我無法想象我會在任何地方溢出緩衝區。 「網絡」由PC和目標設備組成,只需一條cat5線纜即可連接兩者。

雖然我可以只是添加一個常規的「心跳」,以保持設備在Windows的ARP緩存(可能會),但我仍然擔心有些事情沒有按照應有的方式工作。

任何想法?

回答

0

不幸的是,由於UDP對交付沒有任何保證,網絡堆棧可以隨時以任何理由丟棄發送的數據包,所以不可能將此類問題歸類爲不應該如其應有的工作。

對於您的特定情況,Microsoft在過去的ARP解析過程中已經解決了這種類型的UDP丟棄問題。在當前的實現中可能/可能這種行爲仍然存在。

ARP and UDP Messages

ARP隊列只有一個給定的目標地址的出站IP數據報,而該IP地址已經被解析爲MAC地址。如果基於UDP的應用程序將多個IP數據報發送到單個目標地址而它們之間沒有任何暫停,則如果不存在ARP高速緩存條目,則可能會丟棄某些數據報。應用程序可以通過在發送數據包流之前調用Iphlpapi.dll例程SendArp()來建立一個arp緩存條目來彌補這一點。有關更多信息,請參閱平臺軟件開發套件(SDK)。

+0

謝謝。這與我的觀察結果一致。目前我通過arp命令添加了一個靜態ARP表項。在適當的時候,我會找到一個更好的方式來做到這一點。 –