Skip to content

Commit 698b45c

Browse files
committed
Merge branch 'develop'
2 parents 9eb25da + 9c08d36 commit 698b45c

File tree

11 files changed

+477
-80
lines changed

11 files changed

+477
-80
lines changed

.github/workflows/ci.yml

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
name: Wissance.Hydra CI
2+
3+
on:
4+
pull_request:
5+
branches: [develop, master]
6+
push:
7+
branches: [develop, master]
8+
9+
env:
10+
DOTNET_VERSION: '6.0.x'
11+
12+
permissions:
13+
contents: read
14+
issues: write
15+
16+
jobs:
17+
build-and-test:
18+
name: Building Wissance.Hydra and running Tests
19+
runs-on: ubuntu-latest
20+
steps:
21+
- uses: actions/checkout@v3
22+
- name: Set up .Net
23+
uses: actions/setup-dotnet@v3
24+
with:
25+
dotnet-version: ${{ env.DOTNET_VERSION }}
26+
- name: Install dependencies
27+
run: dotnet restore ./Wissance.Hydra/Wissance.Hydra
28+
- name: Build Solution
29+
run: dotnet build --configuration Release ./Wissance.Hydra/Wissance.Hydra
30+
#- name: Run Wissance.Hydra.Tcp.Tests
31+
# run: dotnet test -c Release ./Wissance.Hydra/Wissance.Hydra/Wissance.Hydra.Tcp.Tests/Wissance.Hydra.Tcp.Tests.csproj
32+
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFramework>net6.0</TargetFramework>
54
<ImplicitUsings>enable</ImplicitUsings>
65
<Nullable>enable</Nullable>
6+
<TargetFrameworks>net6.0;net8.0</TargetFrameworks>
77
</PropertyGroup>
88

99
</Project>

Wissance.Hydra/Wissance.Hydra/Wissance.Hydra.Tcp.Tests/TestUtils/TestTcpClient.cs

Lines changed: 83 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,19 @@
11
using System;
2+
using System.Net.Security;
23
using System.Net.Sockets;
4+
using System.Security.Cryptography.X509Certificates;
35
using System.Threading;
46

57
namespace 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

Comments
 (0)