GoPing

package module
v1.1.3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 22, 2024 License: Apache-2.0 Imports: 11 Imported by: 0

README

GoPing

介绍

使用go实现的ICMP检测模块

安装

go get gitee.com/liumou_site/GoPing

使用

单独ping
package main

import 	(
	"fmt"
    gp "gitee.com/liumou_site/GoPing"
)

func main()  {
	// 初始化一个Ping实例,用于对指定的域名进行ping操作
	// 参数"baidu.com"是目标域名,8是ping的次数,Data是ping的数据包内容
	ping, err := gp.New("baidu.com", 3)
	// 如果初始化过程中出现错误,则输出错误信息并终止程序
	if err != nil {
		fmt.Println(err)
		return
	}
	// 确保在函数返回前关闭ping实例,释放相关资源
	defer func(ping *gp.PingSet) {
		err := ping.Close()
		if err != nil {
			fmt.Println(err)
		}
	}(ping)
	// 执行ping操作,这里指定ping的次数为5
	err = ping.Ping(5)
	if err != nil {
		fmt.Println(err)
		return 
	}
	// 输出ping操作的总次数,这里查询的是次数6的ping操作次数
	fmt.Println(ping.PingCount(6))
}
并发ping
package main

import (
	gp "gitee.com/liumou_site/GoPing"
	"gitee.com/liumou_site/gns"
	"gitee.com/liumou_site/logger"
)

func main() {

	// 初始化一个IP子网
	// 获取本机使用的IP地址
	sub := gns.NewIp()
	ip, err := sub.GetUseIP()
	if err != nil {
		logger.Error(err)
		return
	}
	// 通过本机使用的IP地址 生成一个IP列表,用于后续的并发检测
	ips, _ := gns.IpGenerateList(gns.IpCutSubnet(ip), 1, 10)
	// 创建一个并发处理实例
	p := gp.NewConcurrency(ips)
	// 启动并发检测
	p.Start()
	// 遍历结果,输出每个IP的在线/离线状态
	for k, v := range p.Result {
		if v {
			logger.Info(k, " : 在线")
		} else {
			logger.Info(k, " : 离线")
		}
	}
	// 输出成功的数量、失败的数量以及总共处理的IP数量
	logger.Info("成功:", p.Success, " 失败:", p.Fail, " 总数:", p.Total)
}

测试效果

批量

Documentation

Index

Constants

This section is empty.

Variables

View Source
var Data = []byte("abcdefghijklmnopqrstuvwabcdefghi")

Data 是一个全球唯一的,长度为32的字节切片。 它用于存储预定义的字符序列,该序列由小写字母组成,不包含特殊字符或数字。 这个预定义的序列在程序中可能被用作标识符、加密种子或其他需要固定序列的场景。

Functions

func FilterIP

func FilterIP(ips []string) []string

FilterIP 过滤给定的IP地址列表,返回有效的IP地址数组。 该函数遍历每个输入的IP地址字符串,检查其是否为有效的IP地址。 如果是有效的IP地址,则将其添加到结果数组中;如果不是,则记录错误。 参数:

ips []string: 待检查的IP地址列表。

返回值:

[]string: 有效的IP地址列表。

func IsIP

func IsIP(ip string) bool

IsIP 检查给定的字符串是否为有效的IP地址。 它首先尝试将字符串解析为一个IPv4或IPv6地址。如果解析失败, 则尝试将字符串解析为一个主机名,并通过DNS查找验证该主机名是否存在。 参数:

ip - 待检查的字符串,可能是IP地址或主机名。

返回值:

如果字符串是有效的IP地址或可解析的主机名,则返回true;否则返回false。

func Lookup

func Lookup(host string) (string, error)

Lookup 根据给定的主机名查找对应的IP地址,并随机返回一个IP地址。 如果找不到对应的IP地址,则返回一个错误。

参数:

host - 需要查找IP地址的主机名。

返回值:

string - 随机选择的主机IP地址。
error - 如果查找失败,则返回错误信息。

func MarshalMsg

func MarshalMsg(req int, data []byte) ([]byte, error)

