在SNMP(自定义dll)中设置数据时,数据会转移到另一个OID。我该如何解决这个问题?

在SNMP(自定义dll)中设置数据时,数据会转移到另一个OID。我该如何解决这个问题?,dll,snmp,agent,mib,oid,Dll,Snmp,Agent,Mib,Oid,我为SNMP扩展代理编写了一个DLL文件,引用。然后,我执行了必要的操作并将其保存在SNMP服务器上。因此,DLL文件可以正常工作,但不正确 如果使用“”发出GetBulk请求,则可以获取以下值: var r = new List<Variable>(); Messenger.BulkWalk(VersionCode.V2, new IPEndPoint(IPAddress.Parse("127.0.0.1"), 161), new OctetSt

我为SNMP扩展代理编写了一个DLL文件,引用。然后,我执行了必要的操作并将其保存在SNMP服务器上。因此,DLL文件可以正常工作,但不正确

如果使用“”发出GetBulk请求,则可以获取以下值:

var r = new List<Variable>();
Messenger.BulkWalk(VersionCode.V2,
    new IPEndPoint(IPAddress.Parse("127.0.0.1"), 161),
    new OctetString("public"),
    new OctetString("alarm"),
    new ObjectIdentifier("1.3.6.1.4.1.37476.9000.128.1"),
    r,
    200, 1, WalkMode.WithinSubtree, null, null);

    foreach (var item in r)
    {
        Console.Write(item + "\n");
    }
现在我们将值设置为OID 2。(在其他方面也观察到相同的结果):

而这正好奏效。同样,如果我给出“tt”或“ttt”这样的值,它也会正常工作。但是,如果我给出“tttt”,我们将面临不同的情况:

Variable: Id: 1.3.6.1.4.1.37476.9000.128.1.1.0; Data: 1
Variable: Id: 1.3.6.1.4.1.37476.9000.128.1.2.0; Data: tttt
Variable: Id: 1.3.6.1.4.1.37476.9000.128.1.3.0; Data:
Variable: Id: 1.3.6.1.4.1.37476.9000.128.1.4.0; Data: 4
Variable: Id: 1.3.6.1.4.1.37476.9000.128.1.5.0; Data: 5
Variable: Id: 1.3.6.1.4.1.37476.9000.128.1.6.0; Data: 6
是的,当我将长度设置为3以上时,较低的OID值也会受到影响

让我们给出一个较长的值,如“123456789101112”:

你没想到会这样,是吗?让我解释一下,数据首先添加到OID 2中。但是,由于其值大于3,因此会影响较低的行,并在子OID中打印4之后的值。然后它对OID 3也会这样做,以此类推

那么为什么会发生这种情况呢

这是DLL文件中的我的叶方法。所有交易都将在此处可见。您可以查看SET操作的“MIB_ACTION_SET”案例

    UINT MIB_leaf_func(
    IN UINT Action,
    IN MIB_ENTRY* MibPtr,
    IN RFC1157VarBind* VarBind
)
{
    UINT ErrStat;

    switch (Action)
    {
    case MIB_ACTION_GETNEXT:
        // If there is no GET-NEXT pointer, this is the end of this MIB
        if (MibPtr->MibNext == NULL)
        {
            ErrStat = SNMP_ERRORSTATUS_NOSUCHNAME;
            goto Exit;
        }

        // Setup var bind name of NEXT MIB variable
        SnmpUtilOidFree(&VarBind->name);
        SnmpUtilOidCpy(&VarBind->name, &MIB_OidPrefix);
        SnmpUtilOidAppend(&VarBind->name, &MibPtr->MibNext->Oid);

        // Call function to process request. Each MIB entry has a function.
        // pointer that knows how to process its MIB variable.
        ErrStat = (*MibPtr->MibNext->MibFunc)(MIB_ACTION_GET, MibPtr->MibNext, VarBind);

        break;

    case MIB_ACTION_GET:
        // Make sure that this variable's ACCESS is GET'able
        if (MibPtr->Access != MIB_ACCESS_READ && MibPtr->Access != MIB_ACCESS_READWRITE)
        {
            ErrStat = SNMP_ERRORSTATUS_NOSUCHNAME;
            goto Exit;
        }

        // Setup varbind's return value
        VarBind->value.asnType = MibPtr->Type;
        switch (VarBind->value.asnType)
        {
        case ASN_RFC1155_COUNTER:
        case ASN_RFC1155_GAUGE:
        case ASN_INTEGER:
            VarBind->value.asnValue.number = *(AsnInteger*)(MibPtr->Storage);
            break;

        case ASN_OCTETSTRING: // This entails ASN_RFC1213_DISPSTRING also
            VarBind->value.asnValue.string.length = (int)(strlen((LPSTR)MibPtr->Storage));

            if (NULL == (VarBind->value.asnValue.string.stream = (BYTE*)SnmpUtilMemAlloc(VarBind->value.asnValue.string.length * sizeof(char))
                ))
            {
                ErrStat = SNMP_ERRORSTATUS_GENERR;
                goto Exit;
            }

            memcpy(VarBind->value.asnValue.string.stream,
                (LPSTR)MibPtr->Storage,
                VarBind->value.asnValue.string.length
            );

            VarBind->value.asnValue.string.dynamic = TRUE;

            break;

        default:
            ErrStat = SNMP_ERRORSTATUS_GENERR;
            goto Exit;
        }

        break;

    case MIB_ACTION_SET:
        // Make sure that this variable's ACCESS is SET'able
        if (MibPtr->Access != MIB_ACCESS_READWRITE && MibPtr->Access != MIB_ACCESS_WRITE)
        {
            ErrStat = SNMP_ERRORSTATUS_NOSUCHNAME;
            goto Exit;
        }

        // Check for proper type before setting
        if (MibPtr->Type != VarBind->value.asnType)
        {
            ErrStat = SNMP_ERRORSTATUS_BADVALUE;
            goto Exit;
        }

        // Save value in MIB
        switch (VarBind->value.asnType)
        {
            case ASN_RFC1155_COUNTER:
            case ASN_RFC1155_GAUGE:
            case ASN_INTEGER:
                *(AsnInteger*)(MibPtr->Storage) = VarBind->value.asnValue.number;
                break;

            case ASN_OCTETSTRING: // This entails ASN_RFC1213_DISPSTRING also
                // The storage must be adequate to contain the new string
                // including a NULL terminator.
                memcpy((LPSTR)MibPtr->Storage,
                    VarBind->value.asnValue.string.stream,
                    VarBind->value.asnValue.string.length);

                ((LPSTR)MibPtr->Storage)[VarBind->value.asnValue.string.length] = '\0';

                break;

            default:
                ErrStat = SNMP_ERRORSTATUS_GENERR;
                goto Exit;
        }

        break;

    default:
        ErrStat = SNMP_ERRORSTATUS_GENERR;
        goto Exit;
    } // switch

    // Signal no error occurred
    ErrStat = SNMP_ERRORSTATUS_NOERROR;

Exit:
    return ErrStat;
}// MIB_leaf_func
如果你能帮助我,我将非常高兴

谢谢

Variable: Id: 1.3.6.1.4.1.37476.9000.128.1.1.0; Data: 1
Variable: Id: 1.3.6.1.4.1.37476.9000.128.1.2.0; Data: t
Variable: Id: 1.3.6.1.4.1.37476.9000.128.1.3.0; Data: 3
Variable: Id: 1.3.6.1.4.1.37476.9000.128.1.4.0; Data: 4
Variable: Id: 1.3.6.1.4.1.37476.9000.128.1.5.0; Data: 5
Variable: Id: 1.3.6.1.4.1.37476.9000.128.1.6.0; Data: 6
Variable: Id: 1.3.6.1.4.1.37476.9000.128.1.1.0; Data: 1
Variable: Id: 1.3.6.1.4.1.37476.9000.128.1.2.0; Data: tttt
Variable: Id: 1.3.6.1.4.1.37476.9000.128.1.3.0; Data:
Variable: Id: 1.3.6.1.4.1.37476.9000.128.1.4.0; Data: 4
Variable: Id: 1.3.6.1.4.1.37476.9000.128.1.5.0; Data: 5
Variable: Id: 1.3.6.1.4.1.37476.9000.128.1.6.0; Data: 6
Variable: Id: 1.3.6.1.4.1.37476.9000.128.1.1.0; Data: 1
Variable: Id: 1.3.6.1.4.1.37476.9000.128.1.2.0; Data: 123456789101112
Variable: Id: 1.3.6.1.4.1.37476.9000.128.1.3.0; Data: 56789101112
Variable: Id: 1.3.6.1.4.1.37476.9000.128.1.4.0; Data: 9101112
Variable: Id: 1.3.6.1.4.1.37476.9000.128.1.5.0; Data: 112
Variable: Id: 1.3.6.1.4.1.37476.9000.128.1.6.0; Data: 6
    UINT MIB_leaf_func(
    IN UINT Action,
    IN MIB_ENTRY* MibPtr,
    IN RFC1157VarBind* VarBind
)
{
    UINT ErrStat;

    switch (Action)
    {
    case MIB_ACTION_GETNEXT:
        // If there is no GET-NEXT pointer, this is the end of this MIB
        if (MibPtr->MibNext == NULL)
        {
            ErrStat = SNMP_ERRORSTATUS_NOSUCHNAME;
            goto Exit;
        }

        // Setup var bind name of NEXT MIB variable
        SnmpUtilOidFree(&VarBind->name);
        SnmpUtilOidCpy(&VarBind->name, &MIB_OidPrefix);
        SnmpUtilOidAppend(&VarBind->name, &MibPtr->MibNext->Oid);

        // Call function to process request. Each MIB entry has a function.
        // pointer that knows how to process its MIB variable.
        ErrStat = (*MibPtr->MibNext->MibFunc)(MIB_ACTION_GET, MibPtr->MibNext, VarBind);

        break;

    case MIB_ACTION_GET:
        // Make sure that this variable's ACCESS is GET'able
        if (MibPtr->Access != MIB_ACCESS_READ && MibPtr->Access != MIB_ACCESS_READWRITE)
        {
            ErrStat = SNMP_ERRORSTATUS_NOSUCHNAME;
            goto Exit;
        }

        // Setup varbind's return value
        VarBind->value.asnType = MibPtr->Type;
        switch (VarBind->value.asnType)
        {
        case ASN_RFC1155_COUNTER:
        case ASN_RFC1155_GAUGE:
        case ASN_INTEGER:
            VarBind->value.asnValue.number = *(AsnInteger*)(MibPtr->Storage);
            break;

        case ASN_OCTETSTRING: // This entails ASN_RFC1213_DISPSTRING also
            VarBind->value.asnValue.string.length = (int)(strlen((LPSTR)MibPtr->Storage));

            if (NULL == (VarBind->value.asnValue.string.stream = (BYTE*)SnmpUtilMemAlloc(VarBind->value.asnValue.string.length * sizeof(char))
                ))
            {
                ErrStat = SNMP_ERRORSTATUS_GENERR;
                goto Exit;
            }

            memcpy(VarBind->value.asnValue.string.stream,
                (LPSTR)MibPtr->Storage,
                VarBind->value.asnValue.string.length
            );

            VarBind->value.asnValue.string.dynamic = TRUE;

            break;

        default:
            ErrStat = SNMP_ERRORSTATUS_GENERR;
            goto Exit;
        }

        break;

    case MIB_ACTION_SET:
        // Make sure that this variable's ACCESS is SET'able
        if (MibPtr->Access != MIB_ACCESS_READWRITE && MibPtr->Access != MIB_ACCESS_WRITE)
        {
            ErrStat = SNMP_ERRORSTATUS_NOSUCHNAME;
            goto Exit;
        }

        // Check for proper type before setting
        if (MibPtr->Type != VarBind->value.asnType)
        {
            ErrStat = SNMP_ERRORSTATUS_BADVALUE;
            goto Exit;
        }

        // Save value in MIB
        switch (VarBind->value.asnType)
        {
            case ASN_RFC1155_COUNTER:
            case ASN_RFC1155_GAUGE:
            case ASN_INTEGER:
                *(AsnInteger*)(MibPtr->Storage) = VarBind->value.asnValue.number;
                break;

            case ASN_OCTETSTRING: // This entails ASN_RFC1213_DISPSTRING also
                // The storage must be adequate to contain the new string
                // including a NULL terminator.
                memcpy((LPSTR)MibPtr->Storage,
                    VarBind->value.asnValue.string.stream,
                    VarBind->value.asnValue.string.length);

                ((LPSTR)MibPtr->Storage)[VarBind->value.asnValue.string.length] = '\0';

                break;

            default:
                ErrStat = SNMP_ERRORSTATUS_GENERR;
                goto Exit;
        }

        break;

    default:
        ErrStat = SNMP_ERRORSTATUS_GENERR;
        goto Exit;
    } // switch

    // Signal no error occurred
    ErrStat = SNMP_ERRORSTATUS_NOERROR;

Exit:
    return ErrStat;
}// MIB_leaf_func