WinDivert连接丢失

时间:2017-05-23 13:25:57

标签: c# multithreading networking

我在Visual Studio 2015中使用WinDivert 1.1.8 MSVC x64以及用于C#的P/Invoke wrapper来创建简单的延迟模拟器,但在执行带宽密集型任务(例如速度测试)时连接失败。

输出

WinDivert errors

  

ERROR_IO_PENDING 997(0x3E5)重叠的I / O操作正在进行中。

     

ERROR_INSUFFICIENT_BUFFER 122(0x7A)传递给系统调用的数据区域太小。

备注

x64远程调试可能造成的死锁?

可能压倒WinDivert队列?

更新

我尝试过并行线程,这会产生同样的错误。

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

更新2

在进一步测试代码后,违规行可能是:

packet.CopyTo(newpacket.data, 0);

更新3

CPU堆栈 CPU Stack WinDivert队列可能需要编组?

1 个答案:

答案 0 :(得分:1)

您应该使用WinDivertRecvEx而不是WinDivertRecv来避免重叠的I / O.此外,您在多线程应用上使用Queue<T>,我相信您应该使用ConcurrentQueue<T>

我认为x64调试器也可能导致问题。我正在运行应用程序而不进行调试,它可以工作(CTRL + F5)。

工作代码:https://gist.github.com/fahminlb33/16f69460466eb07f88e7588a285fb4f8