如何监听 ICMP 数据包?
How to listen for ICMP packets?
我正在开发一个由两部分组成的应用程序,其中一侧发送 ICMP 数据包,另一侧侦听 ICMP 数据包并在收到它们时采取行动。问题是,我不确定如何让侦听器无限期地保持活动状态(只是希望它坐在一个循环中,只在收到数据包时才采取行动)。
目前,我可以使用 go-fastping 库并且可以发送和接收数据包,如果它是双向通信(我发送它,他们响应,我处理远程响应)。问题是如何使它不对称?
我对听众的尝试是:
for {
conn, err := icmp.ListenPacket("ip4:icmp", "192.168.1.8")
if err != nil {
fmt.Println(err)
}
}
但这不起作用。我的逻辑是,我想要一个 while true
循环来保持侦听器处于活动状态(在本例中是 for {
),然后我使用 ICMP ListenPacket
侦听新数据包,但我不这样做使用这种方法似乎可以得到任何东西。
任何想法或帮助将不胜感激。预先感谢您的时间和帮助。
icmp.ListenPacket()
创建一个 *icmp.PacketConn
- 换句话说就是一个监听器。您正在无限循环中创建侦听器!因为你甚至没有关闭它们,你的程序将开始抱怨 too many open files
比你说 "ping".
更快
这是一个工作侦听器的示例
package main
import (
"golang.org/x/net/icmp"
"log"
)
func main() {
conn, err := icmp.ListenPacket("ip4:icmp", "192.168.0.12")
if err != nil {
log.Fatal(err)
}
for {
var msg []byte
length, sourceIP, err := conn.ReadFrom(msg)
if err != nil {
log.Println(err)
continue
}
log.Printf("message = '%s', length = %d, source-ip = %s", string(msg), length, sourceIP)
}
_ = conn.Close()
}
这会产生:
2015/10/26 10:35:00 message = '', length = 0, source-ip = 192.168.0.7
2015/10/26 10:35:00 message = '', length = 0, source-ip = 192.168.0.25
2015/10/26 10:35:01 message = '', length = 0, source-ip = 192.168.0.7
2015/10/26 10:35:01 message = '', length = 0, source-ip = 192.168.0.25
2015/10/26 10:35:02 message = '', length = 0, source-ip = 192.168.0.7
2015/10/26 10:35:02 message = '', length = 0, source-ip = 192.168.0.25
我同时从 2 台主机 ping 主机。
如果需要,您可以选择丢弃传入消息和其他 return 值。
我正在开发一个由两部分组成的应用程序,其中一侧发送 ICMP 数据包,另一侧侦听 ICMP 数据包并在收到它们时采取行动。问题是,我不确定如何让侦听器无限期地保持活动状态(只是希望它坐在一个循环中,只在收到数据包时才采取行动)。
目前,我可以使用 go-fastping 库并且可以发送和接收数据包,如果它是双向通信(我发送它,他们响应,我处理远程响应)。问题是如何使它不对称?
我对听众的尝试是:
for {
conn, err := icmp.ListenPacket("ip4:icmp", "192.168.1.8")
if err != nil {
fmt.Println(err)
}
}
但这不起作用。我的逻辑是,我想要一个 while true
循环来保持侦听器处于活动状态(在本例中是 for {
),然后我使用 ICMP ListenPacket
侦听新数据包,但我不这样做使用这种方法似乎可以得到任何东西。
任何想法或帮助将不胜感激。预先感谢您的时间和帮助。
icmp.ListenPacket()
创建一个 *icmp.PacketConn
- 换句话说就是一个监听器。您正在无限循环中创建侦听器!因为你甚至没有关闭它们,你的程序将开始抱怨 too many open files
比你说 "ping".
这是一个工作侦听器的示例
package main
import (
"golang.org/x/net/icmp"
"log"
)
func main() {
conn, err := icmp.ListenPacket("ip4:icmp", "192.168.0.12")
if err != nil {
log.Fatal(err)
}
for {
var msg []byte
length, sourceIP, err := conn.ReadFrom(msg)
if err != nil {
log.Println(err)
continue
}
log.Printf("message = '%s', length = %d, source-ip = %s", string(msg), length, sourceIP)
}
_ = conn.Close()
}
这会产生:
2015/10/26 10:35:00 message = '', length = 0, source-ip = 192.168.0.7
2015/10/26 10:35:00 message = '', length = 0, source-ip = 192.168.0.25
2015/10/26 10:35:01 message = '', length = 0, source-ip = 192.168.0.7
2015/10/26 10:35:01 message = '', length = 0, source-ip = 192.168.0.25
2015/10/26 10:35:02 message = '', length = 0, source-ip = 192.168.0.7
2015/10/26 10:35:02 message = '', length = 0, source-ip = 192.168.0.25
我同时从 2 台主机 ping 主机。
如果需要,您可以选择丢弃传入消息和其他 return 值。