sockets - 如何监听 ICMP 数据包?

标签 sockets go network-programming listener icmp

我正在开发一个由两部分组成的应用程序,其中一侧发送 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 - 换句话说,一个监听器。您正在无限循环中创建监听器!由于您甚至没有关闭它们,您的程序将开始提示 打开的文件太多 比您说“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 主机。

如果需要,您可以选择丢弃传入的消息和其他返回值。

关于sockets - 如何监听 ICMP 数据包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33345683/

相关文章:

c - Winsock连接测试

java - 我没有从服务器 Android Java 获取 udp 包

python - 从 Django webapp 安全地执行 Go 脚本

routes - CISCO E2500固件修改

sockets - 使用 Socket Test 3.0 软件的 TCP/IP

java - Netty 服务器到服务器的数据流

caching - Golang 多模板缓存

go - 在 golang 中清除 bytes.Buffer 的正确方法是什么?

linux - make 命令在 NS 2.35 中不起作用

c - 带有指针成员的recv数据包