linux系統下/proc/net/dev存儲網絡設備的統計信息
如上圖所示:
第一列: 網卡名
第二列: 對應網卡接收字節數
第九列: 對應網卡發送字節數
通過以上信息,我們就可以計算出網卡的上行與下行的流量情況,代碼實現如下:
package main
import (
"fmt"
"io/ioutil"
"strconv"
"strings"
"time"
)
// 分割字符串
func splitStr(s, sep string) []string {
rArr := make([]string, 0, 10)
for {
s = strings.Trim(s, sep)
i := strings.Index(s, sep)
if i == -1 {
if len(s) > 0 {
rArr = append(rArr, s)
}
break
}
left := s[:i]
right := s[i+1:]
right = strings.Trim(right, sep)
s = right
rArr = append(rArr, left)
}
return rArr
}
// 獲得所有網卡的上行與下行流量
func getBandWith() (map[string]int64, map[string]int64, error) {
d, err := ioutil.ReadFile("/proc/net/dev")
if err != nil {
fmt.Println("read file failed, err: ", err)
return nil, nil, err
}
rMap := make(map[string]int64)
tMap := make(map[string]int64)
lineArr := strings.Split(string(d), "\n")
for i := 2; i < len(lineArr); i++ {
addrArr := strings.Split(lineArr[i], ":")
if len(addrArr) == 2 {
dArr := splitStr(addrArr[1], " ")
if len(dArr) == 16 {
r := dArr[0]
t := dArr[8]
ri, _ := strconv.ParseInt(r, 10, 0)
ti, _ := strconv.ParseInt(t, 10, 0)
macName := addrArr[0]
macName = strings.Trim(macName, " ")
rMap[macName] = ri
tMap[macName] = ti
} else {
fmt.Println("drr len ", len(dArr))
}
}
}
return rMap, tMap, nil
}
func main() {
ethx := "eth0"
fmt.Println(ethx, " recv : send")
timer := time.NewTicker(time.Second)
var rLast, tLast int64
for {
<-timer.C
rMap, tMap, err := getBandWith()
if err != nil {
continue
}
var recv int64
var send int64
if r, ok := rMap[ethx]; ok {
if rLast != 0 {
recv = r - rLast
}
rLast = r
} else {
fmt.Println("not found")
}
if t, ok := tMap[ethx]; ok {
if tLast != 0 {
send = t - tLast
}
tLast = t
}
fmt.Println(recv/1024, " ks : ", send/1024, " ks")
}
}