3using System.Net.Sockets;
5using System.Threading.Tasks;
6using Microsoft.Extensions.Logging;
21 private readonly TcpListener _listener;
22 private readonly ILogger _logger;
23 private TcpClient _tcpClient;
24 private NetworkStream _stream;
34 _listener = TcpListener.Create(portNumber);
43 var tcpClient = _tcpClient;
44 return tcpClient is { Connected:
true };
49 public override async Task
Open()
54 _logger?.LogInformation(
"TCP server listening on {@Endpoint} for device connections", _listener.LocalEndpoint);
56 var newTcpClient = await _listener.AcceptTcpClientAsync();
57 _logger?.LogInformation(
"Accepted device connection from {@RemoteEndpoint}", newTcpClient.Client.RemoteEndPoint);
62 _tcpClient = newTcpClient;
63 _stream = _tcpClient.GetStream();
67 _logger?.LogError(ex,
"Error opening TCP server connection");
78 _tcpClient?.Dispose();
82 _logger?.LogDebug(
"TCP server connection closed");
86 _logger?.LogWarning(ex,
"Error closing TCP server connection");
89 return Task.CompletedTask;
100 await stream.WriteAsync(buffer, 0, buffer.Length).ConfigureAwait(
false);
105 _logger?.LogWarning(ex,
"Error writing to TCP stream");
112 public override async Task<int>
ReadAsync(
byte[] buffer, CancellationToken token)
116 var stream = _stream;
119 var bytes = await stream.ReadAsync(buffer, 0, buffer.Length, token).ConfigureAwait(
false);
122 _logger?.LogInformation(
"TCP stream closed by remote device");
128 catch (Exception exception)
130 if (exception is not OperationCanceledException)
132 if (exception is IOException && exception.InnerException is SocketException)
134 _logger?.LogInformation(
"Device disconnected: {ExceptionMessage}", exception.Message);
138 _logger?.LogWarning(exception,
"Error reading from TCP stream");
148 return _listener?.LocalEndpoint.ToString() ??
"TcpServerOsdpConnection";
152 protected override void Dispose(
bool disposing)
159 base.Dispose(disposing);
OsdpConnection(int baudRate)
Creates an instance of OsdpConnection.
override async Task< int > ReadAsync(byte[] buffer, CancellationToken token)
Read from connection.Number of actual bytes read
override bool IsOpen
Is the connection open and ready to communicate.
override async Task WriteAsync(byte[] buffer)
Write to connection.
override void Dispose(bool disposing)
Disposes the OsdpConnection instance.This method is responsible for releasing any resources used by t...
override Task Close()
Close the connection for communications.
override async Task Open()
Open the connection for communications.
override string ToString()
TcpServerOsdpConnection(int portNumber, int baudRate, ILoggerFactory loggerFactory=null)
Initializes a new instance of the TcpServerOsdpConnection class.