我使用它来接收SNMP陷阱:https://github.com/soniah/gosnmp 现在,让我们说我想以编程方式突破(取自here):
错误:= tl.Listen(" 0.0.0.0:9162")
我最好的方法是什么?
我对Golang有些新鲜,并没有找到一种方法来摆脱我无法修改的goroutine("第三方")。
谢谢,
答案 0 :(得分:5)
简短回答:你不能。没有办法从goroutine外部杀死goroutine(没有杀死整个程序)。
答案很长:goroutine可以听某种"终止"信号(通过通道,信号或任何其他机制)。但最终,goroutine必须从中终止。
查看示例中的库,似乎未提供此功能。
答案 1 :(得分:1)
标准https://golang.org/pkg/net/#Conn界面提供了特殊方法SetDeadline
(与SetReadDeadline
和SetWriteDeadline
一起),以便为已建立连接设置硬连接中断时间。正如我在source代码中看到的那样:
type GoSNMP struct {
// Conn is net connection to use, typically established using GoSNMP.Connect()
Conn net.Conn
...
// Timeout is the timeout for the SNMP Query
Timeout time.Duration
...
net.Conn
界面已导出 - 因此您可以尝试直接访问该界面以设置截止日期。
type TrapListener struct {
OnNewTrap func(s *SnmpPacket, u *net.UDPAddr)
Params *GoSNMP
...
}
依次导出TrapListener
导出GoSNMP
结构,以便您可以访问它。试试这个:
tl := TrapListener{...}
tl.Params.Conn.SetDeadline(time.Now().Add(1*time.Second))
tl.Listen(...)
然而this line让我感到不安 - 看起来它没有使用存储连接及其选项:
func (t *TrapListener) Listen(addr string) (err error) {
...
conn, err := net.ListenUDP("udp", udpAddr)
....
}
但你可以尝试:)