【问题标题】:Windivert filter error: IfIdxWindivert 过滤器错误:IfIdx
【发布时间】:2017-03-17 10:35:18
【问题描述】:

我正在尝试使用以下过滤器来转移包裹,但它失败了:

WinDivertOpen("IfIdx == X", WINDIVERT_LAYER::WINDIVERT_LAYER_NETWORK, 0, 0);

我正在尝试一个程序,它必须从索引为 X (0, 1, 2, ...) 的特定接口转移流量,但我得到一个错误代码号 87,这表示一个无效的数据包过滤器字符串,层、优先级或标志。

如果我尝试使用其他过滤器,例如“tcp”,它可以工作,但我只需要将过滤器应用于我已经知道其索引的特定接口。如果此过滤器键不起作用..我可以采取什么解决方案?

这是文档:https://reqrypt.org/windivert-doc.html#filter_language

问候和感谢。

编辑:我也试过这个:

handle = WinDivertOpen("true", WINDIVERT_LAYER::WINDIVERT_LAYER_NETWORK, 0, 0);

if (handle == INVALID_HANDLE_VALUE)
    printf("ERROR WINDIVERT: %d", GetLastError());

else
{
    while (TRUE)
    {
        if (WinDivertRecv(handle, packet, sizeof(packet), &addr, &packetLen))
        {
            if (addr.IfIdx != X)
            {
                WinDivertSend(handle, packet, packetLen, &addr, NULL);
            }
        }
    }

    WinDivertClose(handle);

但是它阻止了所有接口的流量,并且不仅阻止了我索引为X的特定接口的流量。

【问题讨论】:

    标签: c++ windows networking filter interface


    【解决方案1】:

    我认为问题在于,当正确的令牌是 ifIdx(小写 i)时,您使用的是 IfIdx。顺便说一句,如果你升级到 WinDivert1.2,你可以使用WinDivertHelperCheckFilter 函数来获得更有用的错误信息。

    至于您的编辑;可能是一些问题,例如在WinDivertSend 之前没有重新计算校验和(如有必要)。请参阅passthru.c 示例程序。

    【讨论】:

      猜你喜欢
      • 2016-05-18
      • 2018-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-03
      • 2016-08-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多