| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- package packetconn
- import (
- "golang.org/x/net/context"
- "github.com/v2fly/v2ray-core/v5/common"
- "github.com/v2fly/v2ray-core/v5/common/environment"
- "github.com/v2fly/v2ray-core/v5/common/net"
- "github.com/v2fly/v2ray-core/v5/common/serial"
- "github.com/v2fly/v2ray-core/v5/transport/internet"
- )
- type wrappedTransportEnvironment struct {
- environment.TransportEnvironment
- client *requestToPacketConnClient
- server *requestToPacketConnServer
- }
- func (w *wrappedTransportEnvironment) Listen(ctx context.Context, addr net.Addr, sockopt *internet.SocketConfig) (net.Listener, error) {
- return nil, newError("not implemented")
- }
- func (w *wrappedTransportEnvironment) ListenPacket(ctx context.Context, addr net.Addr, sockopt *internet.SocketConfig) (net.PacketConn, error) {
- packetConn := newWrappedPacketConn(ctx)
- w.server.onSessionReceiverReady(packetConn)
- return packetConn, nil
- }
- func (w *wrappedTransportEnvironment) Dial(ctx context.Context, source net.Address, destination net.Destination, sockopt *internet.SocketConfig) (net.Conn, error) {
- session, err := w.client.Dial()
- if err != nil {
- return nil, err
- }
- return newWrappedConn(session), nil
- }
- func (w *wrappedTransportEnvironment) Dialer() internet.SystemDialer {
- return w
- }
- func (w *wrappedTransportEnvironment) Listener() internet.SystemListener {
- return w
- }
- func newUDPAssemblerServerFromConfig(ctx context.Context, config *ServerConfig) (*udpAssemblerServer, error) {
- instance, err := serial.GetInstanceOf(config.UnderlyingTransportSetting)
- if err != nil {
- return nil, newError("failed to get instance of underlying transport").Base(err).AtError()
- }
- memcfg := &internet.MemoryStreamConfig{ProtocolName: config.UnderlyingTransportName, ProtocolSettings: instance}
- return newUDPAssemblerServer(ctx, config, memcfg), nil
- }
- func newUDPAssemblerClientFromConfig(ctx context.Context, config *ClientConfig) (*udpAssemblerClient, error) {
- instance, err := serial.GetInstanceOf(config.UnderlyingTransportSetting)
- if err != nil {
- return nil, newError("failed to get instance of underlying transport").Base(err).AtError()
- }
- memcfg := &internet.MemoryStreamConfig{ProtocolName: config.UnderlyingTransportName, ProtocolSettings: instance}
- return newUDPAssemblerClient(ctx, config, memcfg), nil
- }
- func init() {
- common.Must(common.RegisterConfig((*ServerConfig)(nil), func(ctx context.Context, config interface{}) (interface{}, error) {
- serverConfig, ok := config.(*ServerConfig)
- if !ok {
- return nil, newError("not a ServerConfig")
- }
- return newUDPAssemblerServerFromConfig(ctx, serverConfig)
- }))
- common.Must(common.RegisterConfig((*ClientConfig)(nil), func(ctx context.Context, config interface{}) (interface{}, error) {
- clientConfig, ok := config.(*ClientConfig)
- if !ok {
- return nil, newError("not a ClientConfig")
- }
- return newUDPAssemblerClientFromConfig(ctx, clientConfig)
- }))
- }
|