如何使用Go获取客户端DNS IP

时间:2018-08-13 09:50:46

标签: go dns

我想要使用Go获取客户端缓存DNS IP

看看我在下面尝试过的代码

import (
    "fmt"
    "net"
)

func main() {
    // Usually DNS Server using 53 port number
    // This case, TCP protocol is not considered
    port := ":53"
    protocol := "udp"

    var buf [2048]byte

    //Build the address
    udpAddr, err := net.ResolveUDPAddr(protocol, port)
    if err != nil {
        fmt.Println("Wrong Address")
        return
    }

    fmt.Println("Listened " + protocol + " from " + udpAddr.String())

    //Create the connection
    udpConn, err := net.ListenUDP(protocol, udpAddr)
    if err != nil {
        fmt.Println(err)
    }

    // Listening 53 Port Like DNS Server
    for {

        // If get request,
        _, err := udpConn.Read(buf[0:])
        if err != nil {
            fmt.Println("Error Reading")
            return
        } else {
            // Print Remote Address,
            // I Guess this is the Client Cache DNS IP, but this is print <nil>
            fmt.Println(udpConn.RemoteAddr())
        }
    }
}

在这种情况下,如何获得客户端缓存DNS IP?请帮我 我想建立客户端DNS IP收集器,好像哇

我也将此称为https://github.com/miekg/exdns/blob/master/reflect/reflect.go 但这不是我的答案

我想要简单的服务器

1 个答案:

答案 0 :(得分:1)

UDP是无状态的。没有用于连接的单个客户端地址。每个数据包都可以从不同的地址发送,因此RemoteAddr仅对客户端有用,对服务器不有用。

使用*UDPConn.ReadFrom*UDPConn.ReadFromUDP*UDPConn.ReadMsgUDP之一代替Read。它们全部返回读取数据包的客户端地址。