48 lines
1.4 KiB
C#
48 lines
1.4 KiB
C#
|
using System.Net.Sockets;
|
||
|
using InnovEnergy.Lib.Protocols.Modbus.Protocol;
|
||
|
|
||
|
namespace InnovEnergy.Lib.Protocols.Modbus.Channels;
|
||
|
|
||
|
public class TcpChannel : ConnectionChannel<TcpClient>
|
||
|
{
|
||
|
public TcpChannel(String hostname,
|
||
|
Int32 port,
|
||
|
Boolean closeAfterSuccessfulRead = false,
|
||
|
Boolean closeAfterSuccessfulWrite = false) : base(closeAfterSuccessfulRead, closeAfterSuccessfulWrite)
|
||
|
{
|
||
|
TcpClient Open() => new(hostname, port);
|
||
|
_Open = Open;
|
||
|
}
|
||
|
|
||
|
private readonly Func<TcpClient> _Open;
|
||
|
|
||
|
protected override TcpClient Open() => _Open();
|
||
|
protected override void Close(TcpClient tcpClient) => tcpClient.Close();
|
||
|
|
||
|
protected override IReadOnlyList<Byte> Read(TcpClient tcpClient, Int32 nToRead)
|
||
|
{
|
||
|
var buffer = new Byte[nToRead];
|
||
|
|
||
|
var stream = tcpClient.GetStream();
|
||
|
var nReceived = 0;
|
||
|
|
||
|
do
|
||
|
{
|
||
|
var nRemaining = nToRead - nReceived;
|
||
|
var read = stream.Read(buffer, nReceived, nRemaining);
|
||
|
if (read <= 0)
|
||
|
throw new NotConnectedException("The TCP Connection was closed");
|
||
|
|
||
|
nReceived += read;
|
||
|
}
|
||
|
while (nReceived < nToRead);
|
||
|
|
||
|
return buffer;
|
||
|
}
|
||
|
|
||
|
protected override void Write(TcpClient tcpClient, IReadOnlyList<Byte> data)
|
||
|
{
|
||
|
var array = data.ToArray();
|
||
|
tcpClient.GetStream().Write(array, 0, array.Length);
|
||
|
}
|
||
|
}
|