Skip to content

Commit 9d7b95f

Browse files
Update UdpClientWrapper.cs
1 parent be98ee0 commit 9d7b95f

1 file changed

Lines changed: 80 additions & 59 deletions

File tree

Lines changed: 80 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,87 +1,108 @@
1-
using System;
2-
using System.Net;
1+
using System.Net;
32
using System.Net.Sockets;
43
using System.Security.Cryptography;
54
using System.Text;
6-
using System.Threading;
7-
using System.Threading.Tasks;
85
using System.Diagnostics.CodeAnalysis;
96

10-
11-
public class UdpClientWrapper : IUdpClient
7+
namespace NetSdrClientApp.Networking
128
{
13-
private readonly IPEndPoint _localEndPoint;
14-
private CancellationTokenSource? _cts;
15-
private UdpClient? _udpClient;
16-
17-
public event EventHandler<byte[]>? MessageReceived;
18-
19-
public UdpClientWrapper(int port)
9+
public class UdpClientWrapper : IUdpClient, IDisposable
2010
{
21-
_localEndPoint = new IPEndPoint(IPAddress.Any, port);
22-
}
11+
private readonly IPEndPoint _localEndPoint;
12+
private CancellationTokenSource? _cts;
13+
private UdpClient? _udpClient;
14+
private bool _disposed;
2315

24-
public async Task StartListeningAsync()
25-
{
26-
_cts = new CancellationTokenSource();
27-
Console.WriteLine("Start listening for UDP messages...");
16+
public event EventHandler<byte[]>? MessageReceived;
2817

29-
try
18+
public UdpClientWrapper(int port)
3019
{
31-
_udpClient = new UdpClient(_localEndPoint);
32-
while (!_cts.Token.IsCancellationRequested)
33-
{
34-
UdpReceiveResult result = await _udpClient.ReceiveAsync(_cts.Token);
35-
MessageReceived?.Invoke(this, result.Buffer);
20+
_localEndPoint = new IPEndPoint(IPAddress.Any, port);
21+
}
3622

37-
Console.WriteLine($"Received from {result.RemoteEndPoint}");
23+
[ExcludeFromCodeCoverage]
24+
public async Task StartListeningAsync()
25+
{
26+
_cts = new CancellationTokenSource();
27+
Console.WriteLine("Start listening for UDP messages...");
28+
29+
try
30+
{
31+
_udpClient = new UdpClient(_localEndPoint);
32+
while (!_cts.Token.IsCancellationRequested)
33+
{
34+
UdpReceiveResult result = await _udpClient.ReceiveAsync(_cts.Token);
35+
MessageReceived?.Invoke(this, result.Buffer);
36+
Console.WriteLine($"Received from {result.RemoteEndPoint}");
37+
}
38+
}
39+
catch (OperationCanceledException)
40+
{
41+
// Очікувана подія при зупинці
42+
}
43+
catch (Exception ex)
44+
{
45+
Console.WriteLine($"Error receiving message: {ex.Message}");
46+
}
47+
finally
48+
{
49+
_cts?.Dispose(); // Dispose для _cts
3850
}
3951
}
40-
catch (OperationCanceledException ex)
52+
53+
[ExcludeFromCodeCoverage]
54+
public void StopListening()
4155
{
42-
//empty
56+
SafeStop("Stopped listening for UDP messages.");
4357
}
44-
catch (Exception ex)
58+
59+
[ExcludeFromCodeCoverage]
60+
public void Exit()
4561
{
46-
Console.WriteLine($"Error receiving message: {ex.Message}");
62+
SafeStop("Stopped listening for UDP messages.");
4763
}
48-
}
4964

50-
[ExcludeFromCodeCoverage]
51-
public void StopListening()
52-
{
53-
SafeStop("Stopped listening for UDP messages.");
54-
}
55-
56-
[ExcludeFromCodeCoverage]
57-
public void Exit()
58-
{
59-
SafeStop("Stopped listening for UDP messages.");
60-
}
61-
62-
[ExcludeFromCodeCoverage]
63-
private void SafeStop(string message)
64-
{
65-
try
65+
[ExcludeFromCodeCoverage]
66+
private void SafeStop(string message)
6667
{
67-
_cts?.Cancel();
68-
_udpClient?.Close();
69-
Console.WriteLine(message);
68+
try
69+
{
70+
_cts?.Cancel();
71+
_udpClient?.Close();
72+
Console.WriteLine(message);
73+
}
74+
catch (Exception ex)
75+
{
76+
Console.WriteLine($"Error while stopping: {ex.Message}");
77+
}
7078
}
71-
catch (Exception ex)
79+
80+
public override int GetHashCode()
7281
{
73-
Console.WriteLine($"Error while stopping: {ex.Message}");
82+
var payload = $"{nameof(UdpClientWrapper)}|{_localEndPoint.Address}|{_localEndPoint.Port}";
83+
using var sha256 = SHA256.Create();
84+
var hash = sha256.ComputeHash(Encoding.UTF8.GetBytes(payload));
85+
return BitConverter.ToInt32(hash, 0);
7486
}
75-
}
7687

88+
public override bool Equals(object? obj)
89+
{
90+
if (obj is not UdpClientWrapper other)
91+
return false;
7792

78-
public override int GetHashCode()
79-
{
80-
var payload = $"{nameof(UdpClientWrapper)}|{_localEndPoint.Address}|{_localEndPoint.Port}";
93+
return _localEndPoint.Address.Equals(other._localEndPoint.Address)
94+
&& _localEndPoint.Port == other._localEndPoint.Port;
95+
}
8196

82-
using var md5 = MD5.Create();
83-
var hash = md5.ComputeHash(Encoding.UTF8.GetBytes(payload));
97+
public void Dispose()
98+
{
99+
if (_disposed) return;
84100

85-
return BitConverter.ToInt32(hash, 0);
101+
_cts?.Cancel();
102+
_cts?.Dispose();
103+
_udpClient?.Dispose();
104+
_disposed = true;
105+
GC.SuppressFinalize(this);
106+
}
86107
}
87108
}

0 commit comments

Comments
 (0)