sysfd.go 542 B

123456789101112131415161718192021222324252627
  1. package internal
  2. import (
  3. "net"
  4. "reflect"
  5. "v2ray.com/core/common/errors"
  6. )
  7. var (
  8. errInvalidConn = errors.New("Invalid Connection.")
  9. )
  10. // GetSysFd returns the underlying fd of a connection.
  11. func GetSysFd(conn net.Conn) (int, error) {
  12. cv := reflect.ValueOf(conn)
  13. switch ce := cv.Elem(); ce.Kind() {
  14. case reflect.Struct:
  15. netfd := ce.FieldByName("conn").FieldByName("fd")
  16. switch fe := netfd.Elem(); fe.Kind() {
  17. case reflect.Struct:
  18. fd := fe.FieldByName("sysfd")
  19. return int(fd.Int()), nil
  20. }
  21. }
  22. return 0, errInvalidConn
  23. }