11using System ;
2+ using System . Net . Security ;
23using System . Net . Sockets ;
4+ using System . Security . Cryptography . X509Certificates ;
35using System . Threading ;
46
57namespace Wissance . Hydra . Tcp . Tests . TestUtils
68{
79 public class TestTcpClient : IDisposable
810 {
911 public TestTcpClient ( Boolean isAsync , String server , UInt16 port , Int32 readTimeout = DefaultReadTimeout ,
10- Int32 writeTimeout = DefaultWriteTimeout , int connAttempts = 8 )
12+ Int32 writeTimeout = DefaultWriteTimeout , int connAttempts = 8 , Boolean isSecure = false )
1113 {
12- Init ( server , port , isAsync ) ;
14+ Init ( server , port , isAsync , isSecure ) ;
1315 _client = new TcpClient ( ) ;
16+ _client . ExclusiveAddressUse = false ;
1417 _readTimeout = readTimeout > 0 ? readTimeout : DefaultReadTimeout ;
1518 _writeTimeout = writeTimeout > 0 ? writeTimeout : DefaultWriteTimeout ;
1619 _client . ReceiveTimeout = _readTimeout ;
@@ -19,9 +22,9 @@ public TestTcpClient(Boolean isAsync, String server, UInt16 port, Int32 readTime
1922 _connAttempts = connAttempts ;
2023 }
2124
22- public Boolean Open ( String server , UInt16 port , Boolean isAsync = true )
25+ public Boolean Open ( String server , UInt16 port , Boolean isAsync = true , Boolean isSecure = false )
2326 {
24- Init ( server , port , isAsync ) ;
27+ Init ( server , port , isAsync , isSecure ) ;
2528 return Open ( ) ;
2629 }
2730
@@ -31,14 +34,14 @@ public Boolean Open()
3134 {
3235 try
3336 {
34- if ( _isAsync )
35- OpenAsync ( ) ;
36- else OpenSync ( ) ;
37- return _client . Connected ;
37+ bool result = _isAsync ? OpenAsync ( ) : OpenSync ( ) ;
38+ if ( result )
39+ return true ;
40+ Thread . Sleep ( 20 * ( attempt + 1 ) ) ;
3841 }
3942 catch ( Exception e )
4043 {
41- Thread . Sleep ( 20 ) ;
44+ Thread . Sleep ( 20 * ( attempt + 1 ) ) ;
4245 }
4346 }
4447 return false ;
@@ -72,35 +75,63 @@ public Boolean Write(Byte[] data)
7275 return WriteSync ( data ) ;
7376 }
7477
75- private void OpenSync ( )
78+ private bool OpenSync ( )
7679 {
77- _client . Connect ( _host , _port ) ;
80+ try
81+ {
82+ _client . Connect ( _host , _port ) ;
83+ return _client . Connected ;
84+ }
85+ catch ( Exception e )
86+ {
87+ return false ;
88+ }
89+
7890 }
7991
80- private void OpenAsync ( )
92+ private bool OpenAsync ( )
8193 {
82- _connectCompleted . Reset ( ) ;
83- _client . BeginConnect ( _host , _port , OpenAsyncCallback , _client ) ;
84- _connectCompleted . Wait ( DefaultConnectTimeout ) ;
94+ try
95+ {
96+ _connectCompleted . Reset ( ) ;
97+ _client . BeginConnect ( _host , _port , OpenAsyncCallback , _client ) ;
98+ _connectCompleted . Wait ( DefaultConnectTimeout ) ;
99+ return _client . Connected ;
100+ }
101+ catch ( Exception e )
102+ {
103+ return false ;
104+ }
105+
85106 }
86107
87- private void Init ( String server , UInt16 port , Boolean isAsync )
108+ private void Init ( String server , UInt16 port , Boolean isAsync , Boolean isSecure )
88109 {
89110 if ( String . IsNullOrEmpty ( server ) )
90111 throw new ArgumentNullException ( "server" ) ;
91112 _isAsync = isAsync ;
113+ _isSecure = isSecure ;
92114 _host = server ;
93115 _port = port ;
94116 }
95117
96118 private void OpenAsyncCallback ( IAsyncResult result )
97119 {
98- TcpClient client = ( result . AsyncState as TcpClient ) ;
99- if ( client == null )
100- // ReSharper disable once NotResolvedInText
101- throw new ArgumentNullException ( "client" ) ;
102- client . EndConnect ( result ) ;
103- _connectCompleted . Set ( ) ;
120+ try
121+ {
122+
123+ TcpClient client = ( result . AsyncState as TcpClient ) ;
124+ if ( client == null )
125+ // ReSharper disable once NotResolvedInText
126+ throw new ArgumentNullException ( "client" ) ;
127+ client . EndConnect ( result ) ;
128+ _connectCompleted . Set ( ) ;
129+
130+ }
131+ catch ( Exception e )
132+ {
133+ //do nothing yet
134+ }
104135 }
105136
106137 private Boolean WriteSync ( Byte [ ] data )
@@ -147,7 +178,7 @@ private Boolean ReadSync(Byte[] data, out Int32 bytesRead)
147178 {
148179 bytesRead = 0 ;
149180 _bytesRead = 0 ;
150- NetworkStream stream = _client . GetStream ( ) ;
181+ Stream stream = GetStream ( _client ) ;
151182 Int32 errorsNumber = 0 ;
152183 for ( Int32 retryNumber = 0 ; retryNumber < ReadRetriesNumber ; retryNumber ++ )
153184 {
@@ -174,7 +205,7 @@ private Boolean ReadSync(Byte[] data, out Int32 bytesRead)
174205 private Boolean ReadAsync ( Byte [ ] data , out Int32 bytesRead )
175206 {
176207 bytesRead = 0 ;
177- NetworkStream stream = _client . GetStream ( ) ;
208+ Stream stream = GetStream ( _client ) ;
178209 try
179210 {
180211 _bytesRead = 0 ;
@@ -190,7 +221,7 @@ private Boolean ReadAsync(Byte[] data, out Int32 bytesRead)
190221 bytesRead = _bytesRead ;
191222 return true ;
192223 }
193- catch ( Exception )
224+ catch ( Exception e )
194225 {
195226 return false ;
196227 }
@@ -202,16 +233,42 @@ private void ReadAsyncCallback(IAsyncResult result)
202233 if ( client == null )
203234 // ReSharper disable once NotResolvedInText
204235 throw new ArgumentNullException ( "client" ) ;
205- _bytesRead += client . GetStream ( ) . EndRead ( result ) ;
236+ _bytesRead += GetStream ( client ) . EndRead ( result ) ;
206237 _readCompleted . Set ( ) ;
207238 }
208239
240+ private Stream GetStream ( TcpClient client )
241+ {
242+ try
243+ {
244+ NetworkStream ns = client . GetStream ( ) ;
245+ if ( ! _isSecure )
246+ return ns ;
247+ SslStream sslStream = new SslStream ( ns , false , ValidateServerCertificate , null ) ;
248+ sslStream . AuthenticateAsClient ( _host ) ;
249+ return sslStream ;
250+ }
251+ catch ( Exception e )
252+ {
253+ return null ;
254+ }
255+
256+ }
257+
258+ public bool ValidateServerCertificate ( object sender , X509Certificate certificate ,
259+ X509Chain chain , SslPolicyErrors sslPolicyErrors )
260+ {
261+ return true ;
262+ }
263+
264+
209265 private const Int32 DefaultConnectTimeout = 2000 ;
210266 private const Int32 DefaultReadTimeout = 1000 ;
211267 private const Int32 DefaultWriteTimeout = 1000 ;
212268 private const Int32 ReadRetriesNumber = 16 ;
213269
214270 private Boolean _isAsync ;
271+ private Boolean _isSecure ;
215272 private String _host ;
216273 private UInt16 _port ;
217274 private readonly TcpClient _client ;
0 commit comments