亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Golang > 正文

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

2020-04-01 19:08:22
字體:
來源:轉載
供稿:網友

一、準備工作

安裝最新的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), ) }()

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

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

 golang,ping,ip

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

總結

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲午夜女主播在线直播| 国产精品电影网站| 亚洲国产小视频在线观看| 热re99久久精品国产66热| 美日韩丰满少妇在线观看| 91国语精品自产拍在线观看性色| 欧美性色视频在线| 欧美理论片在线观看| 国产精品视频免费观看www| 亚洲女人天堂成人av在线| 午夜精品久久久久久99热软件| 91精品久久久久久久久久久久久久| 日韩电视剧免费观看网站| 国产精品69久久久久| 国产精品青青在线观看爽香蕉| 欧美日韩综合视频| 在线观看日韩www视频免费| 九九热最新视频//这里只有精品| 精品国产成人av| 欧美成人合集magnet| 性视频1819p久久| 国产精品免费一区| 久久伊人精品视频| 亚洲综合日韩中文字幕v在线| 久久免费视频网| 97在线精品国自产拍中文| 在线精品高清中文字幕| 色综合伊人色综合网站| 久久精品国产一区| 中文字幕日韩在线播放| 亚洲色图15p| 国产欧美日韩最新| xxxx欧美18另类的高清| 亚洲国内精品视频| 色午夜这里只有精品| 91在线视频九色| 2019中文字幕免费视频| 欧美激情欧美激情在线五月| 欧美乱大交xxxxx另类电影| 国产91ⅴ在线精品免费观看| 欧美性猛交99久久久久99按摩| 亚洲欧美制服中文字幕| 热99精品只有里视频精品| 欧美性猛交xxxx偷拍洗澡| 日韩电视剧免费观看网站| 精品国产一区久久久| 91午夜在线播放| 国产91色在线| 欧洲永久精品大片ww免费漫画| 中文字幕亚洲一区二区三区五十路| 一区二区三区视频免费在线观看| 九九热这里只有精品免费看| 亚洲福利视频在线| 91在线视频九色| 亚洲精品720p| 国产视频丨精品|在线观看| 欧美日韩高清在线观看| 国产一区玩具在线观看| 欧美视频二区36p| 国产成+人+综合+亚洲欧洲| 欧美日韩色婷婷| 欧美日韩一二三四五区| 亚洲成在人线av| 色综合视频网站| 黄色成人在线免费| 国产精品视频一区二区高潮| 亚洲欧美日韩另类| 91精品视频播放| 国产精品高潮视频| 神马国产精品影院av| 国产精品欧美日韩| 亚洲精品久久久久中文字幕欢迎你| 宅男66日本亚洲欧美视频| 欧美重口另类videos人妖| 欧美第一淫aaasss性| 亚洲第一页自拍| 日韩av电影在线网| 97人人爽人人喊人人模波多| 欧美日韩在线影院| 国产成人精品综合久久久| 欧美精品www在线观看| 亚洲国产精品久久久久秋霞蜜臀| 亚洲成人激情在线| 欧美激情精品久久久久久| 久久6精品影院| 中文亚洲视频在线| 久久久久久久久久久久av| 欧美午夜激情视频| 国内精品400部情侣激情| 色999日韩欧美国产| 91精品啪aⅴ在线观看国产| 国产精品久久久久久搜索| 欧美日韩亚洲精品一区二区三区| 国产91热爆ts人妖在线| 久久久精品免费视频| 午夜精品久久久久久久久久久久久| 精品久久久久久久中文字幕| 国产黑人绿帽在线第一区| 欧美老少做受xxxx高潮| 97福利一区二区| 国产91精品在线播放| 成人网在线免费看| 日韩在线免费视频观看| 91精品久久久久久久久久另类| 久久综合网hezyo| 日韩电影在线观看免费| 国产69精品久久久久9| 欧美在线中文字幕| 久久久久成人精品| 91精品国产自产在线观看永久| 国产精品视频永久免费播放| 国产精品一香蕉国产线看观看| 亚洲xxxx18| 欧美一区二区三区……| 九九视频这里只有精品| 一区二区三区四区视频| 欧美极品美女视频网站在线观看免费| 中文字幕日韩av综合精品| 国产成人亚洲精品| 欧美肥臀大乳一区二区免费视频| 中文字幕日韩av电影| 日韩精品极品毛片系列视频| 国产精品免费一区二区三区都可以| 成人激情黄色网| 免费91在线视频| 国产精品劲爆视频| 亚洲国产成人在线视频| 中文字幕免费精品一区| 成人444kkkk在线观看| 亚洲mm色国产网站| 亚洲成av人乱码色午夜| 久久91精品国产91久久跳| 欧美精品免费播放| 日韩av网址在线观看| 欧美激情欧美狂野欧美精品| 欧美巨乳在线观看| 亚洲第一中文字幕在线观看| 久久亚洲精品毛片| 性欧美xxxx| 国产+成+人+亚洲欧洲| 亚洲精品视频中文字幕| 中文字幕av一区中文字幕天堂| 日韩欧美国产成人| 亚洲福利在线看| 清纯唯美亚洲激情| 亚洲欧美一区二区精品久久久| 欧美极品欧美精品欧美视频| 国产一区二区三区18| 久久频这里精品99香蕉| 98精品在线视频| 日韩精品视频观看| 久久久999精品免费| 国产福利精品av综合导导航| 日韩av影视在线| 国产精品91在线| 97精品视频在线观看| 国产一区二区久久精品| 日本老师69xxx| 91九色国产社区在线观看| 欧美一级电影久久| 亚洲精品一区av在线播放| 中文字幕无线精品亚洲乱码一区| 国产精品爽爽ⅴa在线观看| 亚洲精品动漫久久久久|