OSDP.Net 5.2.1
A .NET library for implementing the Open Supervised Device Protocol (OSDP)
Loading...
Searching...
No Matches
TcpServerOsdpConnection.cs
1using System;
2using System.IO;
3using System.Net.Sockets;
4using System.Threading;
5using System.Threading.Tasks;
6using Microsoft.Extensions.Logging;
7
9{
20 {
21 private readonly TcpListener _listener;
22 private readonly ILogger _logger;
23 private TcpClient _tcpClient;
24 private NetworkStream _stream;
25
32 public TcpServerOsdpConnection(int portNumber, int baudRate, ILoggerFactory loggerFactory = null) : base(baudRate)
33 {
34 _listener = TcpListener.Create(portNumber);
35 _logger = loggerFactory?.CreateLogger<TcpServerOsdpConnection>();
36 }
37
39 public override bool IsOpen
40 {
41 get
42 {
43 var tcpClient = _tcpClient;
44 return tcpClient is { Connected: true };
45 }
46 }
47
49 public override async Task Open()
50 {
51 try
52 {
53 _listener.Start();
54 _logger?.LogInformation("TCP server listening on {@Endpoint} for device connections", _listener.LocalEndpoint);
55
56 var newTcpClient = await _listener.AcceptTcpClientAsync();
57 _logger?.LogInformation("Accepted device connection from {@RemoteEndpoint}", newTcpClient.Client.RemoteEndPoint);
58
59 // Close any existing connection before accepting the new one
60 await Close();
61
62 _tcpClient = newTcpClient;
63 _stream = _tcpClient.GetStream();
64 }
65 catch (Exception ex)
66 {
67 _logger?.LogError(ex, "Error opening TCP server connection");
68 throw;
69 }
70 }
71
73 public override Task Close()
74 {
75 try
76 {
77 _stream?.Dispose();
78 _tcpClient?.Dispose();
79 _stream = null;
80 _tcpClient = null;
81
82 _logger?.LogDebug("TCP server connection closed");
83 }
84 catch (Exception ex)
85 {
86 _logger?.LogWarning(ex, "Error closing TCP server connection");
87 }
88
89 return Task.CompletedTask;
90 }
91
93 public override async Task WriteAsync(byte[] buffer)
94 {
95 try
96 {
97 var stream = _stream;
98 if (stream != null)
99 {
100 await stream.WriteAsync(buffer, 0, buffer.Length).ConfigureAwait(false);
101 }
102 }
103 catch (Exception ex)
104 {
105 _logger?.LogWarning(ex, "Error writing to TCP stream");
106 // Don't set IsOpen to false here as the base class will handle a connection state
107 throw;
108 }
109 }
110
112 public override async Task<int> ReadAsync(byte[] buffer, CancellationToken token)
113 {
114 try
115 {
116 var stream = _stream;
117 if (stream != null)
118 {
119 var bytes = await stream.ReadAsync(buffer, 0, buffer.Length, token).ConfigureAwait(false);
120 if (bytes == 0)
121 {
122 _logger?.LogInformation("TCP stream closed by remote device");
123 }
124 return bytes;
125 }
126 return 0;
127 }
128 catch (Exception exception)
129 {
130 if (exception is not OperationCanceledException)
131 {
132 if (exception is IOException && exception.InnerException is SocketException)
133 {
134 _logger?.LogInformation("Device disconnected: {ExceptionMessage}", exception.Message);
135 }
136 else
137 {
138 _logger?.LogWarning(exception, "Error reading from TCP stream");
139 }
140 }
141 return 0;
142 }
143 }
144
146 public override string ToString()
147 {
148 return _listener?.LocalEndpoint.ToString() ?? "TcpServerOsdpConnection";
149 }
150
152 protected override void Dispose(bool disposing)
153 {
154 if (disposing)
155 {
156 var _ = Close();
157 _listener?.Stop();
158 }
159 base.Dispose(disposing);
160 }
161 }
162}
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.
TcpServerOsdpConnection(int portNumber, int baudRate, ILoggerFactory loggerFactory=null)
Initializes a new instance of the TcpServerOsdpConnection class.