亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > 利用Go語言實現簡單Ping過程的方法

利用Go語言實現簡單Ping過程的方法

熱門標簽:谷歌便利店地圖標注 騰訊外呼系統價格 ?兓? 電梯外呼訪客系統 最短的地圖標注 電銷機器人可以補救房產中介嗎 浙江人工智能外呼管理系統 百度地圖標注搜索關鍵詞 成都呼叫中心外呼系統平臺

一、準備工作

安裝最新的Go

1、由于Google被墻的原因,如果沒有VPN的話,就到這里下載:http://www.golangtc.com/download

2、使用任意文本編輯器,或者LiteIDE會比較方便編譯和調試

二、編碼

要用到的package:

import (
 "bytes"
 "container/list"
 "encoding/binary"
 "fmt"
 "net"
 "os"
 "time"
)

1、使用Golang提供的net包中的相關函數可以快速構造一個IP包并自定義其中一些關鍵參數,而不需要再自己手動填充IP報文。

2、使用encoding/binary包可以輕松獲取結構體struct的內存數據并且可以規定字節序(這里要用網絡字節序BigEndian),而不需要自己去轉換字節序。之前的一片文中使用boost,還要自己去實現轉換過程

3、使用container/list包,方便進行結果統計

4、使用time包實現耗時和超時處理

ICMP報文struct:

type ICMP struct {
 Type    uint8
 Code    uint8
 Checksum  uint16
 Identifier uint16
 SequenceNum uint16
}

Usage提示:

arg_num := len(os.Args)
 if arg_num  2 {
 fmt.Print(
  "Please runAs [super user] in [terminal].\n",
  "Usage:\n",
  "\tgoping url\n",
  "\texample: goping www.baidu.com",
 )
 time.Sleep(5e9)
 return
 }

注意這個ping程序,包括之前的ARP程序都必須使用系統最高權限執行,所以這里先給出提示,使用time.Sleep(5e9) ,暫停5秒,是為了使雙擊執行者看到提示,避免控制臺一閃而過。

關鍵net對象的創建和初始化:

var (
 icmp   ICMP
 laddr  = net.IPAddr{IP: net.ParseIP("0.0.0.0")}
 raddr, _ = net.ResolveIPAddr("ip", os.Args[1])
 )
 conn, err := net.DialIP("ip4:icmp", laddr, raddr)
 if err != nil {
 fmt.Println(err.Error())
 return
 }
 defer conn.Close()

net.DialIP表示生成一個IP報文,版本號是v4,協議是ICMP(這里字符串ip4:icmp會把IP報文的協議字段設為1表示ICMP協議),

源地址laddr可以是0.0.0.0也可以是自己的ip,這個并不影響ICMP的工作。

目的地址raddr是一個URL,這里使用Resolve進行DNS解析,注意返回值是一個指針,所以下面的DialIP方法中參數表示沒有取地址符。

這樣一個完整的IP報文就裝配好了,我們并沒有去操心IP中的其他一些字段,Go已經為我們處理好了。

通過返回的conn *net.IPConn對象可以進行后續操作。

defer conn.Close() 表示該函數將在Return時被執行,確保不會忘記關閉。

下面需要構造ICMP報文了:

icmp.Type = 8
 icmp.Code = 0
 icmp.Checksum = 0
 icmp.Identifier = 0
 icmp.SequenceNum = 0
 var buffer bytes.Buffer
 binary.Write(buffer, binary.BigEndian, icmp)
 icmp.Checksum = CheckSum(buffer.Bytes())
 buffer.Reset()
 binary.Write(buffer, binary.BigEndian, icmp)

仍然非常簡單,利用binary可以把一個結構體數據按照指定的字節序讀到緩沖區里面,計算校驗和后,再讀進去。

檢驗和算法參考上面給出的URL中的實現:

func CheckSum(data []byte) uint16 {
 var (
 sum  uint32
 length int = len(data)
 index int
 )
 for length > 1 {
 sum += uint32(data[index])8 + uint32(data[index+1])
 index += 2
 length -= 2
 }
 if length > 0 {
 sum += uint32(data[index])
 }
 sum += (sum >> 16)
 return uint16(^sum)
}

下面是Ping的Request過程,這里仿照Windows的ping,默認只進行4次:

fmt.Printf("\n正在 Ping %s 具有 0 字節的數據:\n", raddr.String())
 recv := make([]byte, 1024)
 statistic := list.New()
 sended_packets := 0
 for i := 4; i > 0; i-- {
 if _, err := conn.Write(buffer.Bytes()); err != nil {
  fmt.Println(err.Error())
  return
 }
 sended_packets++
 t_start := time.Now()
 conn.SetReadDeadline((time.Now().Add(time.Second * 5)))
 _, err := conn.Read(recv)
 if err != nil {
  fmt.Println("請求超時")
  continue
 }
 t_end := time.Now()
 dur := t_end.Sub(t_start).Nanoseconds() / 1e6
 fmt.Printf("來自 %s 的回復: 時間 = %dms\n", raddr.String(), dur)
 statistic.PushBack(dur)
 //for i := 0; i  recvsize; i++ {
 // if i%16 == 0 {
 // fmt.Println("")
 // }
 // fmt.Printf("%.2x ", recv[i])
 //}
 //fmt.Println("")
 }

