service_wait.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. package trojan
  2. import (
  3. "encoding/binary"
  4. "github.com/sagernet/sing/common/buf"
  5. E "github.com/sagernet/sing/common/exceptions"
  6. M "github.com/sagernet/sing/common/metadata"
  7. N "github.com/sagernet/sing/common/network"
  8. "github.com/sagernet/sing/common/rw"
  9. )
  10. var _ N.PacketReadWaiter = (*PacketConn)(nil)
  11. func (c *PacketConn) InitializeReadWaiter(options N.ReadWaitOptions) (needCopy bool) {
  12. c.readWaitOptions = options
  13. return false
  14. }
  15. func (c *PacketConn) WaitReadPacket() (buffer *buf.Buffer, destination M.Socksaddr, err error) {
  16. destination, err = M.SocksaddrSerializer.ReadAddrPort(c.Conn)
  17. if err != nil {
  18. return nil, M.Socksaddr{}, E.Cause(err, "read destination")
  19. }
  20. var length uint16
  21. err = binary.Read(c.Conn, binary.BigEndian, &length)
  22. if err != nil {
  23. return nil, M.Socksaddr{}, E.Cause(err, "read chunk length")
  24. }
  25. err = rw.SkipN(c.Conn, 2)
  26. if err != nil {
  27. return nil, M.Socksaddr{}, E.Cause(err, "skip crlf")
  28. }
  29. buffer = c.readWaitOptions.NewPacketBuffer()
  30. _, err = buffer.ReadFullFrom(c.Conn, int(length))
  31. if err != nil {
  32. buffer.Release()
  33. return
  34. }
  35. c.readWaitOptions.PostReturn(buffer)
  36. return
  37. }