mirror of
https://github.com/nadoo/glider.git
synced 2025-02-24 01:45:39 +08:00
ss: optimize dial and pktconn code
This commit is contained in:
parent
31930f2955
commit
e1e8908ae2
36
ss.go
36
ss.go
@ -219,22 +219,10 @@ func (s *SS) Dial(network, addr string) (net.Conn, error) {
|
|||||||
return nil, errors.New("Unable to parse address: " + addr)
|
return nil, errors.New("Unable to parse address: " + addr)
|
||||||
}
|
}
|
||||||
|
|
||||||
switch network {
|
if network == "uot" {
|
||||||
case "tcp":
|
|
||||||
return s.dialTCP(target)
|
|
||||||
case "uot":
|
|
||||||
target[0] = target[0] | 0x8
|
target[0] = target[0] | 0x8
|
||||||
return s.dialTCP(target)
|
|
||||||
// case "udp":
|
|
||||||
// return s.dialUDP(target)
|
|
||||||
default:
|
|
||||||
return nil, errors.New("Unknown schema: " + network)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// DialTCP connects to the address addr via the proxy.
|
|
||||||
func (s *SS) dialTCP(target Addr) (net.Conn, error) {
|
|
||||||
c, err := s.cDialer.Dial("tcp", s.addr)
|
c, err := s.cDialer.Dial("tcp", s.addr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logf("dial to %s error: %s", s.addr, err)
|
logf("dial to %s error: %s", s.addr, err)
|
||||||
@ -252,6 +240,7 @@ func (s *SS) dialTCP(target Addr) (net.Conn, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return c, err
|
return c, err
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// DialUDP connects to the given address via the proxy.
|
// DialUDP connects to the given address via the proxy.
|
||||||
@ -282,6 +271,7 @@ type PktConn struct {
|
|||||||
|
|
||||||
// NewPktConn returns a PktConn
|
// NewPktConn returns a PktConn
|
||||||
func NewPktConn(c net.PacketConn, addr net.Addr, target Addr, tgtHeader bool) *PktConn {
|
func NewPktConn(c net.PacketConn, addr net.Addr, target Addr, tgtHeader bool) *PktConn {
|
||||||
|
|
||||||
pc := &PktConn{
|
pc := &PktConn{
|
||||||
PacketConn: c,
|
PacketConn: c,
|
||||||
addr: addr,
|
addr: addr,
|
||||||
@ -291,30 +281,26 @@ func NewPktConn(c net.PacketConn, addr net.Addr, target Addr, tgtHeader bool) *P
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (pc *PktConn) Read(b []byte) (int, error) {
|
func (pc *PktConn) Read(b []byte) (int, error) {
|
||||||
|
n, _, err := pc.ReadFrom(b)
|
||||||
|
return n, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (pc *PktConn) ReadFrom(b []byte) (int, net.Addr, error) {
|
||||||
|
|
||||||
if !pc.tgtHeader {
|
if !pc.tgtHeader {
|
||||||
n, _, err := pc.PacketConn.ReadFrom(b)
|
return pc.PacketConn.ReadFrom(b)
|
||||||
return n, err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
buf := make([]byte, len(b))
|
buf := make([]byte, len(b))
|
||||||
n, raddr, err := pc.PacketConn.ReadFrom(buf)
|
n, raddr, err := pc.PacketConn.ReadFrom(buf)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return n, raddr, err
|
||||||
}
|
}
|
||||||
|
|
||||||
srcAddr := ParseAddr(raddr.String())
|
srcAddr := ParseAddr(raddr.String())
|
||||||
copy(b, buf[len(srcAddr):])
|
copy(b, buf[len(srcAddr):])
|
||||||
|
|
||||||
return n - len(srcAddr), err
|
return n - len(srcAddr), raddr, err
|
||||||
}
|
|
||||||
|
|
||||||
func (pc *PktConn) ReadFrom(b []byte) (int, net.Addr, error) {
|
|
||||||
|
|
||||||
n, err := pc.Read(b)
|
|
||||||
|
|
||||||
// TODO: Addr
|
|
||||||
return n, nil, err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (pc *PktConn) Write(b []byte) (int, error) {
|
func (pc *PktConn) Write(b []byte) (int, error) {
|
||||||
|
Loading…
Reference in New Issue
Block a user