@@ -32,7 +32,6 @@ internal class MRPConnection : IConnection
3232
3333 ConcurrentDictionary < ( ushort , ushort ) , Retransmission > Retransmissions = new ConcurrentDictionary < ( ushort , ushort ) , Retransmission > ( ) ;
3434 ConcurrentDictionary < ushort , uint > AckTable = new ConcurrentDictionary < ushort , uint > ( ) ;
35- Channel < Frame > channel = Channel . CreateUnbounded < Frame > ( ) ;
3635 CancellationTokenSource cts = new CancellationTokenSource ( ) ;
3736
3837 UdpClient client ;
@@ -70,7 +69,7 @@ public async Task SendFrame(Exchange exchange, Frame frame, bool reliable)
7069 }
7170 }
7271 }
73- Console . WriteLine ( " SENT: " + frame . ToString ( ) ) ;
72+ Console . WriteLine ( DateTime . Now . ToString ( "h:mm:ss" ) + " SENT: " + frame . ToString ( ) ) ;
7473 await client . SendAsync ( writer . GetPayload ( ) ) ;
7574 exchange . Session . Timestamp = DateTime . Now ;
7675 while ( reliable )
@@ -111,22 +110,22 @@ public async Task SendAck(SessionContext? session, ushort exchange, uint counter
111110 ack . Message . ExchangeID = exchange ;
112111 ack . Message . Flags = ExchangeFlags . Acknowledgement ;
113112 if ( initiator )
113+ {
114+ ack . Flags |= MessageFlags . SourceNodeID ;
114115 ack . Message . Flags |= ExchangeFlags . Initiator ;
116+ }
117+ else
118+ ack . Flags |= MessageFlags . DestinationNodeID ;
115119 ack . Message . AckCounter = counter ;
116120 ack . Message . Protocol = Payloads . ProtocolType . SecureChannel ;
117121 PayloadWriter writer = new PayloadWriter ( Frame . MAX_SIZE + 4 ) ;
118122 ack . Serialize ( writer , session ! ) ;
119123 if ( AckTable . TryGetValue ( exchange , out uint ctr ) && ctr == counter )
120124 AckTable . TryRemove ( exchange , out _ ) ;
121- Console . WriteLine ( " Sent standalone ack: " + ack . ToString ( ) ) ;
125+ Console . WriteLine ( DateTime . Now . ToString ( "h:mm:ss" ) + " Sent standalone ack: " + ack . ToString ( ) ) ;
122126 await client . SendAsync ( writer . GetPayload ( ) ) ;
123127 }
124128
125- public async Task < Frame > Read ( )
126- {
127- return await channel . Reader . ReadAsync ( ) ;
128- }
129-
130129 public async Task Run ( )
131130 {
132131 try
@@ -135,10 +134,20 @@ public async Task Run()
135134 {
136135 UdpReceiveResult result = await client . ReceiveAsync ( ) ;
137136 Frame frame = new Frame ( result . Buffer ) ;
137+ if ( ! frame . Valid )
138+ {
139+ Console . WriteLine ( "Invalid frame received" ) ;
140+ continue ;
141+ }
142+ SessionContext ? session = SessionManager . GetSession ( frame . SessionID ) ;
143+ bool ack = false ;
138144 if ( ( frame . Message . Flags & ExchangeFlags . Reliability ) == ExchangeFlags . Reliability )
139145 {
140146 if ( ! AckTable . TryAdd ( frame . Message . ExchangeID , frame . Counter ) )
141- await SendAck ( SessionManager . GetSession ( frame . SessionID ) , frame . Message . ExchangeID , frame . Counter , ( frame . Message . Flags & ExchangeFlags . Initiator ) == 0 ) ;
147+ {
148+ ack = true ;
149+ await SendAck ( session , frame . Message . ExchangeID , frame . Counter , ( frame . Message . Flags & ExchangeFlags . Initiator ) == 0 ) ;
150+ }
142151 }
143152 if ( ( frame . Message . Flags & ExchangeFlags . Acknowledgement ) == ExchangeFlags . Acknowledgement )
144153 {
@@ -148,20 +157,23 @@ public async Task Run()
148157 transmission . Ack . Release ( ) ;
149158 }
150159 }
151- if ( frame . SessionID != 0 )
152- SessionManager . SessionActive ( frame . SessionID ) ;
153- Console . WriteLine ( "Received: " + frame . ToString ( ) ) ;
154- channel . Writer . TryWrite ( frame ) ;
160+ Console . WriteLine ( DateTime . Now . ToString ( "h:mm:ss" ) + " Received: " + frame . ToString ( ) ) ;
161+ if ( session == null )
162+ {
163+ Console . WriteLine ( "Unknown Session: " + frame . SessionID ) ;
164+ continue ;
165+ }
166+ if ( ! session . ProcessFrame ( frame ) && ! ack )
167+ await SendAck ( session , frame . Message . ExchangeID , frame . Counter , ( frame . Message . Flags & ExchangeFlags . Initiator ) == 0 ) ;
168+
169+ session . Timestamp = DateTime . Now ;
170+ session . LastActive = DateTime . Now ;
155171 }
156172 }
157173 catch ( Exception e )
158174 {
159175 Console . WriteLine ( e . ToString ( ) ) ;
160176 }
161- finally
162- {
163- channel . Writer . Complete ( ) ;
164- }
165177 }
166178
167179 public async Task CloseExchange ( Exchange exchange )
0 commit comments