"具有0字節的數據"表示ICMP報文中沒有數據字段,這和Windows里面32字節的數據的略有不同。

conn.Write方法執行之后也就發送了一條ICMP請求,同時進行計時和計次。

conn.SetReadDeadline可以在未收到數據的指定時間內停止Read等待,并返回錯誤err,然后判定請求超時。否則,收到回應后,計算來回所用時間,并放入一個list方便后續統計。

注釋部分內容是我在探索返回數據時的代碼,讀者可以試試看Read到的數據是哪個數據包的?

統計工作將在循環結束時進行,這里使用了defer其實是希望按了Ctrl+C之后能return執行,但是控制臺確實不給力,直接給殺掉了。。

defer func() {
 fmt.Println("")
 //信息統計
 var min, max, sum int64
 if statistic.Len() == 0 {
  min, max, sum = 0, 0, 0
 } else {
  min, max, sum = statistic.Front().Value.(int64), statistic.Front().Value.(int64), int64(0)
 }
 for v := statistic.Front(); v != nil; v = v.Next() {
  val := v.Value.(int64)
  switch {
  case val  min:
  min = val
  case val > max:
  max = val
  }
  sum = sum + val
 }
 recved, losted := statistic.Len(), sended_packets-statistic.Len()
 fmt.Printf("%s 的 Ping 統計信息:\n 數據包:已發送 = %d,已接收 = %d,丟失 = %d (%.1f%% 丟失),\n往返行程的估計時間(以毫秒為單位):\n 最短 = %dms,最長 = %dms,平均 = %.0fms\n",
  raddr.String(),
  sended_packets, recved, losted, float32(losted)/float32(sended_packets)*100,
  min, max, float32(sum)/float32(recved),
 )
 }()

統計過程注意類型的轉換和格式化就行了。

全部代碼就這些,執行結果大概是這個樣子的:

 

注意每次Ping后都沒有"休息",不像Windows或者Linux的會停頓幾秒再Ping下一輪。

總結

Golang實現整個Ping比我想象中的還要簡單很多,靜態編譯速度是十分快速,相比C而言,你需要更多得了解底層,甚至要從鏈路層開始,你需要寫更多更復雜的代碼來完成相同的工作,但究其根本,C語言仍然是鼻祖,功不可沒,很多原理和思想都要繼承和發展,這一點Golang做的很好。以上就是這篇文章的全部內容,希望對大家的學習或者工作帶來一定的幫助,如果有疑問大家可以留言交流。

您可能感興趣的文章:
  • golang并發ping主機的方法
  • 利用Python腳本實現ping百度和google的方法
  • python使用xmlrpclib模塊實現對百度google的ping功能
  • go實現fping功能

標簽:上海 七臺河 宜昌 邢臺 眉山 雅安 紹興 盤錦

