diff --git a/relay.go b/relay.go index 22dbdcf..0184a51 100644 --- a/relay.go +++ b/relay.go @@ -271,16 +271,20 @@ func (c *relayConn) Read(b []byte) (n int, err error) { resp := new(relay.Response) _, err = resp.ReadFrom(c.Conn) if err != nil { + log.Log("[relay] read:", err) return } if resp.Version != relay.Version1 { err = relay.ErrBadVersion + log.Log("[relay] read:", err) return } if resp.Status != relay.StatusOK { err = fmt.Errorf("status %d", resp.Status) + log.Log("[relay] read:", err) return } + log.Log("[relay] read response OK") }) if !c.udp { @@ -292,6 +296,7 @@ func (c *relayConn) Read(b []byte) (n int, err error) { return } dlen := int(binary.BigEndian.Uint16(bb[:])) + log.Log("[relay] read udp", dlen) if len(b) >= dlen { return io.ReadFull(c.Conn, b[:dlen]) } @@ -301,6 +306,12 @@ func (c *relayConn) Read(b []byte) (n int, err error) { return } +func (c *relayConn) ReadFrom(b []byte) (n int, addr net.Addr, err error) { + n, err = c.Read(b) + addr = c.Conn.RemoteAddr() + return +} + func (c *relayConn) Write(b []byte) (n int, err error) { if len(b) > 0xFFFF { err = errors.New("write: data maximum exceeded") @@ -314,6 +325,7 @@ func (c *relayConn) Write(b []byte) (n int, err error) { c.wbuf.Write(bb[:]) } c.wbuf.Write(b) // append the data to the cached header + log.Log("[relay] write wbuf", len(b)) // _, err = c.Conn.Write(c.wbuf.Bytes()) // c.wbuf.Reset() _, err = c.wbuf.WriteTo(c.Conn) @@ -327,5 +339,10 @@ func (c *relayConn) Write(b []byte) (n int, err error) { binary.BigEndian.PutUint16(buf[:2], uint16(len(b))) n = copy(buf[2:], b) _, err = c.Conn.Write(buf) + log.Log("[relay] write", n) return } + +func (c *relayConn) WriteTo(b []byte, addr net.Addr) (n int, err error) { + return c.Write(b) +} diff --git a/ss.go b/ss.go index 8aa5516..e3532fd 100644 --- a/ss.go +++ b/ss.go @@ -302,7 +302,13 @@ func (h *shadowUDPHandler) Handle(conn net.Conn) { log.Logf("[ssu] %s: %s", conn.LocalAddr(), err) return } - cc = c.(net.PacketConn) + var ok bool + cc, ok = c.(net.PacketConn) + if !ok { + log.Logf("[ssu] %s: not a packet connection", conn.LocalAddr()) + return + } + defer cc.Close() pc, ok := conn.(net.PacketConn) diff --git a/tuntap.go b/tuntap.go index 733c60a..8e429b6 100644 --- a/tuntap.go +++ b/tuntap.go @@ -173,7 +173,13 @@ func (h *tunHandler) Handle(conn net.Conn) { if err != nil { return err } - pc = cc.(net.PacketConn) + var ok bool + pc, ok = cc.(net.PacketConn) + if !ok { + err = errors.New("not a packet connection") + log.Logf("[tun] %s - %s: %s", conn.LocalAddr(), raddr, err) + return err + } } else { if h.options.TCPMode { if raddr != nil {