gpt4 book ai didi

c# - 使用 .net C# 在 SNMP 项目上编码错误

转载 作者:太空宇宙 更新时间:2023-11-04 14:02:36 24 4
gpt4 key购买 nike

我必须构建一个 SNMP 项目来与各种设备进行通信。遗憾的是,除了用于 SNMP 的 Windows dll(mgmtapi.dll、snmpapi.dll、wsnmp32.dll)之外,我不能使用任何库。我已经为那些库和这些库的功能所需的所有结构制作了包装器,但是在循环之后:

  • SnmpMgrOpen(初始化并获取 session )。
  • 创建 SnmpVarBindList(使用 SnmpMgrStrToOid、SnmpUtilMemAlloc 和其他编码)以创建 GET 请求。
  • SnmpMgrRequest 发出请求并填充 SnmpVarBindList 结构。
  • SnmpMgrClose 关闭 session 。

当我想使用

查看 SnmpVarBindList 中的 SnmpVarBind 中的内容时

Marshal.PtrToStringAnsi(varBind.value.asnValue.text.stream, (int)varBind.value.asnValue.text.length + 1)

我收到错误:试图读取或写入 protected 内存。这通常表明其他内存已损坏。

从头文件 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;
}

关于c# - 使用 .net C# 在 SNMP 项目上编码错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18542518/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com