2017-05-23 14 views
0

Visual Studio 2015でWinDivert 1.1.8 MSVC x64とC#用のP/Invoke wrapperを使用して、単純なレイテンシシミュレータを作成していますが、スピードテストなどの帯域幅集中型タスクを実行すると接続が失敗します。WinDivert接続喪失

出力

WinDivert errors

ERROR_IO_PENDING 997(0x3E5)重複したI/O操作が進行中です。

ERROR_INSUFFICIENT_BUFFER 122(0x7A)システムコールに渡されたデータ領域が小さすぎます。

ノート

x64のリモートデバッグによって引き起こされる可能性のあるデッドロック?

おそらくWinDivertキューを圧倒しますか?

更新

Iは、並列スレッドを試みており、これは、同じエラーを生じました。

Parallel.ForEach(Enumerable.Range(0, Environment.ProcessorCount), x => RunDiversion()); 

アップデート2

さらにコードをテストした後、問題の行であってもよい。

packet.CopyTo(newpacket.data, 0);

更新3

CPUスタック CPU Stack WinDivertキューにマーシャリングが必要な可能性がありますか?

答えて

1

重複するI/Oを避けるには、WinDivertRecvの代わりにWinDivertRecvExを使用する必要があります。また、Queue<T>をマルチスレッドアプリケーションで使用していますが、代わりにConcurrentQueue<T>を使用する必要があります。

x64デバッガでも問題が発生する可能性があります。私はデバッグせずにアプリを実行していて、それは動作します(CTRL + F5)。

作業コード:https://gist.github.com/fahminlb33/16f69460466eb07f88e7588a285fb4f8

+0

ありがとうございます。私はすぐにより集中的なテストを行います。私もwindivertキューを最大にする必要がありますか? – Tod

関連する問題