| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- package udp
- import (
- gonet "net"
- "github.com/v2fly/v2ray-core/v5/common/signal"
- "github.com/v2fly/v2ray-core/v5/transport/internet"
- )
- type dataHandler func(content []byte, address gonet.Addr)
- type copyHandler struct {
- onData []dataHandler
- }
- type CopyOption func(*copyHandler)
- func CopyPacketConn(dst internet.AbstractPacketConnWriter, src internet.AbstractPacketConnReader, options ...CopyOption) error {
- var handler copyHandler
- for _, option := range options {
- option(&handler)
- }
- var buffer [2048]byte
- for {
- n, addr, err := src.ReadFrom(buffer[:])
- if err != nil {
- return err
- }
- for _, handler := range handler.onData {
- handler(buffer[:n], addr)
- }
- _, err = dst.WriteTo(buffer[:n], addr)
- if err != nil {
- return err
- }
- }
- }
- func UpdateActivity(timer signal.ActivityUpdater) CopyOption {
- return func(handler *copyHandler) {
- handler.onData = append(handler.onData, func(content []byte, address gonet.Addr) {
- timer.Update()
- })
- }
- }
|