|
|
@@ -0,0 +1,84 @@
|
|
|
+package systemnetworkimpl
|
|
|
+
|
|
|
+import (
|
|
|
+ "context"
|
|
|
+
|
|
|
+ "github.com/v2fly/v2ray-core/v5/common/environment"
|
|
|
+ "github.com/v2fly/v2ray-core/v5/common/net"
|
|
|
+ "github.com/v2fly/v2ray-core/v5/transport/internet"
|
|
|
+)
|
|
|
+
|
|
|
+func NewSystemNetworkImpl(listener internet.SystemListener, dialer internet.SystemDialer) environment.SystemNetworkCapabilitySet {
|
|
|
+ return &systemNetworkImpl{dialer: dialer, listener: listener}
|
|
|
+}
|
|
|
+
|
|
|
+type systemDefaultDialer struct{}
|
|
|
+
|
|
|
+func (s systemDefaultDialer) Listen(ctx context.Context, addr net.Addr, sockopt *internet.SocketConfig) (net.Listener, error) {
|
|
|
+ return internet.ListenSystem(ctx, addr, sockopt)
|
|
|
+}
|
|
|
+
|
|
|
+func (s systemDefaultDialer) ListenPacket(ctx context.Context, addr net.Addr, sockopt *internet.SocketConfig) (net.PacketConn, error) {
|
|
|
+ return internet.ListenSystemPacket(ctx, addr, sockopt)
|
|
|
+}
|
|
|
+
|
|
|
+func (s systemDefaultDialer) Dial(ctx context.Context, source net.Address, destination net.Destination, sockopt *internet.SocketConfig) (net.Conn, error) {
|
|
|
+ return internet.DialSystem(ctx, destination, sockopt)
|
|
|
+}
|
|
|
+
|
|
|
+func NewSystemNetworkDefault() environment.SystemNetworkCapabilitySet {
|
|
|
+ systemDefault := systemDefaultDialer{}
|
|
|
+ return &systemNetworkImpl{dialer: systemDefault, listener: systemDefault}
|
|
|
+}
|
|
|
+
|
|
|
+type systemNetworkImpl struct {
|
|
|
+ listener internet.SystemListener
|
|
|
+ dialer internet.SystemDialer
|
|
|
+}
|
|
|
+
|
|
|
+func (s systemNetworkImpl) Dialer() internet.SystemDialer {
|
|
|
+ return s.dialer
|
|
|
+}
|
|
|
+
|
|
|
+func (s systemNetworkImpl) Listener() internet.SystemListener {
|
|
|
+ return s.listener
|
|
|
+}
|
|
|
+
|
|
|
+func NewSystemListenerWithDefaultOpt(listener internet.SystemListener, opt *internet.SocketConfig) internet.SystemListener {
|
|
|
+ return systemListenerWithDefaultOpt{SystemListener: listener, opt: opt}
|
|
|
+}
|
|
|
+
|
|
|
+type systemListenerWithDefaultOpt struct {
|
|
|
+ internet.SystemListener
|
|
|
+ opt *internet.SocketConfig
|
|
|
+}
|
|
|
+
|
|
|
+func (s systemListenerWithDefaultOpt) Listen(ctx context.Context, addr net.Addr, sockopt *internet.SocketConfig) (net.Listener, error) {
|
|
|
+ if sockopt == nil {
|
|
|
+ return s.Listen(ctx, addr, s.opt)
|
|
|
+ }
|
|
|
+ return s.Listen(ctx, addr, sockopt)
|
|
|
+}
|
|
|
+
|
|
|
+func (s systemListenerWithDefaultOpt) ListenPacket(ctx context.Context, addr net.Addr, sockopt *internet.SocketConfig) (net.PacketConn, error) {
|
|
|
+ if sockopt == nil {
|
|
|
+ return s.ListenPacket(ctx, addr, s.opt)
|
|
|
+ }
|
|
|
+ return s.ListenPacket(ctx, addr, sockopt)
|
|
|
+}
|
|
|
+
|
|
|
+func NewSystemDialerWithDefaultOpt(listener internet.SystemDialer, opt *internet.SocketConfig) internet.SystemDialer {
|
|
|
+ return systemDialerWithDefaultOpt{SystemDialer: listener, opt: opt}
|
|
|
+}
|
|
|
+
|
|
|
+type systemDialerWithDefaultOpt struct {
|
|
|
+ internet.SystemDialer
|
|
|
+ opt *internet.SocketConfig
|
|
|
+}
|
|
|
+
|
|
|
+func (s systemDialerWithDefaultOpt) Dial(ctx context.Context, source net.Address, destination net.Destination, sockopt *internet.SocketConfig) (net.Conn, error) {
|
|
|
+ if sockopt == nil {
|
|
|
+ return s.Dial(ctx, source, destination, s.opt)
|
|
|
+ }
|
|
|
+ return s.Dial(ctx, source, destination, sockopt)
|
|
|
+}
|