sys_linux.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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')
  23. if i < 0 || n == buffPosition {
  24. break
  25. }
  26. buffPosition += i + 1
  27. sum++
  28. }
  29. if err == io.EOF {
  30. return sum, nil
  31. } else if err != nil {
  32. return sum, err
  33. }
  34. }
  35. }
  36. func GetTCPCount() (int, error) {
  37. root := HostProc()
  38. tcp4, err := getLinesNum(fmt.Sprintf("%v/net/tcp", root))
  39. if err != nil {
  40. return tcp4, err
  41. }
  42. tcp6, err := getLinesNum(fmt.Sprintf("%v/net/tcp6", root))
  43. if err != nil {
  44. return tcp4 + tcp6, nil
  45. }
  46. return tcp4 + tcp6, nil
  47. }
  48. func GetUDPCount() (int, error) {
  49. root := HostProc()
  50. udp4, err := getLinesNum(fmt.Sprintf("%v/net/udp", root))
  51. if err != nil {
  52. return udp4, err
  53. }
  54. udp6, err := getLinesNum(fmt.Sprintf("%v/net/udp6", root))
  55. if err != nil {
  56. return udp4 + udp6, nil
  57. }
  58. return udp4 + udp6, nil
  59. }