源代碼如下:
package main
import (
"fmt"
"net"
"github.com/cdevr/WapSNMP"
//"time"
)
type Trap struct{
Address string
Version int16
Community string
GeneralTrap int16
SpeicalTrap int16
EnterpriseId string
Values map[string]interface{}
}
func ParseUdp(data []byte) (Trap,error){
trap := Trap{}
seq,err := wapsnmp.DecodeSequence(data)
if err !=nil{
fmt.Println(err)
return trap,err
}
var community string
snmpVer := seq[1].(int64)
if snmpVer<=1{
snmpVer++
}
trap.Version = int16(snmpVer)
if snmpVer <3{
community = seq[2].(string)
}
trap.Community = community
var vrsp []interface{}
switch seq[3].(type){
case wapsnmp.UnsupportedBerType:
vrsp,_ = wapsnmp.DecodeSequence(seq[3].(wapsnmp.UnsupportedBerType))
default:
vrsp = seq[3].([]interface{})
}
var varbinds []interface{}
if snmpVer==1{
trap.GeneralTrap = int16(vrsp[3].(int64))
trap.SpeicalTrap = int16(vrsp[4].(int64))
trap.EnterpriseId = vrsp[1].(wapsnmp.Oid).String()
trap.Address = vrsp[2].(net.IP).String()
varbinds = vrsp[6].([]interface{})
}else{
varbinds = vrsp[4].([]interface{})
}
trap.Values = make(map[string]interface{},len(varbinds))
for i:=1;i<len(varbinds);i++ {
varoid:= varbinds[i].([]interface{})[1].(wapsnmp.Oid)
result := varbinds[i].([]interface{})[2]
trap.Values[varoid.String()] = result
}
return trap,nil
}
func main() {
fmt.Println("hello SnmpTrap!!")
socket,err := net.ListenUDP("udp4",&net.UDPAddr{
IP:net.IPv4(192,100,10,22),
Port:162,
})
if err !=nil{
panic(err)
}
defer socket.Close()
fmt.Println("++++++++++++++++++++++++")
for{
fmt.Println("++++++++++++++++++++++++")
buf := make([]byte,2048)
read,from,_:= socket.ReadFromUDP(buf[:])
fmt.Println("Get msg from ",from.IP)
go HandleUdp(buf[:read])
}
}
func HandleUdp(data []byte){
trap,err := ParseUdp(data)
if err !=nil{
fmt.Println("Err",err.Error())
}
fmt.Println(trap.Version,trap.Community,trap.EnterpriseId,trap.Address)
for k,v :=range trap.Values{
fmt.Printf("%s = %s\n",k,v);
}
}
運行結果:
GOROOT=C:/Go
GOPATH=D:/godata_zhaoyu
"C:\Program Files (x86)\JetBrains\Gogland 163.10615.22\bin\runnerw.exe" C:/Go\bin\go.exe build -o "C:\Users\admin\AppData\Local\Temp\Build test1.go and rungo" D:/godata_zhaoyu/test/test1.go
"C:\Program Files (x86)\JetBrains\Gogland 163.10615.22\bin\runnerw.exe" "C:\Users\admin\AppData\Local\Temp\Build test1.go and rungo"
hello SnmpTrap!!
++++++++++++++++++++++++
++++++++++++++++++++++++
我想通過snmptrap來接收交換機發出的告警資訊,有兩個問題想請教:
1.程式阻塞了,是因為socket在等待162埠有資料寫入嗎?怎樣才能讓162埠有資料寫入?
2.這段程式是snmptrap接收程式,是利用upd回圈接收交換機發出的告警資訊,但是程式中并沒有入參來設定oid,請問這是怎么回事,我應該怎樣來設定要采集資訊的oid
謝謝各位大神
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/121902.html
標籤:交換及路由技術
上一篇:求指點MPTCP中的DSN問題
