@@ -43,8 +43,7 @@ public ClientSender(RemoteServerConfig config, TunnelStorage storage)
4343 LogHelper . Log . WriteLine ( "Tunnel watcher was created for " + config . TunnelHost ) ;
4444
4545 Task . Factory . StartNew ( ReceiveCycle ) ;
46- if ( config . KeepAlive )
47- Task . Factory . StartNew ( PingCycle ) ;
46+ Task . Factory . StartNew ( PingCycle ) ;
4847 if ( config . ConnectOnStart )
4948 Init ( ) ;
5049 IPAddress dummy ;
@@ -77,7 +76,6 @@ private void CheckHostChange()
7776
7877 private DateTime _lastInitRequest ;
7978
80-
8179 private void Init ( )
8280 {
8381 _lastInitRequest = DateTime . UtcNow ;
@@ -111,8 +109,8 @@ private void InitInternal()
111109
112110 _connectEP = destEP ;
113111
114- Storage . AddSession ( new byte [ 16 ] , destEP ) . IsClientSession = true ;
115112 Storage . IncrementEstabilishing ( ) ;
113+ Storage . AddSession ( new byte [ 16 ] , destEP ) . IsClientSession = true ;
116114
117115 if ( proxyEP != null )
118116 LogHelper . Log . WriteLine ( "Initializing connection to " + _config . ConnectHost + " via proxy " + proxyEP ) ;
@@ -179,13 +177,15 @@ private void InitInternal()
179177 if ( recLength < 4 || _receiveBuffer [ 0 ] != ( byte ) StateFlags . ConnectAnswer )
180178 {
181179 Console . Error . WriteLine ( "Invalid server response" ) ;
180+ Storage . RemoveSession ( destEP ) ;
182181 return ;
183182 }
184183
185184 var decLen = decryptHelper . Decrypt ( _receiveBuffer , 4 ) ;
186185 if ( decLen < 9 )
187186 {
188187 Console . Error . WriteLine ( "Invalid server response" ) ;
188+ Storage . RemoveSession ( destEP ) ;
189189 return ;
190190 }
191191
@@ -207,9 +207,27 @@ private void InitInternal()
207207
208208 private void PingCycle ( )
209209 {
210+ DateTime lastReceiveLast = DateTime . MinValue ;
210211 while ( ! _disposed )
211212 {
212- if ( _isInited ) _socket . Send ( new byte [ ] { ( byte ) StateFlags . Ping , 0 , 0 , 0 } , 4 , SocketFlags . None ) ;
213+ if ( _isInited )
214+ {
215+ // problem with server? no answers, dropping connection
216+ if ( Session . LastActivity == lastReceiveLast )
217+ {
218+ _isInited = false ;
219+ lastReceiveLast = DateTime . MinValue ;
220+ if ( _config . KeepAlive )
221+ Init ( ) ;
222+ }
223+
224+ if ( _config . KeepAlive || _lastSend . Subtract ( Session . LastActivity ) . TotalSeconds > _config . PingInterval )
225+ {
226+ lastReceiveLast = Session . LastActivity ;
227+ _socket . Send ( new byte [ ] { ( byte ) StateFlags . Ping , 0 , 0 , 0 } , 4 , SocketFlags . None ) ;
228+ _lastSend = DateTime . UtcNow ;
229+ }
230+ }
213231 else
214232 {
215233 // force renew connection attepmt
@@ -233,12 +251,15 @@ protected override void Send(byte[] packet, int packetLen)
233251 {
234252 var lenToSend = _encryptHelper . Encrypt ( packet , packetLen ) ;
235253 var packetToSend = _encryptHelper . InnerBuf ;
254+ _lastSend = DateTime . UtcNow ;
236255 _socket . Send ( packetToSend , lenToSend , SocketFlags . None ) ;
237256 }
238257 }
239258
240259 private readonly byte [ ] _receiveBuffer = new byte [ 65536 ] ;
241260
261+ private DateTime _lastSend ;
262+
242263 private void ReceiveCycle ( )
243264 {
244265 byte [ ] buf = _receiveBuffer ;
@@ -257,18 +278,20 @@ private void ReceiveCycle()
257278 }
258279 catch ( Exception ex )
259280 {
260- LogHelper . Log . WriteLine ( "Receive data error" ) ;
261- _isInited = false ;
262- // LogHelper.Log.WriteLine(ex);
263- if ( _socket != null )
281+ if ( _isIniting == 1 && _isInited )
264282 {
265- _socket . Dispose ( ) ;
266- _socket = null ;
283+ LogHelper . Log . WriteLine ( "Receive data error" ) ;
284+ _isInited = false ;
285+ // LogHelper.Log.WriteLine(ex);
286+ if ( _socket != null )
287+ {
288+ _socket . Dispose ( ) ;
289+ _socket = null ;
290+ }
291+
292+ if ( _config . KeepAlive ) Init ( ) ;
267293 }
268294
269- if ( _config . KeepAlive )
270- Init ( ) ;
271-
272295 Thread . Sleep ( 1000 ) ;
273296 continue ;
274297 }
@@ -277,7 +300,7 @@ private void ReceiveCycle()
277300 if ( len % 16 != 0 )
278301 {
279302 // in any case, this is error
280- // if (buf[0] == 0x3 )
303+ if ( buf [ 0 ] != ( byte ) StateFlags . Pong )
281304 {
282305 LogHelper . Log . WriteLine ( "Received an error flag from " + _socket . RemoteEndPoint ) ;
283306 _isInited = false ;
@@ -287,6 +310,8 @@ private void ReceiveCycle()
287310 }
288311 }
289312
313+ Session . UpdateLastActivity ( ) ;
314+
290315 var decryptHelper = Session . Decryptor ;
291316 var decLen = decryptHelper . Decrypt ( buf , 0 ) ;
292317 _packetWriter . Write ( decryptHelper . InnerBuf , decLen ) ;
0 commit comments