2013-03-05 4 views
5

私はStreamSocketDataWriterを使ってアップロードを実行するWinRTアプリケーションを持っています。アップロードにかかる時間を追跡し、スループットを計算します。WinRT StreamSocketsを使用してパケットアップロードの確認を受信する方法は?

私が抱える問題は、Wiresharkよりもスループットがはるかに高いことです。これは、WinRTフレームワークが実際にデータをネットワークレイヤに送信する前に、私のアップロードループが終了し、終了タイムスタンプを取るためです。私はパケットがネットワーク層に実際にそれを作ったというフレームワークからの確認を受け取る手段がないことを発見しました。 DataWriterStoreAsyncメソッドは、格納したバイト数だけを返します。これは、格納する前に知っていたバイト数です。

Windows Phoneなどの他のフレームワークでは、パケットが送信された後にトリガーされ、アップロードしたバイト数がわかります。私はWinRTで同等のものを見つけられず、StoreAsync関数でコミットしたバイト数を記録するループを解決しなければなりませんでした。

実際にネットワークレイヤに送信されたバイト数とフレームワークの確認を取得する方法はありますか?

更新:@ polkduranの提案を試してみましたが、パケットロスを緩和するのに役立ちましたが、まだ小さなファイルアップロード(100KB)で大きなパケット損失が発生しています。大容量ファイル(4MBと10MB)では、すべてのパケットが送信されていますが、終了時間は数秒でまだオフになっています(Wiresharkトレースと比較して)スループット計算を大幅にスキップします。私の推測では、実際のパケットアップロード確認を提供するのではなく、ちょっとアップロードを遅くしたコールバックです。

私はまだこの問題の解決策を探しています。

編集:私はこの問題についてMicrosoftにサポートチケットを作成しました。彼らの正式な応答は、パケットが実際にアップロードされたことを確認する方法がWinRTフレームワークにないことです。

答えて

2

私は試していないが、あなたはDataWritterオブジェクトのStoreAsyncメソッドによって返さDataWriterStoreOperationCompletedコールバックプロパティにハンドラを割り当てることができます。

それとも

あなたはIAsyncOperationWithProgress操作を返すあなたのStreamSocketからOutputStreamプロパティから直接WriteAsync方法を使用することができます。

+1

はい!あなたの最初の提案は解決策でした。私は、返された 'DataWriterStoreOperation'オブジェクトの' Completed'コールバックを使用して、各パケットを送信し、ループで送信するのではなく、自分自身を呼び出すことができました。コールバック関数に渡される 'IAsyncOperation 'パラメータには、 'GetResults'メソッドがあります。これはまさに私が探していたものです。どうもありがとうございました!これは私にとって大きな助けとなりました。 – jokeefe

+0

残念ながら私はあまりにも早く話しました。これらの解決策のどちらも実際に問題を完全に解決するものではありません。私の最初のテストでは、HTTPアップロードの実装でそれを使用していたため、コードは完了する前にサーバーから200 OKを受け取ることを実際に待っていたため、フルタイムを待っていました。これをFTPアップロードで実装しようとした後、小さなファイルサイズ(100KB)をアップロードしたときにサーバーが実際にすべてのパケットを受信する前に、フルアップロードを終了しました。私はこれが少し遅くなったと思うけど、本当のパケットアップロードの確認ではない。 – jokeefe

関連する問題