11using System ;
2+ using System . Linq ;
3+ using System . Net ;
24using System . Net . Sockets ;
35using System . Threading ;
46using System . Threading . Tasks ;
@@ -17,8 +19,6 @@ public class ClientSender : BaseSender
1719
1820 private EncryptHelper _encryptHelper ;
1921
20- private DecryptHelper _decryptHelper ;
21-
2222 private readonly byte [ ] _serverKey ;
2323
2424 private readonly ManualResetEvent _initingEvent = new ManualResetEvent ( false ) ;
@@ -29,21 +29,47 @@ public class ClientSender : BaseSender
2929
3030 private readonly RemoteServerConfig _config ;
3131
32+ private IPEndPoint _connectEP ;
33+
3234 public ClientSender ( RemoteServerConfig config , TunnelStorage storage )
33- : base ( null , EndpointHelper . ParseEndPoint ( config . Address , 1 ) . Address , storage )
35+ : base ( null , EndpointHelper . ParseEndPoint ( config . TunnelHost , 1 ) . Address , storage )
3436 {
3537 storage . OutgoingConnectionAdresses . Add ( DstAddr ) ;
3638 _config = config ;
3739 _serverKey = PasswordHelper . GenerateKey ( config . Key ) ;
3840 _packetWriter = new PacketWriter ( ) ;
3941
40- LogHelper . Log . WriteLine ( "Tunnel watcher was created for " + config . Address ) ;
42+ LogHelper . Log . WriteLine ( "Tunnel watcher was created for " + config . TunnelHost ) ;
4143
4244 Task . Factory . StartNew ( ReceiveCycle ) ;
4345 if ( config . KeepAlive )
4446 Task . Factory . StartNew ( PingCycle ) ;
4547 if ( config . ConnectOnStart )
4648 Init ( ) ;
49+ IPAddress dummy ;
50+ if ( ! IPAddress . TryParse ( config . TunnelHost , out dummy ) )
51+ Task . Factory . StartNew ( CheckHostChange ) ;
52+ }
53+
54+ private void CheckHostChange ( )
55+ {
56+ // checking if target host has changed it ip address to other
57+ while ( ! _disposed )
58+ {
59+ var addresses = Dns . GetHostAddresses ( _config . TunnelHost ) ;
60+ if ( addresses . Length > 0 )
61+ {
62+ if ( ! addresses . Any ( x => x . Equals ( DstAddr ) ) )
63+ {
64+ Storage . OutgoingConnectionAdresses . Remove ( DstAddr ) ;
65+ DstAddr = addresses . First ( ) ;
66+ ReInitDivert ( DstAddr ) ;
67+ Storage . OutgoingConnectionAdresses . Add ( DstAddr ) ;
68+ }
69+ }
70+
71+ Thread . Sleep ( 60 * 1000 ) ;
72+ }
4773 }
4874
4975 private int _isIniting ;
@@ -66,17 +92,18 @@ private void InitInternal()
6692 var cs = new ClientHandshake ( ) ;
6793 var sendingPacketLen = cs . GetPacketForSending ( ) ;
6894 _encryptHelper = new EncryptHelper ( _serverKey ) ;
69- _decryptHelper = new DecryptHelper ( _serverKey ) ;
95+ var decryptHelper = new DecryptHelper ( _serverKey ) ;
96+
97+ var ep = EndpointHelper . ParseEndPoint ( _config . ConnectHost , 12017 ) ;
7098
71- var ep = EndpointHelper . ParseEndPoint ( _config . Address , 12017 ) ;
72- if ( ! ep . Address . Equals ( DstAddr ) )
99+ if ( ! ep . Equals ( _connectEP ) && _connectEP != null )
73100 {
74- Storage . OutgoingConnectionAdresses . Remove ( DstAddr ) ;
75- ReInitDivert ( ep . Address ) ;
76- Storage . OutgoingConnectionAdresses . Add ( DstAddr ) ;
101+ Storage . RemoveSession ( _connectEP ) ;
77102 }
78103
79- Storage . SetNewEndPoint ( new byte [ 16 ] , ep ) ;
104+ _connectEP = ep ;
105+
106+ Storage . AddSession ( new byte [ 16 ] , ep ) . IsClientSession = true ;
80107
81108 LogHelper . Log . WriteLine ( "Initializing connection to " + ep ) ;
82109
@@ -118,16 +145,18 @@ private void InitInternal()
118145 return ;
119146 }
120147
121- var decLen = _decryptHelper . Decrypt ( _receiveBuffer , 4 ) ;
148+ var decLen = decryptHelper . Decrypt ( _receiveBuffer , 4 ) ;
122149 if ( decLen < 9 )
123150 {
124151 Console . Error . WriteLine ( "Invalid server response" ) ;
125152 return ;
126153 }
127154
128- var sessionKey = cs . GetPacketFromServer ( _decryptHelper . InnerBuf , decLen ) ;
155+ var sessionKey = cs . GetPacketFromServer ( decryptHelper . InnerBuf , decLen ) ;
129156 _encryptHelper = new EncryptHelper ( sessionKey ) ;
130- _decryptHelper = new DecryptHelper ( sessionKey ) ;
157+ var session = Storage . GetSession ( ep ) ;
158+ session . Decryptor = new DecryptHelper ( sessionKey ) ;
159+ Session = session ;
131160 LogHelper . Log . WriteLine ( "Initialized connection to " + ep ) ;
132161 _isInited = true ;
133162 _initingEvent . Set ( ) ;
@@ -177,7 +206,19 @@ private void ReceiveCycle()
177206 if ( _disposed )
178207 return ;
179208
180- var len = _socket . Receive ( buf ) ;
209+ int len ;
210+
211+ try
212+ {
213+ len = _socket . Receive ( buf ) ;
214+ }
215+ catch ( Exception )
216+ {
217+ LogHelper . Log . WriteLine ( "Receive data error" ) ;
218+ Thread . Sleep ( 1000 ) ;
219+ continue ;
220+ }
221+
181222 // just drop data, assume that it is invalid
182223 if ( len % 16 != 0 )
183224 {
@@ -192,8 +233,9 @@ private void ReceiveCycle()
192233 }
193234 }
194235
195- var decLen = _decryptHelper . Decrypt ( buf , 0 ) ;
196- _packetWriter . Write ( _decryptHelper . InnerBuf , decLen ) ;
236+ var decryptHelper = Session . Decryptor ;
237+ var decLen = decryptHelper . Decrypt ( buf , 0 ) ;
238+ _packetWriter . Write ( decryptHelper . InnerBuf , decLen ) ;
197239 }
198240 }
199241
0 commit comments