我在Visual Studio 2015中使用WinDivert 1.1.8 MSVC x64以及用于C#的P/Invoke wrapper来创建简单的延迟模拟器,但在执行带宽密集型任务(例如速度测试)时连接失败。
输出
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
答案 0 :(得分:1)
您应该使用WinDivertRecvEx
而不是WinDivertRecv
来避免重叠的I / O.此外,您在多线程应用上使用Queue<T>
,我相信您应该使用ConcurrentQueue<T>
。
我认为x64调试器也可能导致问题。我正在运行应用程序而不进行调试,它可以工作(CTRL + F5)。
工作代码:https://gist.github.com/fahminlb33/16f69460466eb07f88e7588a285fb4f8