| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- package utils
- import (
- "encoding/csv"
- "log"
- "net"
- "os"
- "sort"
- "strconv"
- "time"
- )
- var (
- MaxDelay = 9999 * time.Millisecond
- MinDelay = time.Duration(0)
- InputMaxDelay = MaxDelay
- InputMinDelay = MinDelay
- )
- type PingData struct {
- IP net.IPAddr
- Sended int
- Received int
- Delay time.Duration
- }
- type CloudflareIPData struct {
- *PingData
- recvRate float32
- downloadSpeed float32
- }
- func (cf *CloudflareIPData) getRecvRate() float32 {
- if cf.recvRate == 0 {
- pingLost := cf.Sended - cf.Received
- cf.recvRate = float32(pingLost) / float32(cf.Sended)
- }
- return cf.recvRate
- }
- func (cf *CloudflareIPData) toString() []string {
- result := make([]string, 6)
- result[0] = cf.IP.String()
- result[1] = strconv.Itoa(cf.Sended)
- result[2] = strconv.Itoa(cf.Received)
- result[3] = strconv.FormatFloat(float64(cf.getRecvRate()), 'f', 2, 32)
- result[4] = cf.Delay.String()
- result[5] = strconv.FormatFloat(float64(cf.downloadSpeed)/1024/1024, 'f', 2, 32)
- return result
- }
- func ExportCsv(filePath string, data []CloudflareIPData) {
- fp, err := os.Create(filePath)
- if err != nil {
- log.Fatalf("创建文件[%s]失败:%v", filePath, err)
- return
- }
- defer fp.Close()
- w := csv.NewWriter(fp) //创建一个新的写入文件流
- w.Write([]string{"IP 地址", "已发送", "已接收", "丢包率", "平均延迟", "下载速度 (MB/s)"})
- w.WriteAll(convertToString(data))
- w.Flush()
- }
- func convertToString(data []CloudflareIPData) [][]string {
- result := make([][]string, 0)
- for _, v := range data {
- result = append(result, v.toString())
- }
- return result
- }
- type PingDelaySet []CloudflareIPData
- func (s PingDelaySet) FilterDelay() (data PingDelaySet) {
- sort.Sort(s)
- if InputMaxDelay >= MaxDelay || InputMinDelay <= MinDelay {
- return s
- }
- for _, v := range s {
- if v.Delay > MaxDelay { // 平均延迟上限
- break
- }
- if v.Delay <= MinDelay { // 平均延迟下限
- continue
- }
- data = append(data, v) // 延迟满足条件时,添加到新数组中
- }
- return
- }
- func (s PingDelaySet) Len() int {
- return len(s)
- }
- func (s PingDelaySet) Less(i, j int) bool {
- iRate, jRate := s[i].getRecvRate(), s[j].getRecvRate()
- if iRate != jRate {
- return iRate < jRate
- }
- return s[i].Delay < s[j].Delay
- }
- func (s PingDelaySet) Swap(i, j int) {
- s[i], s[j] = s[j], s[i]
- }
- // 下载速度排序
- type DownloadSpeedSet []CloudflareIPData
- func (s DownloadSpeedSet) Len() int {
- return len(s)
- }
- func (s DownloadSpeedSet) Less(i, j int) bool {
- return s[i].downloadSpeed > s[j].downloadSpeed
- }
- func (s DownloadSpeedSet) Swap(i, j int) {
- s[i], s[j] = s[j], s[i]
- }
|