MarshalMsg 根据请求编号和数据生成ICMP回显请求消息。 req: 请求编号,用于标识特定的请求。 data: 需要包含在ICMP消息中的数据。 返回值: 编码后的ICMP消息字节流以及可能的错误。

Types

type Concurrency

type Concurrency struct {
	Addr   []string // 需要并发ping的地址清单
	Res    sync.Map // 结果
	Result map[string]bool
	Ch     chan string // 结果通道
	L      sync.Mutex  // 增加锁
	// 统计结果
	Total   int32 // 总数
	Success int32 // 成功
	Fail    int32 // 失败
	Err     error // 错误
}

Concurrency 创建并发结构

func NewConcurrency

func NewConcurrency(ips []string) *Concurrency

NewConcurrency 初始化并返回一个 Concurrency 实例,该实例用于并发地对多个IP地址进行ping操作。 ips: 待检查的IP地址列表。 返回值: 一个 Concurrency 实例,包含了IP地址列表、结果通道、等待组等用于并发操作的字段。

func (*Concurrency) Start

func (c *Concurrency) Start()

Start 启动并发任务来检测一组地址的连通性。 该方法首先为每个地址添加到等待组中,然后并发地执行ping操作,最后等待所有ping操作完成并处理结果。

type PingSet

type PingSet struct {
	Addr    string   // 地址指定要ping的目标主机或网络设备的IP地址或域名。
	Conn    net.Conn // Conn 保存了与目标主机建立的网络连接,用于发送和接收数据包。
	Data    []byte   // Data 包含了要发送的数据包内容,通常为"ICMP ECHO REQUEST"的数据部分。
	Timeout int      // Timeout 指定了操作的超时时间,以秒为单位,用于控制ping操作的最长等待时间。
	Req     int      // Req 表示要发送的ICMP ECHO REQUEST的数量,默认8
	Print   bool     // Print 是否打印ping明细信息,默认:true
}

PingSet 定义了一个用于网络ping操作的集合,包含所有必要的参数和状态。 它旨在支持自定义地址、数据包内容和超时设置的ping操作。

func New

func New(addr string, timeout int) (*PingSet, error)

New 执行ping操作。 它接受一个地址字符串,一个请求编号,和一串字节数据作为输入。 返回一个PingSet指针和一个错误值。 PingSet包含处理后的数据和最终确定的地址。

func (*PingSet) Close

func (pg *PingSet) Close() error

Close 释放PingSet对象所持有的网络连接资源。

该方法通过调用PingSet对象内部Conn字段的Close方法来实现资源的释放。 PingSet在使用完毕后,应该调用此方法来确保网络连接被正确关闭,避免资源泄露。

返回值:

该方法将Conn.Close()的返回值直接返回,因此调用者可以根据返回的error来判断关闭操作是否成功。

func (*PingSet) Dail

func (pg *PingSet) Dail() (err error)

Dail 方法用于建立到指定地址的ICMP连接。 它尝试通过IP协议族中的ICMP协议类型建立连接,如果失败,则返回错误。

参数:

pg *PingSet - 包含待连接地址信息的PingSet结构体指针。

返回值:

error - 如果建立连接过程中出现错误,则返回该错误;否则返回nil。

func (*PingSet) Ping

func (pg *PingSet) Ping(count int) error

Ping 方法用于向远程主机发送ping请求。 参数 count 指定发送ping请求的次数。

func (*PingSet) PingCount

func (pg *PingSet) PingCount(count int) (reply []Reply)

PingCount 发送指定数量的ping请求并收集回复。 参数count表示要发送的ping请求的数量。 返回值reply是一个包含所有ping请求回复的切片。

func (*PingSet) SetDeadline

func (pg *PingSet) SetDeadline() error

SetDeadline 为PingSet对象的连接设置超时 deadline。 参数timeout表示超时时间,单位为秒。 返回值为操作可能产生的错误。

type Reply

type Reply struct {
	Time  int64 // 时间戳表示回复的生成时间。
	TTL   uint8 // TTL 表示回复消息的生存时间,用于控制消息的有效性。
	Error error // Error 保存操作过程中可能发生的错误信息。
}

Reply 结构体用于封装回复信息。 它包含回复的时间戳、生存时间(TTL)和可能的错误信息。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL