packet.go 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. package canceler
  2. import (
  3. "context"
  4. "time"
  5. "github.com/sagernet/sing/common"
  6. "github.com/sagernet/sing/common/buf"
  7. M "github.com/sagernet/sing/common/metadata"
  8. N "github.com/sagernet/sing/common/network"
  9. )
  10. type PacketConn struct {
  11. N.PacketConn
  12. instance *Instance
  13. }
  14. func NewPacketConn(ctx context.Context, conn N.PacketConn, timeout time.Duration) (context.Context, N.PacketConn) {
  15. ctx, cancel := context.WithCancel(ctx)
  16. instance := New(ctx, cancel, timeout)
  17. return ctx, &PacketConn{conn, instance}
  18. }
  19. func (c *PacketConn) ReadPacket(buffer *buf.Buffer) (destination M.Socksaddr, err error) {
  20. destination, err = c.PacketConn.ReadPacket(buffer)
  21. if err == nil {
  22. c.instance.Update()
  23. }
  24. return
  25. }
  26. func (c *PacketConn) WritePacket(buffer *buf.Buffer, destination M.Socksaddr) error {
  27. err := c.PacketConn.WritePacket(buffer, destination)
  28. if err == nil {
  29. c.instance.Update()
  30. }
  31. return err
  32. }
  33. func (c *PacketConn) Close() error {
  34. return common.Close(
  35. c.PacketConn,
  36. c.instance,
  37. )
  38. }
  39. func (c *PacketConn) Upstream() any {
  40. return c.PacketConn
  41. }