在SNMP(自定义dll)中设置数据时,数据会转移到另一个OID。我该如何解决这个问题?
我为SNMP扩展代理编写了一个DLL文件,引用。然后,我执行了必要的操作并将其保存在SNMP服务器上。因此,DLL文件可以正常工作,但不正确 如果使用“”发出GetBulk请求,则可以获取以下值:在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
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