conn.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package interrupt
  2. import (
  3. "net"
  4. "github.com/sagernet/sing/common/x/list"
  5. )
  6. /*type GroupedConn interface {
  7. MarkAsInternal()
  8. }
  9. func MarkAsInternal(conn any) {
  10. if groupedConn, isGroupConn := common.Cast[GroupedConn](conn); isGroupConn {
  11. groupedConn.MarkAsInternal()
  12. }
  13. }*/
  14. type Conn struct {
  15. net.Conn
  16. group *Group
  17. element *list.Element[*groupConnItem]
  18. }
  19. /*func (c *Conn) MarkAsInternal() {
  20. c.element.Value.internal = true
  21. }*/
  22. func (c *Conn) Close() error {
  23. c.group.access.Lock()
  24. defer c.group.access.Unlock()
  25. c.group.connections.Remove(c.element)
  26. return c.Conn.Close()
  27. }
  28. func (c *Conn) ReaderReplaceable() bool {
  29. return true
  30. }
  31. func (c *Conn) WriterReplaceable() bool {
  32. return true
  33. }
  34. func (c *Conn) Upstream() any {
  35. return c.Conn
  36. }
  37. type PacketConn struct {
  38. net.PacketConn
  39. group *Group
  40. element *list.Element[*groupConnItem]
  41. }
  42. /*func (c *PacketConn) MarkAsInternal() {
  43. c.element.Value.internal = true
  44. }*/
  45. func (c *PacketConn) Close() error {
  46. c.group.access.Lock()
  47. defer c.group.access.Unlock()
  48. c.group.connections.Remove(c.element)
  49. return c.PacketConn.Close()
  50. }
  51. func (c *PacketConn) ReaderReplaceable() bool {
  52. return true
  53. }
  54. func (c *PacketConn) WriterReplaceable() bool {
  55. return true
  56. }
  57. func (c *PacketConn) Upstream() any {
  58. return c.PacketConn
  59. }