39 lines
810 B
Go
39 lines
810 B
Go
package ss
|
|
|
|
import (
|
|
"net"
|
|
|
|
"github.com/go-gost/go-shadowsocks2/core"
|
|
"github.com/go-gost/go-shadowsocks2/socks"
|
|
)
|
|
|
|
type udpConn struct {
|
|
net.PacketConn
|
|
targetAddr net.Addr
|
|
}
|
|
|
|
func UDPClientConn(c net.PacketConn, targetAddr net.Addr, client *core.UDPClient) net.Conn {
|
|
return &udpConn{
|
|
PacketConn: client.WrapConn(c),
|
|
targetAddr: targetAddr,
|
|
}
|
|
}
|
|
|
|
func (c *udpConn) Read(b []byte) (int, error) {
|
|
n, _, err := c.PacketConn.ReadFrom(b)
|
|
return n, err
|
|
}
|
|
|
|
func (c *udpConn) Write(b []byte) (int, error) {
|
|
return c.WriteTo(b, c.targetAddr)
|
|
}
|
|
|
|
func (c *udpConn) WriteTo(b []byte, addr net.Addr) (int, error) {
|
|
target := socks.ParseAddr(addr.String())
|
|
return c.PacketConn.WriteTo(b, core.NewUDPClientPacketAddr(target, c.LocalAddr()))
|
|
}
|
|
|
|
func (c *udpConn) RemoteAddr() net.Addr {
|
|
return c.targetAddr
|
|
}
|