go語言獲得linux下網卡上行與下行流量

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")
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章