sys_linux.go 1.1 KB

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