golang检测ip,port

成功的失败者 · · 3689 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

package main

import (
    "fmt"
    "net"
    "os/exec"
    "strconv"
    "strings"
)

func main() {

    err := CheckPorts("3306")
    if err != nil {
        fmt.Println("端口已存在")
    } else {
        fmt.Println("端口不存在")
    }
    // GetLocalIps()
}

//获取本机ip
func GetLocalIp() string {
    addrs, err := net.InterfaceAddrs()
    if err != nil {
        fmt.Println("get local ip failed")
    }
    for _, address := range addrs {
        if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
            if ipnet.IP.To4() != nil {
                return ipnet.IP.String()
            }
        }
    }
    return ""
}

//获取本机ip
func GetLocalIps() {
    interface_list, err := net.Interfaces()
    if err != nil {
        fmt.Println(err)
        return
    }
    var byName *net.Interface
    var addrList []net.Addr
    var oneAddrs []string
    for _, i := range interface_list {
        byName, err = net.InterfaceByName(i.Name)
        if err != nil {
            fmt.Println(err)
            return
        }
        addrList, err = byName.Addrs()
        if err != nil {
            fmt.Println(err)
            return
        }
        for _, oneAddr := range addrList {
            oneAddrs = strings.SplitN(oneAddr.String(), "/", 2)
            fmt.Println(i.Name, "-", oneAddrs[0])
        }
    }
}

func CheckPort(port int) error {
    checkStatement := fmt.Sprintf(`netstat -anp | grep -q %d ; echo $?`, port)
    output, err := exec.Command("sh", "-c", checkStatement).CombinedOutput()
    if err != nil {
        return err
    }
    fmt.Println(string(output))
    // log.Println(output, string(output)) ==> [48 10] 0 或 [49 10] 1
    result, err := strconv.Atoi(strings.TrimSuffix(string(output), "\n"))
    if err != nil {
        return err
    }
    if result == 0 {
        return fmt.Errorf("端口%d已被占用", port)
    }
    return nil
}

func CheckPorts(port string) error {
    var err error

    tcpAddress, err := net.ResolveTCPAddr("tcp4", ":"+port)
    if err != nil {
        return err
    }
    listener, err := net.ListenTCP("tcp", tcpAddress)
    if err != nil {
        return err
    } else {
        listener.Close()
    }

    return nil
}

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:成功的失败者

查看原文:golang检测ip,port

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3689 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传