1 Star 1 Fork 0

李爽/go-utils

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
net.go 2.47 KB
一键复制 编辑 原始数据 按行查看 历史
package utils
import (
"fmt"
"net"
"net/url"
"strconv"
"time"
)
// IsValidIP 检测IP地址是否合法
func IsValidIP(ipAddr string) bool {
return net.ParseIP(ipAddr) != nil
}
// IsValidPort 检测端口是否合法
func IsValidPort(port string) (int, error) {
p, err := strconv.Atoi(port)
if err != nil {
return 0, fmt.Errorf("port conversion error: %v", err)
}
if p < 1 || p > 65535 {
return 0, fmt.Errorf("port number out of range: %d", p)
}
return p, nil
}
// IsValidURL 检测给定字符串是否是一个合法的URL。
func IsValidURL(u string) bool {
// 尝试解析URL
parsed, err := url.ParseRequestURI(u)
if err != nil {
return false // 解析失败意味着这不是一个合法的URL
}
// 判断解析后的URL是否包含Host字段,常用来判断URL是否合法
return parsed.Scheme != "" && parsed.Host != ""
}
// Ping 对目的地址发起ping检测icmp是否通畅(只支持ipv4)
func Ping(ipAddr string, timeout time.Duration) bool {
conn, err := net.DialTimeout("ip4:icmp", ipAddr, timeout)
if err != nil {
return false
}
_ = conn.Close()
return true
}
// DetectTcpPort
// 检测Tcp端口是否开通
func DetectTcpPort(ip string, port int, timeout time.Duration) bool {
address := fmt.Sprintf("%s:%d", ip, port)
conn, err := net.DialTimeout("tcp", address, timeout)
if err != nil {
return false
}
// 建立后关闭连接
defer func(conn net.Conn) {
_ = conn.Close()
}(conn)
return true
}
// DetectUdpPort
// 检测Udp端口是否开通
func DetectUdpPort(ip string, port int, timeout time.Duration) bool {
// 构建UDP地址
addr := fmt.Sprintf("%s:%d", ip, port)
// 构建UDP地址
udpAddr, err := net.ResolveUDPAddr("udp", addr)
if err != nil {
fmt.Println("地址解析错误:", err)
return false
}
// 创建UDP连接
conn, err := net.DialUDP("udp", nil, udpAddr)
if err != nil {
fmt.Println("连接错误:", err)
return false
}
defer func(conn *net.UDPConn) {
_ = conn.Close()
}(conn)
// 发送UDP数据包
_, err = conn.Write([]byte("Hello UDP"))
if err != nil {
fmt.Println("发送数据失败:", err)
return false
}
// 设置读取超时时间
err = conn.SetReadDeadline(time.Now().Add(timeout))
if err != nil {
fmt.Println("设置超时错误:", err)
return false
}
// 尝试读取响应
buffer := make([]byte, 1024)
_, err = conn.Read(buffer)
if err != nil {
fmt.Printf("没有收到响应, UDP端口 %d 可能未开放或不响应: %v\n", port, err)
return false
}
return true
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/love_bass/go-utils.git
git@gitee.com:love_bass/go-utils.git
love_bass
go-utils
go-utils
v0.1.3

搜索帮助

23e8dbc6 1850385 7e0993f3 1850385