在我的C#應用程序中,我通過調用Socket.SendTo
來發送UDP消息,每秒可能高達10,000次。我知道它有時無法跟上我發送的數量。有沒有辦法檢查它已經排隊或積壓發送的數據量(以字節爲單位,或者我稱爲SendTo
等的次數)?如何查看C#套接字排隊發送的字節數?
我的理想解決方案是丟棄非必要的消息,如果套接字開始在後面運行並讓基本消息被套接字排隊,那麼在我調用SendTo
之前知道套接字狀態會非常有幫助。
感謝
在我的C#應用程序中,我通過調用Socket.SendTo
來發送UDP消息,每秒可能高達10,000次。我知道它有時無法跟上我發送的數量。有沒有辦法檢查它已經排隊或積壓發送的數據量(以字節爲單位,或者我稱爲SendTo
等的次數)?如何查看C#套接字排隊發送的字節數?
我的理想解決方案是丟棄非必要的消息,如果套接字開始在後面運行並讓基本消息被套接字排隊,那麼在我調用SendTo
之前知道套接字狀態會非常有幫助。
感謝
的數據包可以在很多不同的地方排隊,這不是真的可行做到這一點:他們可能是在插座上,在IP棧的某個地方,在網絡接口輸出隊列,等等。
即使您找到了一種方法來查詢操作系統中的適當隊列(這肯定不會是可移植的),但這樣做並不能真正解決您的問題。原因在於,除非實際上發送消息的速度超過了網絡接口可以處理的速度,否則最有可能發生在發送計算機之外的網絡某處。由於現在通用計算機上的許多網絡接口都是1Gbps,因此網絡接口很可能能夠在發送數據包的速度與發起數據包時一樣快。阻塞點可能是一個以太網交換機或某處的路由器,當那個以太網交換機或路由器正在丟棄數據包或不在時,您將無法查詢隊列。
您想要做的問題是,它是管理傳出隊列的操作系統內核,而不是您的應用程序。而且隨着UDP更少的排隊正在進行,所以如果需要的話,數據包就會被丟棄。
最好的辦法是在命令行上看到netstat -s
來查看協議統計信息和數據包丟棄計數(Windows可能有一些花哨的API來查詢應用程序中的相同內容,但我不知道它)。
找到您的主機和網絡可以承受的可接受消息速率,並在達到/超過時切換到「精益」輸出。這需要一些簿記,但可以很容易地用時間戳的環形緩衝區來完成。