巨人網絡通訊聲明:本文標題《利用Go語言實現簡單Ping過程的方法》,本文關鍵詞  利用,語言,實現,簡單,Ping,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《利用Go語言實現簡單Ping過程的方法》相關的同類信息!
  • 本頁收集關于利用Go語言實現簡單Ping過程的方法的相關信息資訊供網民參考!
  • 推薦文章
    国产91精品系列在线观看| 精品美女| 国产精品自拍在线观看| 精品久久久久久免费影院| 国产91丝袜在线播放0| 青青青草影院| 99久久精品国产麻豆| 九九免费高清在线观看视频| 九九久久99| 日韩在线观看视频网站| 国产综合91天堂亚洲国产| 91麻豆精品国产自产在线观看一区| 可以在线看黄的网站| 亚洲 国产精品 日韩| 亚欧成人毛片一区二区三区四区| 精品视频在线观看视频免费视频| 欧美电影免费看大全| 午夜激情视频在线播放| 日日日夜夜操| 黄色短视频网站| 成人av在线播放| 国产成+人+综合+亚洲不卡| 国产一区二区精品| 精品久久久久久中文字幕一区 | 成人影院久久久久久影院| 四虎影视久久| 欧美1区| 九九久久国产精品大片| 久久99这里只有精品国产| 久草免费资源| 国产视频久久久久| 天天做人人爱夜夜爽2020| 九九免费高清在线观看视频| 台湾毛片| 91麻豆精品国产高清在线| 国产视频在线免费观看| 精品国产一区二区三区久久久蜜臀| 日日夜夜婷婷| 国产伦精品一区二区三区无广告| 可以免费看毛片的网站| 国产成人精品影视| 成人a大片高清在线观看| 免费国产在线观看不卡| 国产视频在线免费观看| 日本特黄一级| 国产精品自拍亚洲| 国产不卡高清在线观看视频| 免费国产在线观看| 日韩男人天堂| 国产伦久视频免费观看视频| 免费国产一级特黄aa大片在线| 韩国三级一区| 精品视频在线看| 国产韩国精品一区二区三区| 精品国产一区二区三区国产馆| 成人影院一区二区三区| 99久久精品国产片| 九九久久国产精品| 99久久精品国产片| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 午夜家庭影院| 免费国产在线观看| 99热精品一区| 成人高清视频在线观看| 精品视频在线观看视频免费视频| 亚洲第一页色| 91麻豆爱豆果冻天美星空| 日本免费乱理伦片在线观看2018| 欧美日本免费| 999久久狠狠免费精品| 91麻豆高清国产在线播放| 成人影视在线播放| 成人影院久久久久久影院| 色综合久久天天综线观看| 尤物视频网站在线观看| 欧美激情在线精品video| 四虎久久影院| 黄色短视频网站| 欧美电影免费| 国产一区二区精品在线观看| 久久精品欧美一区二区| 青青久久精品| 午夜在线影院| 精品国产一区二区三区精东影业 | 青青久在线视频| 久久国产影院| 国产一区国产二区国产三区| 日日夜夜婷婷| 成人a级高清视频在线观看| 超级乱淫黄漫画免费| 台湾毛片| 国产成人啪精品| 黄色福利片| 久久99中文字幕久久| 免费国产一级特黄aa大片在线| 国产网站免费视频| 香蕉视频三级| 久久久成人影院| 国产a视频| 999精品在线| 午夜在线影院| 尤物视频网站在线| 日日夜夜婷婷| 国产网站免费| 成人免费一级毛片在线播放视频| 成人高清免费| 国产成+人+综合+亚洲不卡| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 99热热久久| 国产成人精品在线| 成人免费观看视频| 精品视频在线看| 日韩免费在线观看视频| 精品国产亚一区二区三区| 青青久久网| 久久精品人人做人人爽97| 免费一级片在线观看| 欧美激情一区二区三区在线 | 亚洲精品久久玖玖玖玖| 国产网站免费| 国产不卡在线播放| 免费的黄色小视频| 国产一区二区高清视频| 日韩中文字幕在线观看视频| 精品视频在线看| 国产精品免费久久| 精品在线观看国产| 国产一区二区精品在线观看| 99色视频| 日本在线不卡免费视频一区| 精品国产一区二区三区国产馆| 日韩中文字幕一区| 欧美激情在线精品video| 午夜激情视频在线观看| 欧美18性精品| 亚欧成人乱码一区二区| 国产成人女人在线视频观看 | 日韩在线观看视频网站| 国产视频一区二区在线播放| 日韩av片免费播放| 欧美激情伊人| 欧美大片aaaa一级毛片| 精品视频一区二区| 国产一区二区精品尤物| 日韩免费在线视频| 欧美1区| 欧美日本免费| 韩国三级香港三级日本三级| 亚欧成人乱码一区二区| 欧美大片a一级毛片视频| 亚洲精品久久久中文字| 欧美激情影院| 国产不卡在线看| 亚洲第一页色| 欧美激情一区二区三区视频 | 欧美a级大片| 国产91精品一区| 一级女性全黄生活片免费| 成人影院一区二区三区| 精品国产三级a| 欧美激情一区二区三区视频高清| 亚洲天堂免费观看| 日本免费乱人伦在线观看| 日韩男人天堂| 国产伦精品一区二区三区无广告| 色综合久久天天综合绕观看| 在线观看成人网 | 91麻豆爱豆果冻天美星空| 欧美大片一区| 日日夜夜婷婷| 成人免费网站视频ww| 国产伦精品一区二区三区无广告| 超级乱淫伦动漫| 日韩欧美一二三区| 成人影视在线观看| 成人a大片在线观看| 九九久久99| 99久久精品国产高清一区二区| 精品国产香蕉伊思人在线又爽又黄| 欧美另类videosbestsex| 999久久66久6只有精品| 成人a大片在线观看| 久久成人综合网| 久久国产影视免费精品| 久久福利影视| 91麻豆爱豆果冻天美星空| 久久福利影视| 四虎精品在线观看| 欧美国产日韩一区二区三区| 九九热国产视频| 91麻豆国产级在线| 九九久久国产精品| 一级毛片视频免费| 久久国产一久久高清| 欧美激情一区二区三区中文字幕| 超级乱淫黄漫画免费| 精品视频在线观看免费| 精品久久久久久综合网| 亚洲www美色| 欧美激情伊人|