@@ -421,8 +421,13 @@ func (c *client) udphopDialer(addr *net.UDPAddr) (net.PacketConn, error) {
421421 return pktConn , nil
422422}
423423
424+ type dialerConf struct {
425+ net.Destination
426+ * internet.MemoryStreamConfig
427+ }
428+
424429type clientManager struct {
425- m map [string ]* client
430+ m map [dialerConf ]* client
426431 mutex sync.Mutex
427432}
428433
@@ -435,7 +440,8 @@ func (m *clientManager) clean() {
435440 }
436441}
437442
438- var manger * clientManager
443+ var manager * clientManager
444+ var initmanager sync.Once
439445
440446func Dial (ctx context.Context , dest net.Destination , streamSettings * internet.MemoryStreamConfig ) (stat.Connection , error ) {
441447 tlsConfig := tls .ConfigFromStreamSettings (streamSettings )
@@ -444,13 +450,24 @@ func Dial(ctx context.Context, dest net.Destination, streamSettings *internet.Me
444450 }
445451
446452 requireDatagram := hyCtx .RequireDatagramFromContext (ctx )
447- addr := dest .NetAddr ()
448453 config := streamSettings .ProtocolSettings .(* Config )
449454
450- manger .mutex .Lock ()
451- c , ok := manger .m [addr ]
455+ initmanager .Do (func () {
456+ manager = & clientManager {
457+ m : make (map [dialerConf ]* client ),
458+ }
459+ (& task.Periodic {
460+ Interval : 30 * time .Second ,
461+ Execute : func () error {
462+ manager .clean ()
463+ return nil
464+ },
465+ }).Start ()
466+ })
467+ manager .mutex .Lock ()
468+ dest .Network = net .Network_UDP
469+ c , ok := manager .m [dialerConf {Destination : dest , MemoryStreamConfig : streamSettings }]
452470 if ! ok {
453- dest .Network = net .Network_UDP
454471 c = & client {
455472 ctx : ctx ,
456473 dest : dest ,
@@ -460,30 +477,17 @@ func Dial(ctx context.Context, dest net.Destination, streamSettings *internet.Me
460477 udpmaskManager : streamSettings .UdpmaskManager ,
461478 quicParams : streamSettings .QuicParams ,
462479 }
463- manger .m [addr ] = c
480+ manager .m [dialerConf { Destination : dest , MemoryStreamConfig : streamSettings } ] = c
464481 }
465482 c .setCtx (ctx )
466- manger .mutex .Unlock ()
483+ manager .mutex .Unlock ()
467484
468485 if requireDatagram {
469486 return c .udp ()
470487 }
471488 return c .tcp ()
472489}
473490
474- func init () {
475- manger = & clientManager {
476- m : make (map [string ]* client ),
477- }
478- (& task.Periodic {
479- Interval : 30 * time .Second ,
480- Execute : func () error {
481- manger .clean ()
482- return nil
483- },
484- }).Start ()
485- }
486-
487491func init () {
488492 common .Must (internet .RegisterTransportDialer (protocolName , Dial ))
489493}
0 commit comments