packet_conn.go 980 B

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