udpassemblerClient.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package packetconn
  2. import (
  3. "io"
  4. gonet "net"
  5. "sync"
  6. "time"
  7. "golang.org/x/net/context"
  8. "github.com/v2fly/v2ray-core/v5/common/environment"
  9. "github.com/v2fly/v2ray-core/v5/common/environment/envctx"
  10. "github.com/v2fly/v2ray-core/v5/common/net"
  11. "github.com/v2fly/v2ray-core/v5/transport/internet"
  12. "github.com/v2fly/v2ray-core/v5/transport/internet/request"
  13. )
  14. type udpAssemblerClient struct {
  15. ctx context.Context
  16. streamSettings *internet.MemoryStreamConfig
  17. assembly request.TransportClientAssembly
  18. req2connc *requestToPacketConnClient
  19. }
  20. func (u *udpAssemblerClient) NewSession(ctx context.Context, opts ...request.SessionOption) (request.Session, error) {
  21. return u.dial(net.Destination{})
  22. }
  23. func (u *udpAssemblerClient) OnTransportClientAssemblyReady(assembly request.TransportClientAssembly) {
  24. u.assembly = assembly
  25. u.req2connc.OnTransportClientAssemblyReady(assembly)
  26. }
  27. func newWrappedConn(in io.ReadWriteCloser) net.Conn {
  28. return wrappedConn{in}
  29. }
  30. type wrappedConn struct {
  31. io.ReadWriteCloser
  32. }
  33. func (w wrappedConn) LocalAddr() gonet.Addr {
  34. return nil
  35. }
  36. func (w wrappedConn) RemoteAddr() gonet.Addr {
  37. return nil
  38. }
  39. func (w wrappedConn) SetDeadline(t time.Time) error {
  40. return nil
  41. }
  42. func (w wrappedConn) SetReadDeadline(t time.Time) error {
  43. return nil
  44. }
  45. func (w wrappedConn) SetWriteDeadline(t time.Time) error {
  46. return nil
  47. }
  48. func newWrappedPacketConn(ctx context.Context) *wrappedPacketConn {
  49. ctxWithCancel, cancel := context.WithCancel(ctx)
  50. return &wrappedPacketConn{
  51. conn: make(map[string]*serverSession),
  52. readChan: make(chan packet, 16), ctx: ctxWithCancel, finish: cancel, connLock: &sync.Mutex{},
  53. }
  54. }
  55. func newUDPAssemblerClient(ctx context.Context, config *ClientConfig, streamSettings *internet.MemoryStreamConfig) *udpAssemblerClient {
  56. transportEnvironment := envctx.EnvironmentFromContext(ctx).(environment.TransportEnvironment)
  57. transportEnvironmentWrapped := &wrappedTransportEnvironment{TransportEnvironment: transportEnvironment}
  58. transportEnvironmentWrapped.client, _ = newRequestToPacketConnClient(ctx, config)
  59. wrappedContext := envctx.ContextWithEnvironment(ctx, transportEnvironmentWrapped)
  60. return &udpAssemblerClient{ctx: wrappedContext, streamSettings: streamSettings, req2connc: transportEnvironmentWrapped.client}
  61. }
  62. func (u *udpAssemblerClient) dial(dest net.Destination) (internet.Connection, error) {
  63. _ = dest
  64. return internet.Dial(u.ctx, net.TCPDestination(net.LocalHostIP, 0), u.streamSettings)
  65. }