From d1550435d3dbbe64cf96195cc9ddbdb428cbf0eb Mon Sep 17 00:00:00 2001 From: David Kallesen Date: Thu, 15 Feb 2024 12:07:31 +0100 Subject: [PATCH 1/3] feat: Add syncLock-Timeout for TcpClient --- src/Atc.Network/Tcp/TcpClient.cs | 21 ++++++++++++++++----- src/Atc.Network/Tcp/TcpConstants.cs | 13 +++++++++---- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/Atc.Network/Tcp/TcpClient.cs b/src/Atc.Network/Tcp/TcpClient.cs index 5345e51..86bdae5 100644 --- a/src/Atc.Network/Tcp/TcpClient.cs +++ b/src/Atc.Network/Tcp/TcpClient.cs @@ -21,6 +21,8 @@ public partial class TcpClient : ITcpClient private readonly TcpClientKeepAliveConfig clientKeepAliveConfig; private readonly byte[] receiveBuffer; + private readonly int syncLockConnectTimeoutInMs; + private readonly int syncLockSendTimeoutInMs; private int reconnectRetryCounter; private CancellationTokenSource? cancellationTokenSource; private CancellationTokenRegistration? cancellationTokenRegistration; @@ -61,10 +63,18 @@ private TcpClient( { this.logger = logger; this.clientConfig = clientConfig ?? new TcpClientConfig(); - this.clientReconnectConfig = reconnectConfig ?? new TcpClientReconnectConfig(); - this.clientKeepAliveConfig = keepAliveConfig ?? new TcpClientKeepAliveConfig(); + clientReconnectConfig = reconnectConfig ?? new TcpClientReconnectConfig(); + clientKeepAliveConfig = keepAliveConfig ?? new TcpClientKeepAliveConfig(); receiveBuffer = new byte[this.clientConfig.ReceiveBufferSize]; + + syncLockConnectTimeoutInMs = this.clientConfig.ConnectTimeout <= 0 + ? TcpConstants.DefaultConnectTimeout + : this.clientConfig.ConnectTimeout + TcpConstants.GracePeriodTimeout; + + syncLockSendTimeoutInMs = this.clientConfig.SendTimeout <= 0 + ? TcpConstants.DefaultSendReceiveTimeout + : this.clientConfig.SendTimeout + TcpConstants.GracePeriodTimeout; } public TcpClient( @@ -279,7 +289,8 @@ public async Task Send( LogDataSendingByteLength(IPAddressOrHostname, Port, data.Length); - await syncLock.WaitAsync(cancellationToken); + await syncLock.WaitAsync(syncLockSendTimeoutInMs, cancellationToken); + var disconnectedDueToException = false; try @@ -523,7 +534,7 @@ private async Task SetConnected( bool raiseEvents, CancellationToken cancellationToken = default) { - await syncLock.WaitAsync(cancellationToken); + await syncLock.WaitAsync(syncLockConnectTimeoutInMs, cancellationToken); try { @@ -549,7 +560,7 @@ private async Task SetDisconnected( bool dispose, CancellationToken cancellationToken = default) { - await syncLock.WaitAsync(cancellationToken); + await syncLock.WaitAsync(syncLockConnectTimeoutInMs, cancellationToken); try { diff --git a/src/Atc.Network/Tcp/TcpConstants.cs b/src/Atc.Network/Tcp/TcpConstants.cs index 5893117..9d853bf 100644 --- a/src/Atc.Network/Tcp/TcpConstants.cs +++ b/src/Atc.Network/Tcp/TcpConstants.cs @@ -9,12 +9,12 @@ public static class TcpConstants /// /// The connect time-out value, in milliseconds (10 sec). /// - public const int DefaultConnectTimeout = 10000; + public const int DefaultConnectTimeout = 10_000; /// - /// The send/receive time-out value, in milliseconds. + /// The send/receive time-out value, in milliseconds (5 min.). /// - public const int DefaultSendReceiveTimeout = 0; + public const int DefaultSendReceiveTimeout = 600_000; /// /// The send/receive buffer value, in bytes (8 Kb). @@ -24,10 +24,15 @@ public static class TcpConstants /// /// The reconnect retry interval value, in milliseconds (1 sec). /// - public const int DefaultReconnectRetryInterval = 1000; + public const int DefaultReconnectRetryInterval = 1_000; /// /// The reconnect retry max attempts value. /// public const int DefaultReconnectRetryMaxAttempts = 3600; + + /// + /// The grace period timeout, in milliseconds (1 sec). + /// + public const int GracePeriodTimeout = 1_000; } \ No newline at end of file From f102eb13b6ae1ed710aa6e3224b1f7071d6110de Mon Sep 17 00:00:00 2001 From: David Kallesen Date: Thu, 15 Feb 2024 12:07:42 +0100 Subject: [PATCH 2/3] feat: Add syncLock-Timeout for UdpClient --- src/Atc.Network/Udp/UdpClient.cs | 17 ++++++++++++++--- src/Atc.Network/Udp/UdpConstants.cs | 14 ++++++++++++-- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/Atc.Network/Udp/UdpClient.cs b/src/Atc.Network/Udp/UdpClient.cs index 6e95b40..3f634ca 100644 --- a/src/Atc.Network/Udp/UdpClient.cs +++ b/src/Atc.Network/Udp/UdpClient.cs @@ -11,6 +11,8 @@ public partial class UdpClient : IUdpClient private const int TimeToWaitForDisposeDisconnectionInMs = 50; private const int TimeToWaitForDataReceiverInMs = 150; + private readonly int syncLockConnectTimeoutInMs; + private readonly int syncLockSendTimeoutInMs; private readonly SemaphoreSlim syncLock = new(1, 1); private readonly UdpClientConfig clientConfig; private readonly ArraySegment receiveBufferSegment; @@ -51,6 +53,14 @@ private UdpClient( var receiveBuffer = new byte[this.clientConfig.ReceiveBufferSize]; receiveBufferSegment = new ArraySegment(receiveBuffer); + + syncLockConnectTimeoutInMs = this.clientConfig.ConnectTimeout <= 0 + ? UdpConstants.DefaultConnectTimeout + : this.clientConfig.ConnectTimeout + UdpConstants.GracePeriodTimeout; + + syncLockSendTimeoutInMs = this.clientConfig.SendTimeout <= 0 + ? UdpConstants.DefaultSendReceiveTimeout + : this.clientConfig.SendTimeout + UdpConstants.GracePeriodTimeout; } public UdpClient( @@ -179,8 +189,9 @@ public async Task Send( TerminationHelper.AppendTerminationBytesIfNeeded(ref data, terminationType); + await syncLock.WaitAsync(syncLockSendTimeoutInMs, cancellationToken); + var buffer = new ArraySegment(data); - await syncLock.WaitAsync(cancellationToken); var disconnectedDueToException = false; try @@ -377,7 +388,7 @@ private async Task SetConnected( bool raiseEvents, CancellationToken cancellationToken = default) { - await syncLock.WaitAsync(cancellationToken); + await syncLock.WaitAsync(syncLockConnectTimeoutInMs, cancellationToken); try { @@ -402,7 +413,7 @@ private async Task SetDisconnected( bool raiseEvents = true, CancellationToken cancellationToken = default) { - await syncLock.WaitAsync(cancellationToken); + await syncLock.WaitAsync(syncLockConnectTimeoutInMs, cancellationToken); try { diff --git a/src/Atc.Network/Udp/UdpConstants.cs b/src/Atc.Network/Udp/UdpConstants.cs index e8b50b3..f44e22b 100644 --- a/src/Atc.Network/Udp/UdpConstants.cs +++ b/src/Atc.Network/Udp/UdpConstants.cs @@ -7,12 +7,22 @@ namespace Atc.Network.Udp; public static class UdpConstants { /// - /// The send/receive time-out value, in milliseconds. + /// The connect time-out value, in milliseconds (10 sec). /// - public const int DefaultSendReceiveTimeout = 0; + public const int DefaultConnectTimeout = 10_000; + + /// + /// The send/receive time-out value, in milliseconds (5 min.). + /// + public const int DefaultSendReceiveTimeout = 600_000; /// /// The send/receive buffer value, in bytes. The default is 8192 (8 Kb); /// public const int DefaultBufferSize = 8192; + + /// + /// The grace period timeout, in milliseconds (1 sec). + /// + public const int GracePeriodTimeout = 1_000; } \ No newline at end of file From d21e56de9c5180d3686d186be2fab778c880e37c Mon Sep 17 00:00:00 2001 From: David Kallesen Date: Thu, 15 Feb 2024 12:07:56 +0100 Subject: [PATCH 3/3] docs: Update --- docs/CodeDoc/Atc.Network/Atc.Network.Tcp.md | 7 ++++++- docs/CodeDoc/Atc.Network/Atc.Network.Udp.md | 12 +++++++++++- docs/CodeDoc/Atc.Network/Atc.Network.md | 2 +- docs/CodeDoc/Atc.Network/IndexExtended.md | 5 ++++- 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/docs/CodeDoc/Atc.Network/Atc.Network.Tcp.md b/docs/CodeDoc/Atc.Network/Atc.Network.Tcp.md index 351ba5c..19dab81 100644 --- a/docs/CodeDoc/Atc.Network/Atc.Network.Tcp.md +++ b/docs/CodeDoc/Atc.Network/Atc.Network.Tcp.md @@ -499,7 +499,12 @@ This class contains default constant for `Atc.Network.Tcp.TcpClient` and `Atc.Ne >```csharp >int DefaultSendReceiveTimeout >``` ->Summary: The send/receive time-out value, in milliseconds. +>Summary: The send/receive time-out value, in milliseconds (5 min.). +#### GracePeriodTimeout +>```csharp +>int GracePeriodTimeout +>``` +>Summary: The grace period timeout, in milliseconds (1 sec).
diff --git a/docs/CodeDoc/Atc.Network/Atc.Network.Udp.md b/docs/CodeDoc/Atc.Network/Atc.Network.Udp.md index 182b388..6726116 100644 --- a/docs/CodeDoc/Atc.Network/Atc.Network.Udp.md +++ b/docs/CodeDoc/Atc.Network/Atc.Network.Udp.md @@ -365,11 +365,21 @@ This class contains default constant for `Atc.Network.Udp.UdpClient` and `Atc.Ne >int DefaultBufferSize >``` >Summary: The send/receive buffer value, in bytes. The default is 8192 (8 Kb); +#### DefaultConnectTimeout +>```csharp +>int DefaultConnectTimeout +>``` +>Summary: The connect time-out value, in milliseconds (10 sec). #### DefaultSendReceiveTimeout >```csharp >int DefaultSendReceiveTimeout >``` ->Summary: The send/receive time-out value, in milliseconds. +>Summary: The send/receive time-out value, in milliseconds (5 min.). +#### GracePeriodTimeout +>```csharp +>int GracePeriodTimeout +>``` +>Summary: The grace period timeout, in milliseconds (1 sec).
diff --git a/docs/CodeDoc/Atc.Network/Atc.Network.md b/docs/CodeDoc/Atc.Network/Atc.Network.md index 39622cc..4ad00b5 100644 --- a/docs/CodeDoc/Atc.Network/Atc.Network.md +++ b/docs/CodeDoc/Atc.Network/Atc.Network.md @@ -283,7 +283,7 @@ Enumeration: NetworkQualityCategoryType. >     `tcpClient`  -  The TCP client.
#### SetBufferSizeAndTimeouts >```csharp ->void SetBufferSizeAndTimeouts(this TcpClient tcpClient, int sendTimeout = 0, int sendBufferSize = 8192, int receiveTimeout = 0, int receiveBufferSize = 8192) +>void SetBufferSizeAndTimeouts(this TcpClient tcpClient, int sendTimeout = 600000, int sendBufferSize = 8192, int receiveTimeout = 600000, int receiveBufferSize = 8192) >``` >Summary: Sets the buffer size and timeouts. > diff --git a/docs/CodeDoc/Atc.Network/IndexExtended.md b/docs/CodeDoc/Atc.Network/IndexExtended.md index dc812d8..81bbc20 100644 --- a/docs/CodeDoc/Atc.Network/IndexExtended.md +++ b/docs/CodeDoc/Atc.Network/IndexExtended.md @@ -38,7 +38,7 @@ - [TcpClientExtensions](Atc.Network.md#tcpclientextensions) - Static Methods - DisableKeepAlive(this TcpClient tcpClient) - - SetBufferSizeAndTimeouts(this TcpClient tcpClient, int sendTimeout = 0, int sendBufferSize = 8192, int receiveTimeout = 0, int receiveBufferSize = 8192) + - SetBufferSizeAndTimeouts(this TcpClient tcpClient, int sendTimeout = 600000, int sendBufferSize = 8192, int receiveTimeout = 600000, int receiveBufferSize = 8192) - SetKeepAlive(this TcpClient tcpClient, int tcpKeepAliveTime = 2, int tcpKeepAliveInterval = 2, int tcpKeepAliveRetryCount = 5) - [TerminationType](Atc.Network.md#terminationtype) - [TransportProtocolType](Atc.Network.md#transportprotocoltype) @@ -335,6 +335,7 @@ - int DefaultReconnectRetryInterval - int DefaultReconnectRetryMaxAttempts - int DefaultSendReceiveTimeout + - int GracePeriodTimeout - [TcpServer](Atc.Network.Tcp.md#tcpserver) - Properties - IpAddress @@ -412,7 +413,9 @@ - [UdpConstants](Atc.Network.Udp.md#udpconstants) - Static Fields - int DefaultBufferSize + - int DefaultConnectTimeout - int DefaultSendReceiveTimeout + - int GracePeriodTimeout - [UdpServer](Atc.Network.Udp.md#udpserver) - Properties - IsRunning