123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- package conntrack
- import (
- "io"
- "net"
- "github.com/sagernet/sing/common/x/list"
- )
- type Conn struct {
- net.Conn
- element *list.Element[io.Closer]
- }
- func NewConn(conn net.Conn) (net.Conn, error) {
- connAccess.Lock()
- element := openConnection.PushBack(conn)
- connAccess.Unlock()
- if KillerEnabled {
- err := KillerCheck()
- if err != nil {
- conn.Close()
- return nil, err
- }
- }
- return &Conn{
- Conn: conn,
- element: element,
- }, nil
- }
- func (c *Conn) Close() error {
- if c.element.Value != nil {
- connAccess.Lock()
- if c.element.Value != nil {
- openConnection.Remove(c.element)
- c.element.Value = nil
- }
- connAccess.Unlock()
- }
- return c.Conn.Close()
- }
- func (c *Conn) Upstream() any {
- return c.Conn
- }
- func (c *Conn) ReaderReplaceable() bool {
- return true
- }
- func (c *Conn) WriterReplaceable() bool {
- return true
- }
|