mirror of
https://github.com/wyx2685/V2bX.git
synced 2026-02-04 04:30:08 +00:00
update sing-box support
This commit is contained in:
@@ -1,8 +1,11 @@
|
||||
package counter
|
||||
|
||||
import (
|
||||
"io"
|
||||
"net"
|
||||
|
||||
"github.com/sagernet/sing/common/bufio"
|
||||
|
||||
"github.com/sagernet/sing/common/buf"
|
||||
|
||||
M "github.com/sagernet/sing/common/metadata"
|
||||
@@ -10,38 +13,93 @@ import (
|
||||
)
|
||||
|
||||
type ConnCounter struct {
|
||||
net.Conn
|
||||
storage *TrafficStorage
|
||||
network.ExtendedConn
|
||||
storage *TrafficStorage
|
||||
readFunc network.CountFunc
|
||||
writeFunc network.CountFunc
|
||||
}
|
||||
|
||||
func NewConnCounter(conn net.Conn, s *TrafficStorage) net.Conn {
|
||||
return &ConnCounter{
|
||||
Conn: conn,
|
||||
storage: s,
|
||||
ExtendedConn: bufio.NewExtendedConn(conn),
|
||||
storage: s,
|
||||
readFunc: func(n int64) {
|
||||
s.DownCounter.Add(n)
|
||||
},
|
||||
writeFunc: func(n int64) {
|
||||
s.UpCounter.Add(n)
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func (c *ConnCounter) Read(b []byte) (n int, err error) {
|
||||
n, err = c.Conn.Read(b)
|
||||
n, err = c.ExtendedConn.Read(b)
|
||||
c.storage.DownCounter.Store(int64(n))
|
||||
return
|
||||
}
|
||||
|
||||
func (c *ConnCounter) Write(b []byte) (n int, err error) {
|
||||
n, err = c.Conn.Write(b)
|
||||
n, err = c.ExtendedConn.Write(b)
|
||||
c.storage.UpCounter.Store(int64(n))
|
||||
return
|
||||
}
|
||||
|
||||
func (c *ConnCounter) ReadBuffer(buffer *buf.Buffer) error {
|
||||
err := c.ExtendedConn.ReadBuffer(buffer)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if buffer.Len() > 0 {
|
||||
c.storage.DownCounter.Add(int64(buffer.Len()))
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *ConnCounter) WriteBuffer(buffer *buf.Buffer) error {
|
||||
dataLen := int64(buffer.Len())
|
||||
err := c.ExtendedConn.WriteBuffer(buffer)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if dataLen > 0 {
|
||||
c.storage.UpCounter.Add(dataLen)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *ConnCounter) UnwrapReader() (io.Reader, []network.CountFunc) {
|
||||
return c.ExtendedConn, []network.CountFunc{
|
||||
c.readFunc,
|
||||
}
|
||||
}
|
||||
|
||||
func (c *ConnCounter) UnwrapWriter() (io.Writer, []network.CountFunc) {
|
||||
return c.ExtendedConn, []network.CountFunc{
|
||||
c.writeFunc,
|
||||
}
|
||||
}
|
||||
|
||||
func (c *ConnCounter) Upstream() any {
|
||||
return c.ExtendedConn
|
||||
}
|
||||
|
||||
type PacketConnCounter struct {
|
||||
network.PacketConn
|
||||
storage *TrafficStorage
|
||||
storage *TrafficStorage
|
||||
readFunc network.CountFunc
|
||||
writeFunc network.CountFunc
|
||||
}
|
||||
|
||||
func NewPacketConnCounter(conn network.PacketConn, s *TrafficStorage) network.PacketConn {
|
||||
return &PacketConnCounter{
|
||||
PacketConn: conn,
|
||||
storage: s,
|
||||
readFunc: func(n int64) {
|
||||
s.DownCounter.Add(n)
|
||||
},
|
||||
writeFunc: func(n int64) {
|
||||
s.UpCounter.Add(n)
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -55,10 +113,29 @@ func (p *PacketConnCounter) ReadPacket(buff *buf.Buffer) (destination M.Socksadd
|
||||
}
|
||||
|
||||
func (p *PacketConnCounter) WritePacket(buff *buf.Buffer, destination M.Socksaddr) (err error) {
|
||||
n := buff.Len()
|
||||
err = p.PacketConn.WritePacket(buff, destination)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
p.storage.UpCounter.Add(int64(buff.Len()))
|
||||
if n > 0 {
|
||||
p.storage.UpCounter.Add(int64(n))
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (p *PacketConnCounter) UnwrapPacketReader() (network.PacketReader, []network.CountFunc) {
|
||||
return p.PacketConn, []network.CountFunc{
|
||||
p.readFunc,
|
||||
}
|
||||
}
|
||||
|
||||
func (p *PacketConnCounter) UnwrapPacketWriter() (network.PacketWriter, []network.CountFunc) {
|
||||
return p.PacketConn, []network.CountFunc{
|
||||
p.writeFunc,
|
||||
}
|
||||
}
|
||||
|
||||
func (p *PacketConnCounter) Upstream() any {
|
||||
return p.PacketConn
|
||||
}
|
||||
|
||||
@@ -52,6 +52,12 @@ func (c *TrafficCounter) GetDownCount(id string) int64 {
|
||||
return 0
|
||||
}
|
||||
|
||||
func (c *TrafficCounter) Len() int {
|
||||
c.lock.RLock()
|
||||
defer c.lock.RUnlock()
|
||||
return len(c.counters)
|
||||
}
|
||||
|
||||
func (c *TrafficCounter) Reset(id string) {
|
||||
c.lock.RLock()
|
||||
cts := c.GetCounter(id)
|
||||
|
||||
Reference in New Issue
Block a user