refconn.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package net
  2. import (
  3. "net"
  4. "runtime"
  5. "time"
  6. "github.com/metacubex/mihomo/common/buf"
  7. )
  8. type refConn struct {
  9. conn ExtendedConn
  10. ref any
  11. }
  12. func (c *refConn) Read(b []byte) (n int, err error) {
  13. defer runtime.KeepAlive(c.ref)
  14. return c.conn.Read(b)
  15. }
  16. func (c *refConn) Write(b []byte) (n int, err error) {
  17. defer runtime.KeepAlive(c.ref)
  18. return c.conn.Write(b)
  19. }
  20. func (c *refConn) Close() error {
  21. defer runtime.KeepAlive(c.ref)
  22. return c.conn.Close()
  23. }
  24. func (c *refConn) LocalAddr() net.Addr {
  25. defer runtime.KeepAlive(c.ref)
  26. return c.conn.LocalAddr()
  27. }
  28. func (c *refConn) RemoteAddr() net.Addr {
  29. defer runtime.KeepAlive(c.ref)
  30. return c.conn.RemoteAddr()
  31. }
  32. func (c *refConn) SetDeadline(t time.Time) error {
  33. defer runtime.KeepAlive(c.ref)
  34. return c.conn.SetDeadline(t)
  35. }
  36. func (c *refConn) SetReadDeadline(t time.Time) error {
  37. defer runtime.KeepAlive(c.ref)
  38. return c.conn.SetReadDeadline(t)
  39. }
  40. func (c *refConn) SetWriteDeadline(t time.Time) error {
  41. defer runtime.KeepAlive(c.ref)
  42. return c.conn.SetWriteDeadline(t)
  43. }
  44. func (c *refConn) Upstream() any {
  45. return c.conn
  46. }
  47. func (c *refConn) ReadBuffer(buffer *buf.Buffer) error {
  48. defer runtime.KeepAlive(c.ref)
  49. return c.conn.ReadBuffer(buffer)
  50. }
  51. func (c *refConn) WriteBuffer(buffer *buf.Buffer) error {
  52. defer runtime.KeepAlive(c.ref)
  53. return c.conn.WriteBuffer(buffer)
  54. }
  55. func (c *refConn) ReaderReplaceable() bool { // Relay() will handle reference
  56. return true
  57. }
  58. func (c *refConn) WriterReplaceable() bool { // Relay() will handle reference
  59. return true
  60. }
  61. var _ ExtendedConn = (*refConn)(nil)
  62. func NewRefConn(conn net.Conn, ref any) net.Conn {
  63. return &refConn{conn: NewExtendedConn(conn), ref: ref}
  64. }