【问题标题】:golang check udp port opengolang 检查 udp 端口​​是否打开
【发布时间】:2020-06-27 09:40:08
【问题描述】:

如何检查特定的 UDP 端口是否在 golang 中打开?

到目前为止,我已经尝试了很多方法,但没有一个奏效。 准确地说,所有这些,只要告诉服务器是否响应,无论我输入什么端口。

方法一


func methodOne(ip string, ports []string) map[string]string {
    // check emqx 1883, 8083 port

    results := make(map[string]string)
    for _, port := range ports {
        address := net.JoinHostPort(ip, port)
        // 3 second timeout
        conn, err := net.DialTimeout("udp", address, 3*time.Second)
        if err != nil {
            results[port] = "failed"
            // todo log handler
        } else {
            if conn != nil {
                results[port] = "success"
                _ = conn.Close()
            } else {
                results[port] = "failed"
            }
        }
    }
    return results
}


方法二


func ping(host string, port string) error {
    address := net.JoinHostPort(host, port)
    conn, err := net.DialTimeout("udp", address, 1*time.Second)
    if conn != nil {
        fmt.Println(conn.LocalAddr())
        defer conn.Close()
    }
    return err
}


方法三

来自这个包:https://github.com/janosgyerik/portping


portping -c 3 -net udp 0.0.0.0.0 80

【问题讨论】:

  • UDP 是无连接的,这些方法都不起作用。如果端口是开放的,则由应用层来回答(或不回答)。如果它已关闭,您可能会返回 ICMP 错误。使用 UDP ping 可以做的最好的事情是进行大量假设并将某些事情视为成功。

标签: go networking udp


【解决方案1】:

你不能,除非你确定服务器会发回一些东西,然后你可以尝试捕捉响应。

查看此链接https://ops.tips/blog/udp-client-and-server-in-go/

【讨论】:

    【解决方案2】:

    由于 UDP 不提供“连接”之类的功能, 在我看来,检查远程 UDP 服务器是否正在运行的唯一方法是发送有意义的消息,服务器可以理解该消息并且需要对此进行“响应”。然后我们只需要等待服务器回复,如果有,服务器就可以了。

    再次,对于 UDP,我们必须进行多次发送,因为如果服务器关闭,它将不会收到数据包。

    按照所有这些逻辑,我实现了支持 UDP 和 TCP 库并按照上述方式工作的 GO 库/cli 实用程序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-18
      • 1970-01-01
      • 2012-08-03
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 2012-06-09
      相关资源
      最近更新 更多