packet.go 677 B

123456789101112131415161718192021222324252627282930313233343536
  1. package protocol
  2. import (
  3. "net"
  4. "github.com/Dreamacro/clash/common/pool"
  5. )
  6. type PacketConn struct {
  7. net.PacketConn
  8. Protocol
  9. }
  10. func (c *PacketConn) WriteTo(b []byte, addr net.Addr) (int, error) {
  11. buf := pool.GetBuffer()
  12. defer pool.PutBuffer(buf)
  13. err := c.EncodePacket(buf, b)
  14. if err != nil {
  15. return 0, err
  16. }
  17. _, err = c.PacketConn.WriteTo(buf.Bytes(), addr)
  18. return len(b), err
  19. }
  20. func (c *PacketConn) ReadFrom(b []byte) (int, net.Addr, error) {
  21. n, addr, err := c.PacketConn.ReadFrom(b)
  22. if err != nil {
  23. return n, addr, err
  24. }
  25. decoded, err := c.DecodePacket(b[:n])
  26. if err != nil {
  27. return n, addr, err
  28. }
  29. copy(b, decoded)
  30. return len(decoded), addr, nil
  31. }