使用 .net C# 在 SNMP 项目上编组错误
Posted
技术标签:
【中文标题】使用 .net C# 在 SNMP 项目上编组错误【英文标题】:Marshalling error on SNMP project with .net C# 【发布时间】:2013-08-30 22:46:02 【问题描述】:我必须构建一个 SNMP 项目来与各种设备进行通信。遗憾的是,除了用于 SNMP 的 windows dll(mgmtapi.dll、snmpapi.dll、wsnmp32.dll)之外,我不能使用任何库。我已经为这些库以及这些库的功能所需的所有结构制作了包装器,但是在循环之后:
SnmpMgrOpen(用于初始化和获取会话)。 创建 SnmpVarBindList(使用 SnmpMgrStrToOid、SnmpUtilMemAlloc 和其他编组)以创建 GET 请求。 SnmpMgrRequest 发出请求并填充 SnmpVarBindList 结构。 SnmpMgrClose 关闭会话。当我想使用
查看 SnmpVarBindList 中的 SnmpVarBind 中的内容时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;
有什么想法吗?我可以放你想要/需要的代码。
【问题讨论】:
【参考方案1】:我知道这个答案已经很晚了,但我最近遇到了 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;
【讨论】:
以上是关于使用 .net C# 在 SNMP 项目上编组错误的主要内容,如果未能解决你的问题,请参考以下文章