golang 常用端口函数封装

157 阅读1分钟

golang目前写命令行项目,直接可以编译为二进制文件,已经成为绝对的大杀器,目前项目中有一些端口操作的功能,我整理了以下函数,这些均为自己封装的基础函数,实际项目中已应用,可以放心使用

//GeneratePort 生成一个可用端口
func GeneratePort() (int, error) {
	addr, err := net.ResolveTCPAddr("tcp", "localhost:0")
	if err != nil {
		return 0, err
	}

	l, err := net.ListenTCP("tcp", addr)
	if err != nil {
		return 0, err
	}
	defer l.Close()
	return l.Addr().(*net.TCPAddr).Port, nil
}

// PortInUse 检测端口是否在使用中
func PortInUse(port int, hostname string) bool {
	return ScanPort("tcp", hostname, port)
}

// PortLocalInUse 检测本地端口是否在使用中
func PortLocalInUse(port int) bool {
	return ScanPort("tcp", "127.0.0.1", port)
}

// ScanPort 扫描端口
func ScanPort(protocol string, hostname string, port int) bool {
	fmt.Printf("scanning port %d \n", port)
	p := strconv.Itoa(port)
	addr := net.JoinHostPort(hostname, p)
	conn, err := net.DialTimeout(protocol, addr, 3*time.Second)

	if err != nil {
		return false
	}
	fmt.Printf("scanning port %v \n", conn)
	defer conn.Close()
	return true
}