使用.net C#的SNMP项目发生封送错误
本文关键字:错误 项目 net SNMP 使用 | 更新日期: 2023-09-27 18:29:38
我必须构建一个SNMP项目来与各种设备通信。遗憾的是,除了用于SNMP的windows dll(mgmtapi.dll,snmpapi.dll,wsnmp32.dll)之外,我不能使用任何库。我已经为这些库和这些库的功能所需的所有结构制作了包装器,但在循环之后:
- SnmpMgrOpen(初始化并获取会话)
- SnmpVarBindList创建(使用SnmpMgrStrToOid、SnmpUtilMemAlloc和其他编组)以创建GET请求
- SnmpMgrRequest以发出请求并填充SnmpVarBindList结构
- SnmpMgrClose关闭会话
当我想使用查看SnmpVarBindList中的SnmpVarBinding内部的内容时
Marshal.PtrToStringAnsi(varBind.value.asnValue.text.stream, (int)varBind.value.asnValue.text.length + 1)
我收到错误:试图读取或写入受保护的内存。这通常表示其他内存已损坏。
从snmp.h头转换而来的结构是:
[StructLayout(LayoutKind.Sequential)]
public struct AsnOctetString
{
public uint length;
public int dynamic;
public IntPtr stream;
}
[StructLayout(LayoutKind.Sequential)]
public struct AsnObjectIdentifier
{
public uint idLength;
public IntPtr ids;
}
[StructLayout(LayoutKind.Explicit)]
public struct AsnUnion
{
[FieldOffset(0)]
public int number;
[FieldOffset(0)]
public uint unsigned32;
[FieldOffset(0)]
public ulong counter64;
[FieldOffset(0)]
public AsnOctetString text;
[FieldOffset(0)]
public AsnOctetString bits;
[FieldOffset(0)]
public AsnObjectIdentifier objectID;
[FieldOffset(0)]
public AsnOctetString sequence;
[FieldOffset(0)]
public AsnOctetString address;
[FieldOffset(0)]
public uint counter;
[FieldOffset(0)]
public uint gauge;
[FieldOffset(0)]
public uint ticks;
[FieldOffset(0)]
public AsnOctetString arbitrary;
}
[StructLayout(LayoutKind.Sequential)]
public struct AsnAny
{
public byte asnType;
public AsnUnion asnValue;
}
[StructLayout(LayoutKind.Sequential)]
public struct SnmpVarBind
{
public AsnObjectIdentifier name;
public AsnAny value;
}
[StructLayout(LayoutKind.Sequential)]
public struct SnmpVarBindList
{
public IntPtr list;
public uint len;
}
有什么想法吗?我可以输入你想要/需要的代码。
我知道这个答案已经很晚了,但我最近遇到了SNMP API的封送处理问题。我曾假设这些结构是在字节边界上封装的,但这是错误的。如果您查看Snmp.h
,您将看到#include <pshpack4.h>
,它打开了4字节边界上的打包。这意味着场偏移不同。这就是我的AsnAny
的样子:
[StructLayout(LayoutKind.Explicit)]
private struct AsnAny
{
[FieldOffset(0)]
public readonly byte Type;
[FieldOffset(4)]
public readonly Int32 Number;
[FieldOffset(4)]
public readonly UInt32 Unsigned32;
[FieldOffset(4)]
public readonly UInt64 Counter64;
[FieldOffset(4)]
public readonly AsnOctetString String;
[FieldOffset(4)]
public readonly AsnOctetString Bits;
[FieldOffset(4)]
public readonly AsnObjectIdentifier Object;
[FieldOffset(4)]
public readonly AsnOctetString Sequence;
[FieldOffset(4)]
public readonly AsnOctetString IPAddress;
[FieldOffset(4)]
public readonly UInt32 Counter32;
[FieldOffset(4)]
public readonly UInt32 Gauge32;
[FieldOffset(4)]
public readonly UInt32 Ticks;
[FieldOffset(4)]
public readonly AsnOctetString Arbitrary;
}