conn.go 840 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package conntrack
  2. import (
  3. "io"
  4. "net"
  5. "github.com/sagernet/sing/common/x/list"
  6. )
  7. type Conn struct {
  8. net.Conn
  9. element *list.Element[io.Closer]
  10. }
  11. func NewConn(conn net.Conn) (net.Conn, error) {
  12. connAccess.Lock()
  13. element := openConnection.PushBack(conn)
  14. connAccess.Unlock()
  15. if KillerEnabled {
  16. err := KillerCheck()
  17. if err != nil {
  18. conn.Close()
  19. return nil, err
  20. }
  21. }
  22. return &Conn{
  23. Conn: conn,
  24. element: element,
  25. }, nil
  26. }
  27. func (c *Conn) Close() error {
  28. if c.element.Value != nil {
  29. connAccess.Lock()
  30. if c.element.Value != nil {
  31. openConnection.Remove(c.element)
  32. c.element.Value = nil
  33. }
  34. connAccess.Unlock()
  35. }
  36. return c.Conn.Close()
  37. }
  38. func (c *Conn) Upstream() any {
  39. return c.Conn
  40. }
  41. func (c *Conn) ReaderReplaceable() bool {
  42. return true
  43. }
  44. func (c *Conn) WriterReplaceable() bool {
  45. return true
  46. }