net.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. package proc
  2. import (
  3. "bufio"
  4. "bytes"
  5. "encoding/binary"
  6. "encoding/hex"
  7. "net"
  8. "os"
  9. "inet.af/netaddr"
  10. )
  11. const (
  12. stateEstablished = "01"
  13. stateListen = "0A"
  14. )
  15. type Sock struct {
  16. Inode string
  17. SAddr netaddr.IPPort
  18. DAddr netaddr.IPPort
  19. Listen bool
  20. }
  21. func GetSockets(pid uint32) ([]Sock, error) {
  22. var res []Sock
  23. var e error
  24. for _, f := range []string{"tcp", "tcp6"} {
  25. ss, err := readSockets(Path(pid, "net", f))
  26. if err != nil {
  27. e = err
  28. }
  29. res = append(res, ss...)
  30. }
  31. return res, e
  32. }
  33. func readSockets(src string) ([]Sock, error) {
  34. f, err := os.Open(src)
  35. if err != nil {
  36. return nil, err
  37. }
  38. defer f.Close()
  39. var res []Sock
  40. scanner := bufio.NewScanner(f)
  41. header := true
  42. for scanner.Scan() {
  43. if header {
  44. header = false
  45. continue
  46. }
  47. b := scanner.Bytes()
  48. _, b = nextField(b)
  49. local, b := nextField(b)
  50. remote, b := nextField(b)
  51. st, b := nextField(b)
  52. state := string(st)
  53. if state != stateEstablished && state != stateListen {
  54. continue
  55. }
  56. _, b = nextField(b)
  57. _, b = nextField(b)
  58. _, b = nextField(b)
  59. _, b = nextField(b)
  60. _, b = nextField(b)
  61. inode, _ := nextField(b)
  62. res = append(res, Sock{SAddr: decodeAddr(local), DAddr: decodeAddr(remote), Listen: state == stateListen, Inode: string(inode)})
  63. }
  64. return res, nil
  65. }
  66. func nextField(s []byte) ([]byte, []byte) {
  67. for i, b := range s {
  68. if b != ' ' {
  69. s = s[i:]
  70. break
  71. }
  72. }
  73. for i, b := range s {
  74. if b == ' ' {
  75. return s[:i], s[i:]
  76. }
  77. }
  78. return nil, nil
  79. }
  80. func decodeAddr(src []byte) netaddr.IPPort {
  81. col := bytes.IndexByte(src, ':')
  82. if col == -1 || (col != 8 && col != 32) {
  83. return netaddr.IPPort{}
  84. }
  85. ip := make([]byte, col/2)
  86. if _, err := hex.Decode(ip, src[:col]); err != nil {
  87. return netaddr.IPPort{}
  88. }
  89. port := make([]byte, 2)
  90. if _, err := hex.Decode(port, src[col+1:]); err != nil {
  91. return netaddr.IPPort{}
  92. }
  93. var v uint32
  94. for i := 0; i < len(ip); i += 4 {
  95. v = binary.BigEndian.Uint32(ip[i : i+4])
  96. binary.LittleEndian.PutUint32(ip[i:i+4], v)
  97. }
  98. ipp, ok := netaddr.FromStdIP(net.IP(ip))
  99. if !ok {
  100. return netaddr.IPPort{}
  101. }
  102. return netaddr.IPPortFrom(ipp, binary.BigEndian.Uint16(port))
  103. }