github.com/xxf098/lite-proxy@v0.15.1-0.20230422081941-12c69f323218/transport/dialer/system_listener.go (about)

     1  package dialer
     2  
     3  import (
     4  	"context"
     5  	"net"
     6  	"syscall"
     7  
     8  	"github.com/xxf098/lite-proxy/common"
     9  	"github.com/xxf098/lite-proxy/log"
    10  )
    11  
    12  var (
    13  	effectiveListener = DefaultListener{}
    14  )
    15  
    16  type DefaultListener struct {
    17  	controllers []controller
    18  }
    19  
    20  func getControlFunc(ctx context.Context, controllers []controller) func(network, address string, c syscall.RawConn) error {
    21  	return func(network, address string, c syscall.RawConn) error {
    22  		return c.Control(func(fd uintptr) {
    23  
    24  			setReusePort(fd) // nolint: staticcheck
    25  
    26  			for _, controller := range controllers {
    27  				if err := controller(network, address, fd); err != nil {
    28  					log.E("failed to apply external controller")
    29  					continue
    30  				}
    31  			}
    32  		})
    33  	}
    34  }
    35  
    36  // func setReusePort(fd uintptr) error {
    37  // 	if err := syscall.SetsockoptInt(int(fd), syscall.SOL_SOCKET, unix.SO_REUSEPORT, 1); err != nil {
    38  // 		return common.NewError("failed to set SO_REUSEPORT")
    39  // 	}
    40  // 	return nil
    41  // }
    42  
    43  func (dl *DefaultListener) ListenPacket(ctx context.Context, network, address string) (net.PacketConn, error) {
    44  	var lc net.ListenConfig
    45  
    46  	lc.Control = getControlFunc(ctx, dl.controllers)
    47  
    48  	return lc.ListenPacket(ctx, network, address)
    49  }
    50  
    51  func RegisterListenerController(controller func(network, address string, fd uintptr) error) error {
    52  	if controller == nil {
    53  		return common.NewError("nil listener controller")
    54  	}
    55  
    56  	effectiveListener.controllers = append(effectiveListener.controllers, controller)
    57  	return nil
    58  }