代码之家  ›  专栏  ›  技术社区  ›  Jamie

当可以是net.udpaddr或net.tcpaddr时,如何从net.addr获取IP和端口

go
  •  2
  • Jamie  · 技术社区  · 6 年前

    我运行的是一个混合服务器,它在TCP和UDP上监听,需要获取本地端口、远程IP地址和远程端口。目前,我检查基础类型是net.udpaddr还是net.tcpaddr的方法如下:

    // BAD: but not sure a better way
    switch reflect.TypeOf(remoteAddr).String() {
    case "*net.UDPAddr":
        p.SrcIP = remoteAddr.(*net.UDPAddr).IP.String()
        p.SrcPort = uint(remoteAddr.(*net.UDPAddr).Port)
        p.DstPort = uint(localAddr.(*net.UDPAddr).Port)
    case "*net.TCPAddr":
        p.SrcIP = remoteAddr.(*net.TCPAddr).IP.String()
        p.SrcPort = uint(remoteAddr.(*net.TCPAddr).Port)
        p.DstPort = uint(localAddr.(*net.TCPAddr).Port)
    }
    

    我不是这方面的最大粉丝,如果有人有任何看起来更干净的解决方案,我会非常感激的。

    1 回复  |  直到 6 年前
        1
  •  4
  •   Jonathan Hall    6 年前

    不需要反射,只需执行适当的类型断言开关:

    switch addr := remoteAddr.(type) {
    case *net.UDPAddr:
        p.SrcIP = addr.IP.String()
        p.SrcPort = uint(addr.Port)
        p.DstPort = uint(localAddr.(*net.UDPAddr).Port)
    case *net.TCPAddr:
        p.SrcIP = addr.IP.String()
        p.SrcPort = uint(addr.Port)
        p.DstPort = uint(localAddr.(*net.TCPAddr).Port)
    }