add 500ms Timeout to TcpChannel

This commit is contained in:
ig 2023-07-10 10:38:46 +02:00
parent 2a1e7cce93
commit 48fe29ef88
2 changed files with 32 additions and 11 deletions

View File

@ -106,11 +106,3 @@ public partial class DcDcRecord
// //
// #endregion IDcDc // #endregion IDcDc
} }

View File

@ -6,9 +6,15 @@ namespace InnovEnergy.Lib.Protocols.Modbus.Channels;
public class TcpChannel : ConnectionChannel<TcpClient> public class TcpChannel : ConnectionChannel<TcpClient>
{ {
private const Int32 TimeoutMs = 500; // TODO: parametrize
public TcpChannel(Ip4Address ip4Address,Boolean closeAfterSuccessfulRead = false, public TcpChannel(Ip4Address ip4Address,
Boolean closeAfterSuccessfulWrite = false) : this(ip4Address.Host, ip4Address.Port, closeAfterSuccessfulRead, closeAfterSuccessfulWrite) Boolean closeAfterSuccessfulRead = false,
Boolean closeAfterSuccessfulWrite = false) :
this(ip4Address.Host,
ip4Address.Port,
closeAfterSuccessfulRead,
closeAfterSuccessfulWrite)
{ {
} }
@ -18,7 +24,30 @@ public class TcpChannel : ConnectionChannel<TcpClient>
Boolean closeAfterSuccessfulRead = false, Boolean closeAfterSuccessfulRead = false,
Boolean closeAfterSuccessfulWrite = false) : base(closeAfterSuccessfulRead, closeAfterSuccessfulWrite) Boolean closeAfterSuccessfulWrite = false) : base(closeAfterSuccessfulRead, closeAfterSuccessfulWrite)
{ {
TcpClient Open() => new(hostname, port); TcpClient Open()
{
var tcpClient = new TcpClient
{
LingerState = new LingerOption(false, 0),
NoDelay = true,
ReceiveTimeout = TimeoutMs,
SendTimeout = TimeoutMs
};
var cts = new CancellationTokenSource();
var connected = tcpClient
.ConnectAsync(hostname, port, cts.Token)
.AsTask()
.Wait(TimeoutMs);
if (connected)
return tcpClient;
cts.Cancel();
throw new Exception($"Failed to connect to {hostname}:{port}");
}
_Open = Open; _Open = Open;
} }