sysfd.go 502 B

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