copy.go 978 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. package udp
  2. import (
  3. gonet "net"
  4. "github.com/v2fly/v2ray-core/v5/common/signal"
  5. "github.com/v2fly/v2ray-core/v5/transport/internet"
  6. )
  7. type dataHandler func(content []byte, address gonet.Addr)
  8. type copyHandler struct {
  9. onData []dataHandler
  10. }
  11. type CopyOption func(*copyHandler)
  12. func CopyPacketConn(dst internet.AbstractPacketConnWriter, src internet.AbstractPacketConnReader, options ...CopyOption) error {
  13. var handler copyHandler
  14. for _, option := range options {
  15. option(&handler)
  16. }
  17. var buffer [2048]byte
  18. for {
  19. n, addr, err := src.ReadFrom(buffer[:])
  20. if err != nil {
  21. return err
  22. }
  23. for _, handler := range handler.onData {
  24. handler(buffer[:n], addr)
  25. }
  26. _, err = dst.WriteTo(buffer[:n], addr)
  27. if err != nil {
  28. return err
  29. }
  30. }
  31. }
  32. func UpdateActivity(timer signal.ActivityUpdater) CopyOption {
  33. return func(handler *copyHandler) {
  34. handler.onData = append(handler.onData, func(content []byte, address gonet.Addr) {
  35. timer.Update()
  36. })
  37. }
  38. }