【问题标题】:WinDivert packet queue is causing disconnectionWinDivert 数据包队列导致断开连接
【发布时间】:2017-02-19 23:05:19
【问题描述】:

我将接收到的数据包从 WinDivert 传递到一个新队列并使用多线程发送/接收数据包,以便我可以为接收到的数据包添加时间戳等。

问题似乎是 WinDivert 停止向队列发送数据包导致网络最终断开。

我已经尝试最大化 WinDivert 队列长度/时间和线程优先级以及重新计算丢失的校验和。

在调试代码时使用 speedtest.net 运行 1-2 次速度测试可以重现该问题。

使用的 WinDivert 包装器:https://github.com/TechnikEmpire/DivertPInvoke

【问题讨论】:

  • 当你得到一个对你没有帮助的答案时,编辑它不是正确的答案。相反,投反对票或标记并解释问题所在。
  • 除了你的编辑没有以任何方式改善帖子(编辑后它是 100% 非建设性的并且完全不相关),事实上它阻碍了任何人教育该用户对他们的期望是什么。所以不要那样做。编辑适用于难以理解的好答案,如果一开始就不是答案,编辑将无济于事。
  • 谁能说出原始发帖人的意图是什么,除了遵守规则对他们来说并不重要?从破窗的角度来看,您的编辑同样糟糕,并且没有做任何事情来帮助更快地删除答案。发表评论以回复答案是确保没有人“认为可以发布”类似内容的正确方法。另外,你为什么坚持将答案称为“评论”?
  • 您是否没有看到网站处理您和我正在交换的 cmets 之间的差异,没有反对意见,也没有机会建议编辑,以及 jesuslvr 发布的答案?它被认为是一个答案,因为它是使用“发布您的答案”按钮发布的。这不是一个真正的答案,但称其为评论是错误的。

标签: c# multithreading networking queue


【解决方案1】:

问题可以通过在调试代码时使用 speedtest.net 运行 1-2 次速度测试来重现。

请注意,使用 WinDivert 运行某些调试器可能会导致死锁: https://github.com/basil00/Divert/issues/26

否则,是的,有足够的流量压倒 WinDivert 应用程序。将数据包转移到用户应用程序和从用户应用程序转移会增加很多开销。如果你真的想这样做,那么(1)运行多个线程,(2)使用非阻塞WinDivertSendEx发送数据包而不等待结果。看: https://github.com/basil00/Divert/blob/master/examples/streamdump/streamdump.c

【讨论】:

  • 在调试器之外执行似乎已经解决了断线问题。现在这只是导致极高 ping 的开销,正如您在我使用 WinDivertSendEx 提供的示例代码中看到的那样,但我不确定是否为此创建多个线程,线程是否需要同时用于接收和发送,我应该使用WinDivertRecvEx吗?
  • 设计取决于应用程序,因此由您决定。但总的来说,有 N 个线程并行处理数据包比 1 个要好。
  • 我尝试过使用多个线程,但并没有太大区别,我不认为是线程导致了问题。如果您可以在这里查看,我已经发布了一个关于我遇到的最新错误的新问题:stackoverflow.com/questions/44136191/windivert-connection-loss
猜你喜欢
  • 1970-01-01
  • 2014-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多