add interface xnet.SrcAddr/DstAddr

This commit is contained in:
ginuerzh
2025-08-03 10:15:53 +08:00
parent 79203e407c
commit f71351f5ef
42 changed files with 518 additions and 295 deletions
+6 -2
View File
@@ -26,8 +26,12 @@ type RemoteAddr interface {
RemoteAddr() net.Addr
}
type ClientAddr interface {
ClientAddr() net.Addr
type SrcAddr interface {
SrcAddr() net.Addr
}
type DstAddr interface {
DstAddr() net.Addr
}
// tcpraw.TCPConn
+3 -3
View File
@@ -69,13 +69,13 @@ func pipeBuffer(dst io.ReadWriteCloser, src io.ReadWriteCloser, bufferSize int)
if cw, ok := dst.(xio.CloseWrite); ok {
if e := cw.CloseWrite(); e == xio.ErrUnsupported {
dst.Close()
} else {
// Set TCP half-close timeout.
xio.SetReadDeadline(dst, time.Now().Add(tcpWaitTimeout))
}
} else {
dst.Close()
}
// Set TCP half-close timeout.
xio.SetReadDeadline(dst, time.Now().Add(tcpWaitTimeout))
return err
}
+59 -1
View File
@@ -2,6 +2,7 @@ package proxyproto
import (
"net"
"strconv"
xio "github.com/go-gost/x/internal/io"
proxyproto "github.com/pires/go-proxyproto"
@@ -11,6 +12,28 @@ type serverConn struct {
net.Conn
}
func (c *serverConn) RemoteAddr() net.Addr {
if conn, ok := c.Conn.(*proxyproto.Conn); ok {
return conn.Raw().RemoteAddr()
}
return c.Conn.RemoteAddr()
}
func (c *serverConn) LocalAddr() net.Addr {
if conn, ok := c.Conn.(*proxyproto.Conn); ok {
return conn.Raw().LocalAddr()
}
return c.Conn.LocalAddr()
}
func (c *serverConn) SrcAddr() net.Addr {
return c.Conn.RemoteAddr()
}
func (c *serverConn) DstAddr() net.Addr {
return c.Conn.LocalAddr()
}
func (c *serverConn) CloseRead() error {
if sc, ok := c.Conn.(xio.CloseRead); ok {
return sc.CloseRead()
@@ -36,7 +59,14 @@ func (c *serverConn) CloseWrite() error {
}
func WrapClientConn(ppv int, src, dst net.Addr, c net.Conn) net.Conn {
if ppv <= 0 {
if ppv <= 0 || c == nil {
return c
}
if src = convertAddr(src); src == nil {
return c
}
if dst = convertAddr(dst); dst == nil {
return c
}
@@ -44,3 +74,31 @@ func WrapClientConn(ppv int, src, dst net.Addr, c net.Conn) net.Conn {
header.WriteTo(c)
return c
}
func convertAddr(addr net.Addr) net.Addr {
if addr == nil {
return nil
}
host, sp, _ := net.SplitHostPort(addr.String())
ip := net.ParseIP(host)
port, _ := strconv.Atoi(sp)
if ip == nil || ip.Equal(net.IPv6zero) {
ip = net.IPv4zero
}
switch addr.Network() {
case "tcp", "tcp4", "tcp6":
return &net.TCPAddr{
IP: ip,
Port: port,
}
default:
return &net.UDPAddr{
IP: ip,
Port: port,
}
}
}