如何在 C# 中订阅 snmpclient(打印机)
How to subscribe for the snmpclient (printer) in C#
实际上我有一个示例 SNMP 陷阱接收器代码。但它就像一个 UDP 套接字已建立并侦听陷阱。我正在通过在 exe 的帮助下生成陷阱来手动测试代码。但是现在我必须订阅我需要从中接收陷阱的 snmp 客户端(打印机)。
谁能帮我写一个订阅代码来从侦听器代码订阅打印机。
snmptraplistener 代码:
class Program {
static void Main(string[] args) {
// Construct a socket and bind it to the trap manager port 162
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 162);
EndPoint ep = (EndPoint)ipep;
socket.Bind(ep);
// Disable timeout processing. Just block until packet is received
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 0);
bool run = true;
int inlen = -1;
while (run) {
byte[] indata = new byte[16 * 1024];
// 16KB receive buffer int inlen = 0;
IPEndPoint peer = new IPEndPoint(IPAddress.Any, 0);
EndPoint inep = (EndPoint)peer;
try {
inlen = socket.ReceiveFrom(indata, ref inep);
}
catch( Exception ex ) {
Console.WriteLine("Exception {0}", ex.Message);
inlen = -1;
}
if (inlen > 0) {
// Check protocol version int
int ver = SnmpPacket.GetProtocolVersion(indata, inlen);
if (ver == (int)SnmpVersion.Ver1) {
// Parse SNMP Version 1 TRAP packet
SnmpV1TrapPacket pkt = new SnmpV1TrapPacket();
pkt.decode(indata, inlen);
Console.WriteLine("** SNMP Version 1 TRAP received from {0}:", inep.ToString());
Console.WriteLine("*** Trap generic: {0}", pkt.Pdu.Generic);
Console.WriteLine("*** Trap specific: {0}", pkt.Pdu.Specific);
Console.WriteLine("*** Agent address: {0}", pkt.Pdu.AgentAddress.ToString());
Console.WriteLine("*** Timestamp: {0}", pkt.Pdu.TimeStamp.ToString());
Console.WriteLine("*** VarBind count: {0}", pkt.Pdu.VbList.Count);
Console.WriteLine("*** VarBind content:");
foreach (Vb v in pkt.Pdu.VbList) {
Console.WriteLine("**** {0} {1}: {2}", v.Oid.ToString(), SnmpConstants.GetTypeName(v.Value.Type), v.Value.ToString());
}
Console.WriteLine("** End of SNMP Version 1 TRAP data.");
} else {
// Parse SNMP Version 2 TRAP packet
SnmpV2Packet pkt = new SnmpV2Packet();
pkt.decode(indata, inlen);
Console.WriteLine("** SNMP Version 2 TRAP received from {0}:", inep.ToString());
if ((SnmpSharpNet.PduType)pkt.Pdu.Type != PduType.V2Trap) {
Console.WriteLine("*** NOT an SNMPv2 trap ****");
} else {
Console.WriteLine("*** Community: {0}", pkt.Community.ToString());
Console.WriteLine("*** VarBind count: {0}", pkt.Pdu.VbList.Count);
Console.WriteLine("*** VarBind content:");
foreach (Vb v in pkt.Pdu.VbList) {
Console.WriteLine("**** {0} {1}: {2}",
v.Oid.ToString(), SnmpConstants.GetTypeName(v.Value.Type), v.Value.ToString());
}
Console.WriteLine("** End of SNMP Version 2 TRAP data.");
}
}
} else {
if (inlen == 0)
Console.WriteLine("Zero length packet received.");
}
}
}
}
}
一般来说,你问的不是编程问题,因为你的trap listener只能监听UDP/SNMP 162端口的数据包,无法订阅任何东西
打印机管理员有责任在该打印机上配置 SNMP 代理以向您的侦听器发送陷阱 (IP/port)。
实际上我有一个示例 SNMP 陷阱接收器代码。但它就像一个 UDP 套接字已建立并侦听陷阱。我正在通过在 exe 的帮助下生成陷阱来手动测试代码。但是现在我必须订阅我需要从中接收陷阱的 snmp 客户端(打印机)。 谁能帮我写一个订阅代码来从侦听器代码订阅打印机。
snmptraplistener 代码:
class Program {
static void Main(string[] args) {
// Construct a socket and bind it to the trap manager port 162
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 162);
EndPoint ep = (EndPoint)ipep;
socket.Bind(ep);
// Disable timeout processing. Just block until packet is received
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 0);
bool run = true;
int inlen = -1;
while (run) {
byte[] indata = new byte[16 * 1024];
// 16KB receive buffer int inlen = 0;
IPEndPoint peer = new IPEndPoint(IPAddress.Any, 0);
EndPoint inep = (EndPoint)peer;
try {
inlen = socket.ReceiveFrom(indata, ref inep);
}
catch( Exception ex ) {
Console.WriteLine("Exception {0}", ex.Message);
inlen = -1;
}
if (inlen > 0) {
// Check protocol version int
int ver = SnmpPacket.GetProtocolVersion(indata, inlen);
if (ver == (int)SnmpVersion.Ver1) {
// Parse SNMP Version 1 TRAP packet
SnmpV1TrapPacket pkt = new SnmpV1TrapPacket();
pkt.decode(indata, inlen);
Console.WriteLine("** SNMP Version 1 TRAP received from {0}:", inep.ToString());
Console.WriteLine("*** Trap generic: {0}", pkt.Pdu.Generic);
Console.WriteLine("*** Trap specific: {0}", pkt.Pdu.Specific);
Console.WriteLine("*** Agent address: {0}", pkt.Pdu.AgentAddress.ToString());
Console.WriteLine("*** Timestamp: {0}", pkt.Pdu.TimeStamp.ToString());
Console.WriteLine("*** VarBind count: {0}", pkt.Pdu.VbList.Count);
Console.WriteLine("*** VarBind content:");
foreach (Vb v in pkt.Pdu.VbList) {
Console.WriteLine("**** {0} {1}: {2}", v.Oid.ToString(), SnmpConstants.GetTypeName(v.Value.Type), v.Value.ToString());
}
Console.WriteLine("** End of SNMP Version 1 TRAP data.");
} else {
// Parse SNMP Version 2 TRAP packet
SnmpV2Packet pkt = new SnmpV2Packet();
pkt.decode(indata, inlen);
Console.WriteLine("** SNMP Version 2 TRAP received from {0}:", inep.ToString());
if ((SnmpSharpNet.PduType)pkt.Pdu.Type != PduType.V2Trap) {
Console.WriteLine("*** NOT an SNMPv2 trap ****");
} else {
Console.WriteLine("*** Community: {0}", pkt.Community.ToString());
Console.WriteLine("*** VarBind count: {0}", pkt.Pdu.VbList.Count);
Console.WriteLine("*** VarBind content:");
foreach (Vb v in pkt.Pdu.VbList) {
Console.WriteLine("**** {0} {1}: {2}",
v.Oid.ToString(), SnmpConstants.GetTypeName(v.Value.Type), v.Value.ToString());
}
Console.WriteLine("** End of SNMP Version 2 TRAP data.");
}
}
} else {
if (inlen == 0)
Console.WriteLine("Zero length packet received.");
}
}
}
}
}
一般来说,你问的不是编程问题,因为你的trap listener只能监听UDP/SNMP 162端口的数据包,无法订阅任何东西
打印机管理员有责任在该打印机上配置 SNMP 代理以向您的侦听器发送陷阱 (IP/port)。