@@ -54,7 +54,7 @@ public PeerInformation() { }
5454 public RemoteCertificateValidationCallback RemoteCertificateValidationCallback ;
5555
5656 [ Obsolete ( "Use SessionId instead" ) ]
57- public Guid sessionId { get ; private set ; }
57+ private Guid sessionId ;
5858 public Guid SessionId => sessionId ;
5959
6060 public bool IsConnected { get => isConnected ; private set => isConnected = value ; }
@@ -80,15 +80,15 @@ public PeerInformation() { }
8080 private ConcurrentDictionary < Guid , IPEndPoint > punchedEndpoints = new ConcurrentDictionary < Guid , IPEndPoint > ( ) ;
8181 private ConcurrentDictionary < IPEndPoint , ConcurrentAesAlgorithm > peerCryptos = new ConcurrentDictionary < IPEndPoint , ConcurrentAesAlgorithm > ( ) ;
8282 private ClientStateManager < S > clientStateManager ;
83- public RelayClientBase ( X509Certificate2 clientCert )
83+ public RelayClientBase ( X509Certificate2 clientCert , int udpPort = 0 )
8484 {
8585 clientStateManager = new ClientStateManager < S > ( this ) ;
8686 tcpMessageClient = new SecureMessageClient < S > ( clientCert ) ;
8787 tcpMessageClient . OnMessageReceived += HandleMessageReceived ;
8888 tcpMessageClient . OnDisconnected += HandleDisconnect ;
8989 tcpMessageClient . RemoteCertificateValidationCallback += CertificateValidation ;
9090
91- udpServer = new ClientUdpModule < S > ( 0 ) ;
91+ udpServer = new ClientUdpModule < S > ( udpPort ) ;
9292 udpServer . SocketReceiveBufferSize = 12800000 ;
9393 udpServer . SocketSendBufferSize = 12800000 ;
9494 udpServer . OnBytesRecieved += HandleUdpBytesReceived ;
@@ -207,6 +207,19 @@ private void HandleDisconnect()
207207
208208 OnDisconnected ? . Invoke ( ) ;
209209 IsConnected = false ;
210+ foreach ( var item in RUdpModules )
211+ {
212+ foreach ( var m in item . Value )
213+ {
214+ m ? . Release ( ) ;
215+ }
216+ }
217+ RUdpModules . Clear ( ) ;
218+ foreach ( var item in JumboUdpModules )
219+ {
220+ item . Value ? . Release ( ) ;
221+ }
222+ JumboUdpModules . Clear ( ) ;
210223 }
211224
212225 }
@@ -400,6 +413,32 @@ private void SendUdpMesssageInternal<T>(Guid toId, MessageEnvelope message, T in
400413
401414 }
402415
416+ private void SendUdpMesssageInternal ( Guid toId , MessageEnvelope message , Action < PooledMemoryStream > serializationCallback )
417+ {
418+ ConcurrentAesAlgorithm algo ;
419+
420+ if ( punchedEndpoints . TryGetValue ( toId , out var endpoint ) )
421+ {
422+ algo = peerCryptos [ endpoint ] ;
423+ }
424+ else
425+ {
426+ endpoint = relayServerEndpoint ;
427+ algo = udpEncriptor ;
428+
429+ }
430+
431+ if ( ! udpServer . TrySendAsync ( endpoint , message , serializationCallback , algo , out var excessStream ) )
432+ {
433+ if ( JumboUdpModules . TryGetValue ( toId , out var mod ) )
434+ mod . Send ( excessStream . GetBuffer ( ) , 0 , excessStream . Position32 ) ;
435+ else
436+ MiniLogger . Log ( MiniLogger . LogLevel . Error , "Unable To find jumbo module with Id: " + toId + " in session " + sessionId ) ;
437+
438+ }
439+
440+ }
441+
403442
404443
405444 public void SendUdpMesssage ( Guid toId , MessageEnvelope message )
@@ -413,6 +452,17 @@ public void SendUdpMesssage(Guid toId, MessageEnvelope message)
413452
414453 }
415454
455+ public void SendUdpMesssage ( Guid toId , MessageEnvelope message , Action < PooledMemoryStream > serializationCallback )
456+ {
457+ if ( ! Peers . TryGetValue ( toId , out _ ) && toId != sessionId )
458+ return ;
459+ message . From = sessionId ;
460+ message . To = toId ;
461+
462+ SendUdpMesssageInternal ( toId , message , serializationCallback ) ;
463+
464+ }
465+
416466 public void SendUdpMesssage < T > ( Guid toId , MessageEnvelope message , T innerMessage )
417467 {
418468 if ( ! Peers . TryGetValue ( toId , out _ ) && toId != sessionId )
@@ -628,6 +678,8 @@ public void SendAsyncMessage(Guid toId, MessageEnvelope message)
628678 message . To = toId ;
629679 tcpMessageClient . SendAsyncMessage ( message ) ;
630680 }
681+
682+
631683 public void SendAsyncMessage < T > ( Guid toId , MessageEnvelope envelope , T message )
632684 {
633685 if ( ! Peers . TryGetValue ( toId , out _ ) && toId != sessionId )
@@ -864,9 +916,9 @@ private void HandleMessageReceived(MessageEnvelope message)
864916 }
865917 else
866918 {
867- if ( UdpAwaiter . IsWaiting ( message . MessageId ) )
919+ if ( Awaiter . IsWaiting ( message . MessageId ) )
868920 {
869- UdpAwaiter . ResponseArrived ( message ) ;
921+ Awaiter . ResponseArrived ( message ) ;
870922 }
871923 switch ( message . Header )
872924 {
@@ -1055,6 +1107,13 @@ protected internal void HandleUnRegistered(Guid peerId)
10551107 RemoveJudpModule ( peerId ) ;
10561108 pinger . PeerUnregistered ( peerId ) ;
10571109 PeerInfos . TryRemove ( peerId , out _ ) ;
1110+ if ( RUdpModules . TryRemove ( peerId , out var m ) )
1111+ foreach ( var item in m )
1112+ {
1113+ item ? . Release ( ) ;
1114+ }
1115+ if ( JumboUdpModules . TryRemove ( peerId , out var m1 ) )
1116+ m1 . Release ( ) ;
10581117 }
10591118 #endregion
10601119
@@ -1136,7 +1195,7 @@ private void RemoveRudpModule(Guid peer)
11361195 {
11371196 foreach ( var item in mod )
11381197 {
1139- item . Close ( ) ;
1198+ item . Release ( ) ;
11401199 }
11411200 }
11421201 }
@@ -1182,9 +1241,9 @@ private void HandleRUdpBytesReceived(byte[] arg1, int arg2, int arg3)
11821241 {
11831242 var msg = serialiser . DeserialiseEnvelopedMessage ( arg1 , arg2 , arg3 ) ;
11841243
1185- if ( UdpAwaiter . IsWaiting ( msg . MessageId ) )
1244+ if ( Awaiter . IsWaiting ( msg . MessageId ) )
11861245 {
1187- UdpAwaiter . ResponseArrived ( msg ) ;
1246+ Awaiter . ResponseArrived ( msg ) ;
11881247 }
11891248 else
11901249 HandleUdpMessageReceived ( msg ) ;
@@ -1256,15 +1315,15 @@ public void SendRudpMessage<T>(Guid to, MessageEnvelope msg, T innerMessage, Rud
12561315 SharerdMemoryStreamPool . ReturnStreamStatic ( stream ) ;
12571316 }
12581317 }
1259- GenericMessageAwaiter < MessageEnvelope > UdpAwaiter => tcpMessageClient . Awaiter ; //= new GenericMessageAwaiter<MessageEnvelope>();
1318+ GenericMessageAwaiter < MessageEnvelope > Awaiter => tcpMessageClient . Awaiter ; //= new GenericMessageAwaiter<MessageEnvelope>();
12601319 public Task < MessageEnvelope > SendRudpMessageAndWaitResponse ( Guid to , MessageEnvelope msg , int timeoutMs = 10000 , RudpChannel channel = RudpChannel . Ch1 )
12611320 {
12621321 if ( RUdpModules . TryGetValue ( to , out var mod ) )
12631322 {
12641323 msg . From = sessionId ;
12651324 msg . To = to ;
12661325 msg . MessageId = Guid . NewGuid ( ) ;
1267- var task = UdpAwaiter . RegisterWait ( msg . MessageId , timeoutMs ) ;
1326+ var task = Awaiter . RegisterWait ( msg . MessageId , timeoutMs ) ;
12681327
12691328 var stream = SharerdMemoryStreamPool . RentStreamStatic ( ) ;
12701329 serialiser . EnvelopeMessageWithBytesDontWritePayload ( stream , msg , msg . PayloadCount ) ;
@@ -1291,7 +1350,7 @@ public Task<MessageEnvelope> SendRudpMessageAndWaitResponse<T>(Guid to, MessageE
12911350 msg . From = sessionId ;
12921351 msg . To = to ;
12931352 msg . MessageId = Guid . NewGuid ( ) ;
1294- var task = UdpAwaiter . RegisterWait ( msg . MessageId , timeoutMs ) ;
1353+ var task = Awaiter . RegisterWait ( msg . MessageId , timeoutMs ) ;
12951354
12961355 var stream = SharerdMemoryStreamPool . RentStreamStatic ( ) ;
12971356 serialiser . EnvelopeMessageWithInnerMessage ( stream , msg , innerMessage ) ;
0 commit comments