2013-03-05 21 views
5

我有一個WinRT應用程序,它使用StreamSocketDataWriter執行上載。它跟蹤上傳的時間,然後計算吞吐量。如何使用WinRT StreamSockets接收數據包上傳確認?

我遇到的問題是吞吐量遠高於Wireshark顯示。這是因爲我的上傳循環完成並在WinRT框架實際將數據發送到網絡層之前採用結束時間戳。我發現沒有辦法從框架接收數據包實際上已經到達網絡層的確認。 DataWriterStoreAsync方法只返回您存儲的字節數,我在存儲它們之前就知道了。

其他框架(如Windows Phone)具有一個回調,在發送數據包後觸發,並告訴您已上傳多少字節。我還沒有在WinRT中找到任何等價物,並且必須解決一個循環,該循環記錄了我在StoreAsync函數中提交了多少字節。

有沒有一種方法可以從實際發送到網絡層的時間和數量字節的框架中獲得確認?

更新:我給@ polkduran的建議嘗試,雖然他們幫助減輕了一些數據包丟失,但我仍然在較小的文件上傳(100KB)中遇到重大數據包丟失。對於較大的文件(4MB和10MB),所有數據包都正在發送,但結束時間仍然是幾秒鐘,這會顯着影響吞吐量計算結果(與Wireshark跟蹤相比)。我的猜測是回調只是減慢了上傳速度,而不是提供實際的數據包上傳確認。

我仍在尋找解決此問題的方法。

編輯:我創建了與微軟有關這個問題的支持票。他們的官方迴應是WinRT框架沒有辦法確認數據包實際上傳了。

回答

2

我還沒有嘗試過,但你可以在由DataWritter對象的StoreAsync方法返回的DataWriterStoreOperation處理程序分配給Completed回調財產。

或者

您可以直接在WriteAsync方法從OutputStream財產從StreamSocket它返回一個IAsyncOperationWithProgress操作使用。

+1

是的!你的第一個建議是解決方案。我能夠使用返回的'DataWriterStoreOperation'對象的'Completed'回調來發送每個數據包並自行調用,而不是循環發送它們。傳入回調函數的'IAsyncOperation '參數有一個名爲'GetResults'的方法,它可以爲您提供發送的字節。這正是我所期待的。非常感謝你!這對我來說是一個巨大的幫助。 – jokeefe 2013-03-05 21:32:51

+0

不幸的是,我說得太快了。這些解決方案都不能完全解決問題。在我的第一個測試中,我將它用於HTTP上傳實現中,因此代碼實際上等待在服務器完成之前從服務器接收200 OK,這迫使它等待全部時間。在我嘗試在FTP上傳中實現此功能後,當我上傳較小的文件大小(100KB)時,它在服務器實際收到所有數據包之前繼續完成全部上載。我認爲這一切確實讓它稍微慢了一點,但它並不是真正的數據包上傳確認。 – jokeefe 2013-03-08 15:11:04

相關問題