add metrics
This commit is contained in:
50
internal/net/transport.go
Normal file
50
internal/net/transport.go
Normal file
@ -0,0 +1,50 @@
|
||||
package net
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"io"
|
||||
"net"
|
||||
|
||||
"github.com/go-gost/core/common/bufpool"
|
||||
)
|
||||
|
||||
func Transport(rw1, rw2 io.ReadWriter) error {
|
||||
errc := make(chan error, 1)
|
||||
go func() {
|
||||
errc <- copyBuffer(rw1, rw2)
|
||||
}()
|
||||
|
||||
go func() {
|
||||
errc <- copyBuffer(rw2, rw1)
|
||||
}()
|
||||
|
||||
err := <-errc
|
||||
if err != nil && err == io.EOF {
|
||||
err = nil
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func copyBuffer(dst io.Writer, src io.Reader) error {
|
||||
buf := bufpool.Get(32 * 1024)
|
||||
defer bufpool.Put(buf)
|
||||
|
||||
_, err := io.CopyBuffer(dst, src, *buf)
|
||||
return err
|
||||
}
|
||||
|
||||
type bufferReaderConn struct {
|
||||
net.Conn
|
||||
br *bufio.Reader
|
||||
}
|
||||
|
||||
func NewBufferReaderConn(conn net.Conn, br *bufio.Reader) net.Conn {
|
||||
return &bufferReaderConn{
|
||||
Conn: conn,
|
||||
br: br,
|
||||
}
|
||||
}
|
||||
|
||||
func (c *bufferReaderConn) Read(b []byte) (int, error) {
|
||||
return c.br.Read(b)
|
||||
}
|
126
internal/net/udp/relay.go
Normal file
126
internal/net/udp/relay.go
Normal file
@ -0,0 +1,126 @@
|
||||
package udp
|
||||
|
||||
import (
|
||||
"net"
|
||||
|
||||
"github.com/go-gost/core/bypass"
|
||||
"github.com/go-gost/core/common/bufpool"
|
||||
"github.com/go-gost/core/logger"
|
||||
)
|
||||
|
||||
type Relay struct {
|
||||
pc1 net.PacketConn
|
||||
pc2 net.PacketConn
|
||||
|
||||
bypass bypass.Bypass
|
||||
bufferSize int
|
||||
logger logger.Logger
|
||||
}
|
||||
|
||||
func NewRelay(pc1, pc2 net.PacketConn) *Relay {
|
||||
return &Relay{
|
||||
pc1: pc1,
|
||||
pc2: pc2,
|
||||
}
|
||||
}
|
||||
|
||||
func (r *Relay) WithBypass(bp bypass.Bypass) *Relay {
|
||||
r.bypass = bp
|
||||
return r
|
||||
}
|
||||
|
||||
func (r *Relay) WithLogger(logger logger.Logger) *Relay {
|
||||
r.logger = logger
|
||||
return r
|
||||
}
|
||||
|
||||
func (r *Relay) SetBufferSize(n int) {
|
||||
r.bufferSize = n
|
||||
}
|
||||
|
||||
func (r *Relay) Run() (err error) {
|
||||
bufSize := r.bufferSize
|
||||
if bufSize <= 0 {
|
||||
bufSize = 1500
|
||||
}
|
||||
|
||||
errc := make(chan error, 2)
|
||||
|
||||
go func() {
|
||||
for {
|
||||
err := func() error {
|
||||
b := bufpool.Get(bufSize)
|
||||
defer bufpool.Put(b)
|
||||
|
||||
n, raddr, err := r.pc1.ReadFrom(*b)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if r.bypass != nil && r.bypass.Contains(raddr.String()) {
|
||||
if r.logger != nil {
|
||||
r.logger.Warn("bypass: ", raddr)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
if _, err := r.pc2.WriteTo((*b)[:n], raddr); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if r.logger != nil {
|
||||
r.logger.Debugf("%s >>> %s data: %d",
|
||||
r.pc2.LocalAddr(), raddr, n)
|
||||
|
||||
}
|
||||
|
||||
return nil
|
||||
}()
|
||||
|
||||
if err != nil {
|
||||
errc <- err
|
||||
return
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
go func() {
|
||||
for {
|
||||
err := func() error {
|
||||
b := bufpool.Get(bufSize)
|
||||
defer bufpool.Put(b)
|
||||
|
||||
n, raddr, err := r.pc2.ReadFrom(*b)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if r.bypass != nil && r.bypass.Contains(raddr.String()) {
|
||||
if r.logger != nil {
|
||||
r.logger.Warn("bypass: ", raddr)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
if _, err := r.pc1.WriteTo((*b)[:n], raddr); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if r.logger != nil {
|
||||
r.logger.Debugf("%s <<< %s data: %d",
|
||||
r.pc2.LocalAddr(), raddr, n)
|
||||
|
||||
}
|
||||
|
||||
return nil
|
||||
}()
|
||||
|
||||
if err != nil {
|
||||
errc <- err
|
||||
return
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
return <-errc
|
||||
}
|
Reference in New Issue
Block a user