1
0

sys_linux.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. //go:build linux
  2. // +build linux
  3. package sys
  4. import (
  5. "bytes"
  6. "fmt"
  7. "io"
  8. "os"
  9. )
  10. func getLinesNum(filename string) (int, error) {
  11. file, err := os.Open(filename)
  12. if err != nil {
  13. return 0, err
  14. }
  15. defer file.Close()
  16. sum := 0
  17. buf := make([]byte, 8192)
  18. for {
  19. n, err := file.Read(buf)
  20. var buffPosition int
  21. for {
  22. i := bytes.IndexByte(buf[buffPosition:n], '\n')
  23. if i < 0 {
  24. break
  25. }
  26. buffPosition += i + 1
  27. sum++
  28. }
  29. if err == io.EOF {
  30. break
  31. } else if err != nil {
  32. return 0, err
  33. }
  34. }
  35. return sum, nil
  36. }
  37. func GetTCPCount() (int, error) {
  38. root := HostProc()
  39. tcp4, err := getLinesNum(fmt.Sprintf("%v/net/tcp", root))
  40. if err != nil {
  41. return 0, err
  42. }
  43. tcp6, err := getLinesNum(fmt.Sprintf("%v/net/tcp6", root))
  44. if err != nil {
  45. return 0, err
  46. }
  47. return tcp4 + tcp6, nil
  48. }
  49. func GetUDPCount() (int, error) {
  50. root := HostProc()
  51. udp4, err := getLinesNum(fmt.Sprintf("%v/net/udp", root))
  52. if err != nil {
  53. return 0, err
  54. }
  55. udp6, err := getLinesNum(fmt.Sprintf("%v/net/udp6", root))
  56. if err != nil {
  57. return 0, err
  58. }
  59. return udp4 + udp6, nil
  60. }