diff --git a/Source/MQTTnet.AspnetCore/MqttConnectionContext.cs b/Source/MQTTnet.AspnetCore/MqttConnectionContext.cs index c16e5f483..61184c4d5 100644 --- a/Source/MQTTnet.AspnetCore/MqttConnectionContext.cs +++ b/Source/MQTTnet.AspnetCore/MqttConnectionContext.cs @@ -61,21 +61,21 @@ public X509Certificate2 ClientCertificate } } - public string Endpoint + public EndPoint RemoteEndPoint { get { // mqtt over tcp if (_connection.RemoteEndPoint != null) { - return _connection.RemoteEndPoint.ToString(); + return _connection.RemoteEndPoint; } // mqtt over websocket var httpFeature = _connection.Features.Get(); if (httpFeature?.RemoteIpAddress != null) { - return new IPEndPoint(httpFeature.RemoteIpAddress, httpFeature.RemotePort).ToString(); + return new IPEndPoint(httpFeature.RemoteIpAddress, httpFeature.RemotePort); } return null; diff --git a/Source/MQTTnet.AspnetCore/MqttWebSocketServerAdapter.cs b/Source/MQTTnet.AspnetCore/MqttWebSocketServerAdapter.cs index 272ead6bf..18a382a12 100644 --- a/Source/MQTTnet.AspnetCore/MqttWebSocketServerAdapter.cs +++ b/Source/MQTTnet.AspnetCore/MqttWebSocketServerAdapter.cs @@ -3,6 +3,7 @@ // See the LICENSE file in the project root for more information. using System; +using System.Net; using System.Net.WebSockets; using System.Threading.Tasks; using Microsoft.AspNetCore.Http; @@ -28,7 +29,8 @@ public async Task RunWebSocketConnectionAsync(WebSocket webSocket, HttpContext h { ArgumentNullException.ThrowIfNull(webSocket); - var endpoint = $"{httpContext.Connection.RemoteIpAddress}:{httpContext.Connection.RemotePort}"; + var remoteAddress = httpContext.Connection.RemoteIpAddress; + var remoteEndPoint = remoteAddress == null ? null : new IPEndPoint(remoteAddress, httpContext.Connection.RemotePort); var clientCertificate = await httpContext.Connection.GetClientCertificateAsync().ConfigureAwait(false); try @@ -39,7 +41,7 @@ public async Task RunWebSocketConnectionAsync(WebSocket webSocket, HttpContext h if (clientHandler != null) { var formatter = new MqttPacketFormatterAdapter(new MqttBufferWriter(4096, 65535)); - var channel = new MqttWebSocketChannel(webSocket, endpoint, isSecureConnection, clientCertificate); + var channel = new MqttWebSocketChannel(webSocket, remoteEndPoint, isSecureConnection, clientCertificate); using (var channelAdapter = new MqttChannelAdapter(channel, formatter, _logger)) { diff --git a/Source/MQTTnet.Benchmarks/SerializerBenchmark.cs b/Source/MQTTnet.Benchmarks/SerializerBenchmark.cs index 0ddea15f1..48117232c 100644 --- a/Source/MQTTnet.Benchmarks/SerializerBenchmark.cs +++ b/Source/MQTTnet.Benchmarks/SerializerBenchmark.cs @@ -15,6 +15,7 @@ using BenchmarkDotNet.Jobs; using MQTTnet.Diagnostics.Logger; using System.Buffers; +using System.Net; namespace MQTTnet.Benchmarks { @@ -76,7 +77,7 @@ public BenchmarkMqttChannel(ArraySegment buffer) _position = _buffer.Offset; } - public string Endpoint { get; } = string.Empty; + public EndPoint RemoteEndPoint { get; set; } public bool IsSecureConnection { get; } = false; diff --git a/Source/MQTTnet.Server/Events/ClientConnectedEventArgs.cs b/Source/MQTTnet.Server/Events/ClientConnectedEventArgs.cs index 216f96efb..27701db6f 100644 --- a/Source/MQTTnet.Server/Events/ClientConnectedEventArgs.cs +++ b/Source/MQTTnet.Server/Events/ClientConnectedEventArgs.cs @@ -5,6 +5,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Net; using MQTTnet.Formatter; using MQTTnet.Packets; @@ -14,11 +15,11 @@ public sealed class ClientConnectedEventArgs : EventArgs { readonly MqttConnectPacket _connectPacket; - public ClientConnectedEventArgs(MqttConnectPacket connectPacket, MqttProtocolVersion protocolVersion, string endpoint, IDictionary sessionItems) + public ClientConnectedEventArgs(MqttConnectPacket connectPacket, MqttProtocolVersion protocolVersion, EndPoint remoteEndPoint, IDictionary sessionItems) { _connectPacket = connectPacket ?? throw new ArgumentNullException(nameof(connectPacket)); ProtocolVersion = protocolVersion; - Endpoint = endpoint; + RemoteEndPoint = remoteEndPoint; SessionItems = sessionItems ?? throw new ArgumentNullException(nameof(sessionItems)); } @@ -35,7 +36,10 @@ public ClientConnectedEventArgs(MqttConnectPacket connectPacket, MqttProtocolVer /// /// Gets the endpoint of the connected client. /// - public string Endpoint { get; } + public EndPoint RemoteEndPoint { get; } + + [Obsolete("Use RemoteEndPoint instead.")] + public string Endpoint => RemoteEndPoint?.ToString(); /// /// Gets the protocol version which is used by the connected client. diff --git a/Source/MQTTnet.Server/Events/ClientDisconnectedEventArgs.cs b/Source/MQTTnet.Server/Events/ClientDisconnectedEventArgs.cs index bbc5d148d..b552e4e96 100644 --- a/Source/MQTTnet.Server/Events/ClientDisconnectedEventArgs.cs +++ b/Source/MQTTnet.Server/Events/ClientDisconnectedEventArgs.cs @@ -5,6 +5,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Net; using MQTTnet.Packets; using MQTTnet.Protocol; @@ -18,12 +19,12 @@ public ClientDisconnectedEventArgs( string clientId, MqttDisconnectPacket disconnectPacket, MqttClientDisconnectType disconnectType, - string endpoint, + EndPoint remoteEndPoint, IDictionary sessionItems) { ClientId = clientId ?? throw new ArgumentNullException(nameof(clientId)); DisconnectType = disconnectType; - Endpoint = endpoint; + RemoteEndPoint = remoteEndPoint; SessionItems = sessionItems ?? throw new ArgumentNullException(nameof(sessionItems)); // The DISCONNECT packet can be null in case of a non clean disconnect or session takeover. @@ -38,7 +39,10 @@ public ClientDisconnectedEventArgs( public MqttClientDisconnectType DisconnectType { get; } - public string Endpoint { get; } + public EndPoint RemoteEndPoint { get; } + + [Obsolete("Use RemoteEndPoint instead.")] + public string Endpoint => RemoteEndPoint?.ToString(); /// /// Gets the reason code sent by the client. diff --git a/Source/MQTTnet.Server/Events/InterceptingPacketEventArgs.cs b/Source/MQTTnet.Server/Events/InterceptingPacketEventArgs.cs index df62b54a4..0b1eef2e8 100644 --- a/Source/MQTTnet.Server/Events/InterceptingPacketEventArgs.cs +++ b/Source/MQTTnet.Server/Events/InterceptingPacketEventArgs.cs @@ -4,6 +4,7 @@ using System; using System.Collections; +using System.Net; using System.Threading; using MQTTnet.Packets; @@ -11,11 +12,11 @@ namespace MQTTnet.Server { public sealed class InterceptingPacketEventArgs : EventArgs { - public InterceptingPacketEventArgs(CancellationToken cancellationToken, string clientId, string endpoint, MqttPacket packet, IDictionary sessionItems) + public InterceptingPacketEventArgs(CancellationToken cancellationToken, string clientId, EndPoint remoteEndPoint, MqttPacket packet, IDictionary sessionItems) { CancellationToken = cancellationToken; ClientId = clientId ?? throw new ArgumentNullException(nameof(clientId)); - Endpoint = endpoint; + RemoteEndPoint = remoteEndPoint; Packet = packet ?? throw new ArgumentNullException(nameof(packet)); SessionItems = sessionItems; } @@ -34,7 +35,10 @@ public InterceptingPacketEventArgs(CancellationToken cancellationToken, string c /// /// Gets the endpoint of the sending or receiving client. /// - public string Endpoint { get; } + public EndPoint RemoteEndPoint { get; } + + [Obsolete("Use RemoteEndPoint instead.")] + public string Endpoint => RemoteEndPoint?.ToString(); /// /// Gets or sets the MQTT packet which was received or will be sent. diff --git a/Source/MQTTnet.Server/Events/ValidatingConnectionEventArgs.cs b/Source/MQTTnet.Server/Events/ValidatingConnectionEventArgs.cs index cf44bdf52..325973c7e 100644 --- a/Source/MQTTnet.Server/Events/ValidatingConnectionEventArgs.cs +++ b/Source/MQTTnet.Server/Events/ValidatingConnectionEventArgs.cs @@ -5,6 +5,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Net; using System.Security.Cryptography.X509Certificates; using System.Text; using MQTTnet.Adapter; @@ -70,7 +71,10 @@ public ValidatingConnectionEventArgs(MqttConnectPacket connectPacket, IMqttChann /// public string ClientId => _connectPacket.ClientId; - public string Endpoint => ChannelAdapter.Endpoint; + public EndPoint RemoteEndPoint => ChannelAdapter.RemoteEndPoint; + + [Obsolete("Use RemoteEndPoint instead.")] + public string Endpoint => RemoteEndPoint?.ToString(); public bool IsSecureConnection => ChannelAdapter.IsSecureConnection; diff --git a/Source/MQTTnet.Server/Internal/Adapter/MqttTcpServerListener.cs b/Source/MQTTnet.Server/Internal/Adapter/MqttTcpServerListener.cs index fc76b0575..7a0453ce8 100644 --- a/Source/MQTTnet.Server/Internal/Adapter/MqttTcpServerListener.cs +++ b/Source/MQTTnet.Server/Internal/Adapter/MqttTcpServerListener.cs @@ -167,11 +167,11 @@ async Task AcceptClientConnectionsAsync(CancellationToken cancellationToken) async Task TryHandleClientConnectionAsync(CrossPlatformSocket clientSocket) { Stream stream = null; - string remoteEndPoint = null; + EndPoint remoteEndPoint = null; try { - remoteEndPoint = clientSocket.RemoteEndPoint.ToString(); + remoteEndPoint = clientSocket.RemoteEndPoint; _logger.Verbose("TCP client '{0}' accepted (Local endpoint={1})", remoteEndPoint, _localEndPoint); diff --git a/Source/MQTTnet.Server/Internal/MqttClientSessionsManager.cs b/Source/MQTTnet.Server/Internal/MqttClientSessionsManager.cs index 6c0cf68ec..67728a8d3 100644 --- a/Source/MQTTnet.Server/Internal/MqttClientSessionsManager.cs +++ b/Source/MQTTnet.Server/Internal/MqttClientSessionsManager.cs @@ -19,22 +19,18 @@ namespace MQTTnet.Server.Internal; public sealed class MqttClientSessionsManager : ISubscriptionChangedNotification, IDisposable { readonly Dictionary _clients = new(4096); - readonly AsyncLock _createConnectionSyncRoot = new(); - readonly MqttServerEventContainer _eventContainer; readonly MqttNetSourceLogger _logger; readonly MqttServerOptions _options; - readonly MqttRetainedMessagesManager _retainedMessagesManager; readonly IMqttNetLogger _rootLogger; - readonly ReaderWriterLockSlim _sessionsManagementLock = new(); // The _sessions dictionary contains all session, the _subscriberSessions hash set contains subscriber sessions only. // See the MqttSubscription object for a detailed explanation. readonly MqttSessionsStorage _sessionsStorage = new(); - readonly HashSet _subscriberSessions = new(); + readonly HashSet _subscriberSessions = []; public MqttClientSessionsManager(MqttServerOptions options, MqttRetainedMessagesManager retainedMessagesManager, MqttServerEventContainer eventContainer, IMqttNetLogger logger) { @@ -365,7 +361,11 @@ public async Task HandleClientConnectionAsync(IMqttChannelAdapter channelAdapter if (_eventContainer.ClientConnectedEvent.HasHandlers) { - var eventArgs = new ClientConnectedEventArgs(connectPacket, channelAdapter.PacketFormatterAdapter.ProtocolVersion, channelAdapter.Endpoint, connectedClient.Session.Items); + var eventArgs = new ClientConnectedEventArgs( + connectPacket, + channelAdapter.PacketFormatterAdapter.ProtocolVersion, + channelAdapter.RemoteEndPoint, + connectedClient.Session.Items); await _eventContainer.ClientConnectedEvent.TryInvokeAsync(eventArgs, _logger).ConfigureAwait(false); } @@ -403,7 +403,7 @@ public async Task HandleClientConnectionAsync(IMqttChannelAdapter channelAdapter } } - var endpoint = connectedClient.Endpoint; + var endpoint = connectedClient.RemoteEndPoint; if (connectedClient.Id != null && !connectedClient.IsTakenOver && _eventContainer.ClientDisconnectedEvent.HasHandlers) { @@ -591,7 +591,12 @@ async Task CreateClientConnection( if (_eventContainer.ClientDisconnectedEvent.HasHandlers) { - var eventArgs = new ClientDisconnectedEventArgs(oldConnectedClient.Id, null, MqttClientDisconnectType.Takeover, oldConnectedClient.Endpoint, oldConnectedClient.Session.Items); + var eventArgs = new ClientDisconnectedEventArgs( + oldConnectedClient.Id, + null, + MqttClientDisconnectType.Takeover, + oldConnectedClient.RemoteEndPoint, + oldConnectedClient.Session.Items); await _eventContainer.ClientDisconnectedEvent.TryInvokeAsync(eventArgs, _logger).ConfigureAwait(false); } @@ -655,14 +660,14 @@ async Task ReceiveConnectPacket(IMqttChannelAdapter channelAd } catch (OperationCanceledException) { - _logger.Warning("Client '{0}': Connected but did not sent a CONNECT packet.", channelAdapter.Endpoint); + _logger.Warning("Client '{0}': Connected but did not sent a CONNECT packet.", channelAdapter.RemoteEndPoint); } catch (MqttCommunicationTimedOutException) { - _logger.Warning("Client '{0}': Connected but did not sent a CONNECT packet.", channelAdapter.Endpoint); + _logger.Warning("Client '{0}': Connected but did not sent a CONNECT packet.", channelAdapter.RemoteEndPoint); } - _logger.Warning("Client '{0}': First received packet was no 'CONNECT' packet [MQTT-3.1.0-1].", channelAdapter.Endpoint); + _logger.Warning("Client '{0}': First received packet was no 'CONNECT' packet [MQTT-3.1.0-1].", channelAdapter.RemoteEndPoint); return null; } diff --git a/Source/MQTTnet.Server/Internal/MqttConnectedClient.cs b/Source/MQTTnet.Server/Internal/MqttConnectedClient.cs index 2217def09..84f26570d 100644 --- a/Source/MQTTnet.Server/Internal/MqttConnectedClient.cs +++ b/Source/MQTTnet.Server/Internal/MqttConnectedClient.cs @@ -2,6 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. +using System.Net; using MQTTnet.Adapter; using MQTTnet.Diagnostics.Logger; using MQTTnet.Exceptions; @@ -45,7 +46,7 @@ public MqttConnectedClient( ConnectPacket = connectPacket ?? throw new ArgumentNullException(nameof(connectPacket)); ChannelAdapter = channelAdapter ?? throw new ArgumentNullException(nameof(channelAdapter)); - Endpoint = channelAdapter.Endpoint; + RemoteEndPoint = channelAdapter.RemoteEndPoint; Session = session ?? throw new ArgumentNullException(nameof(session)); ArgumentNullException.ThrowIfNull(logger); @@ -59,14 +60,14 @@ public MqttConnectedClient( public MqttDisconnectPacket DisconnectPacket { get; private set; } - public string Endpoint { get; } - public string Id => ConnectPacket.ClientId; public bool IsRunning { get; private set; } public bool IsTakenOver { get; set; } + public EndPoint RemoteEndPoint { get; } + public MqttSession Session { get; } public MqttClientStatistics Statistics { get; } = new(); @@ -338,7 +339,7 @@ async Task InterceptPacketAsync(MqttPacket packet, CancellationToken return packet; } - var interceptingPacketEventArgs = new InterceptingPacketEventArgs(cancellationToken, Id, Endpoint, packet, Session.Items); + var interceptingPacketEventArgs = new InterceptingPacketEventArgs(cancellationToken, Id, RemoteEndPoint, packet, Session.Items); await _eventContainer.InterceptingOutboundPacketEvent.InvokeAsync(interceptingPacketEventArgs).ConfigureAwait(false); if (!interceptingPacketEventArgs.ProcessPacket || packet == null) @@ -384,7 +385,7 @@ async Task ReceivePackagesLoop(CancellationToken cancellationToken) if (_eventContainer.InterceptingInboundPacketEvent.HasHandlers) { - var interceptingPacketEventArgs = new InterceptingPacketEventArgs(cancellationToken, Id, Endpoint, currentPacket, Session.Items); + var interceptingPacketEventArgs = new InterceptingPacketEventArgs(cancellationToken, Id, RemoteEndPoint, currentPacket, Session.Items); await _eventContainer.InterceptingInboundPacketEvent.InvokeAsync(interceptingPacketEventArgs).ConfigureAwait(false); currentPacket = interceptingPacketEventArgs.Packet; processPacket = interceptingPacketEventArgs.ProcessPacket; @@ -560,10 +561,8 @@ async Task TrySendDisconnectPacket(MqttServerClientDisconnectOptions options) var disconnectPacket = MqttDisconnectPacketFactory.Create(options); - using (var timeout = new CancellationTokenSource(_serverOptions.DefaultCommunicationTimeout)) - { - await SendPacketAsync(disconnectPacket, timeout.Token).ConfigureAwait(false); - } + using var timeout = new CancellationTokenSource(_serverOptions.DefaultCommunicationTimeout); + await SendPacketAsync(disconnectPacket, timeout.Token).ConfigureAwait(false); } catch (Exception exception) { diff --git a/Source/MQTTnet.Server/Status/MqttClientStatus.cs b/Source/MQTTnet.Server/Status/MqttClientStatus.cs index 447dde223..f39e7ab68 100644 --- a/Source/MQTTnet.Server/Status/MqttClientStatus.cs +++ b/Source/MQTTnet.Server/Status/MqttClientStatus.cs @@ -4,6 +4,7 @@ using MQTTnet.Formatter; using MQTTnet.Server.Internal; +using System.Net; namespace MQTTnet.Server; @@ -22,7 +23,10 @@ public MqttClientStatus(MqttConnectedClient client) public DateTime ConnectedTimestamp => _client.Statistics.ConnectedTimestamp; - public string Endpoint => _client.Endpoint; + public EndPoint RemoteEndPoint => _client.RemoteEndPoint; + + [Obsolete("Use RemoteEndPoint instead.")] + public string Endpoint => RemoteEndPoint?.ToString(); /// /// Gets or sets the client identifier. diff --git a/Source/MQTTnet.TestApp/ServerTest.cs b/Source/MQTTnet.TestApp/ServerTest.cs index be5273a13..241abcca3 100644 --- a/Source/MQTTnet.TestApp/ServerTest.cs +++ b/Source/MQTTnet.TestApp/ServerTest.cs @@ -43,7 +43,9 @@ public static async Task RunAsync() { try { - var options = new MqttServerOptions(); + var options = new MqttServerOptionsBuilder() + .WithDefaultEndpoint() + .Build(); // Extend the timestamp for all messages from clients. // Protect several topics from being subscribed from every client. diff --git a/Source/MQTTnet.Tests/Mockups/MemoryMqttChannel.cs b/Source/MQTTnet.Tests/Mockups/MemoryMqttChannel.cs index db2fb462a..20c76602b 100644 --- a/Source/MQTTnet.Tests/Mockups/MemoryMqttChannel.cs +++ b/Source/MQTTnet.Tests/Mockups/MemoryMqttChannel.cs @@ -2,10 +2,12 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. +using Microsoft.AspNetCore.Http; using MQTTnet.Channel; using MQTTnet.Internal; using System.Buffers; using System.IO; +using System.Net; using System.Security.Cryptography.X509Certificates; using System.Threading; using System.Threading.Tasks; @@ -26,7 +28,7 @@ public MemoryMqttChannel(byte[] buffer) _stream = new MemoryStream(buffer); } - public string Endpoint { get; } = ""; + public EndPoint RemoteEndPoint { get; set; } public bool IsSecureConnection { get; } = false; diff --git a/Source/MQTTnet.Tests/MqttTcpChannel_Tests.cs b/Source/MQTTnet.Tests/MqttTcpChannel_Tests.cs index 3813e23b2..caad82f6c 100644 --- a/Source/MQTTnet.Tests/MqttTcpChannel_Tests.cs +++ b/Source/MQTTnet.Tests/MqttTcpChannel_Tests.cs @@ -40,10 +40,11 @@ public async Task Dispose_Channel_While_Used() }, ct.Token); + var remoteEndPoint = new DnsEndPoint("localhost", 50001); using var clientSocket = new CrossPlatformSocket(AddressFamily.InterNetwork, ProtocolType.Tcp); - await clientSocket.ConnectAsync(new DnsEndPoint("localhost", 50001), CancellationToken.None); + await clientSocket.ConnectAsync(remoteEndPoint, CancellationToken.None); - var tcpChannel = new MqttTcpChannel(clientSocket.GetStream(), "test", null); + var tcpChannel = new MqttTcpChannel(clientSocket.GetStream(), remoteEndPoint, null); await Task.Delay(100, ct.Token); diff --git a/Source/MQTTnet.Tests/Server/Events_Tests.cs b/Source/MQTTnet.Tests/Server/Events_Tests.cs index 0720fa235..415a2a2d2 100644 --- a/Source/MQTTnet.Tests/Server/Events_Tests.cs +++ b/Source/MQTTnet.Tests/Server/Events_Tests.cs @@ -36,7 +36,7 @@ public async Task Fire_Client_Connected_Event() Assert.IsNotNull(eventArgs); Assert.IsTrue(eventArgs.ClientId.StartsWith(nameof(Fire_Client_Connected_Event))); - Assert.IsTrue(eventArgs.Endpoint.Contains("127.0.0.1")); + Assert.IsTrue(eventArgs.RemoteEndPoint.ToString().Contains("127.0.0.1")); Assert.AreEqual(MqttProtocolVersion.V311, eventArgs.ProtocolVersion); Assert.AreEqual("TheUser", eventArgs.UserName); } @@ -64,7 +64,7 @@ public async Task Fire_Client_Disconnected_Event() Assert.IsNotNull(eventArgs); Assert.IsTrue(eventArgs.ClientId.StartsWith(nameof(Fire_Client_Disconnected_Event))); - Assert.IsTrue(eventArgs.Endpoint.Contains("127.0.0.1")); + Assert.IsTrue(eventArgs.RemoteEndPoint.ToString().Contains("127.0.0.1")); Assert.AreEqual(MqttClientDisconnectType.Clean, eventArgs.DisconnectType); } } diff --git a/Source/MQTTnet/Adapter/IMqttChannelAdapter.cs b/Source/MQTTnet/Adapter/IMqttChannelAdapter.cs index 7fe35dfca..9337354a0 100644 --- a/Source/MQTTnet/Adapter/IMqttChannelAdapter.cs +++ b/Source/MQTTnet/Adapter/IMqttChannelAdapter.cs @@ -3,6 +3,7 @@ // See the LICENSE file in the project root for more information. using System; +using System.Net; using System.Security.Cryptography.X509Certificates; using System.Threading; using System.Threading.Tasks; @@ -18,7 +19,8 @@ public interface IMqttChannelAdapter : IDisposable long BytesSent { get; } X509Certificate2 ClientCertificate { get; } - string Endpoint { get; } + + EndPoint RemoteEndPoint { get; } bool IsSecureConnection { get; } diff --git a/Source/MQTTnet/Adapter/MqttChannelAdapter.cs b/Source/MQTTnet/Adapter/MqttChannelAdapter.cs index 390fe9420..28d72bcf2 100644 --- a/Source/MQTTnet/Adapter/MqttChannelAdapter.cs +++ b/Source/MQTTnet/Adapter/MqttChannelAdapter.cs @@ -5,6 +5,7 @@ using System; using System.Buffers; using System.IO; +using System.Net; using System.Net.Sockets; using System.Runtime.InteropServices; using System.Security.Cryptography.X509Certificates; @@ -51,7 +52,7 @@ public MqttChannelAdapter(IMqttChannel channel, MqttPacketFormatterAdapter packe public X509Certificate2 ClientCertificate => _channel.ClientCertificate; - public string Endpoint => _channel.Endpoint; + public EndPoint RemoteEndPoint => _channel.RemoteEndPoint; public bool IsSecureConnection => _channel.IsSecureConnection; diff --git a/Source/MQTTnet/Channel/IMqttChannel.cs b/Source/MQTTnet/Channel/IMqttChannel.cs index 55cd48ba0..02af43e46 100644 --- a/Source/MQTTnet/Channel/IMqttChannel.cs +++ b/Source/MQTTnet/Channel/IMqttChannel.cs @@ -4,6 +4,7 @@ using System; using System.Buffers; +using System.Net; using System.Security.Cryptography.X509Certificates; using System.Threading; using System.Threading.Tasks; @@ -13,7 +14,7 @@ namespace MQTTnet.Channel; public interface IMqttChannel : IDisposable { X509Certificate2 ClientCertificate { get; } - string Endpoint { get; } + EndPoint RemoteEndPoint { get; } bool IsSecureConnection { get; } diff --git a/Source/MQTTnet/Implementations/MqttTcpChannel.cs b/Source/MQTTnet/Implementations/MqttTcpChannel.cs index 050b30013..5ef20c1a6 100644 --- a/Source/MQTTnet/Implementations/MqttTcpChannel.cs +++ b/Source/MQTTnet/Implementations/MqttTcpChannel.cs @@ -37,11 +37,11 @@ public MqttTcpChannel(MqttClientOptions clientOptions) : this() IsSecureConnection = clientOptions.ChannelOptions?.TlsOptions?.UseTls == true; } - public MqttTcpChannel(Stream stream, string endpoint, X509Certificate2 clientCertificate) : this() + public MqttTcpChannel(Stream stream, EndPoint remoteEndPoint, X509Certificate2 clientCertificate) : this() { _stream = stream ?? throw new ArgumentNullException(nameof(stream)); - Endpoint = endpoint; + RemoteEndPoint = remoteEndPoint; IsSecureConnection = stream is SslStream; ClientCertificate = clientCertificate; @@ -49,7 +49,7 @@ public MqttTcpChannel(Stream stream, string endpoint, X509Certificate2 clientCer public X509Certificate2 ClientCertificate { get; } - public string Endpoint { get; private set; } + public EndPoint RemoteEndPoint { get; private set; } public bool IsSecureConnection { get; } @@ -175,7 +175,7 @@ public async Task ConnectAsync(CancellationToken cancellationToken) _stream = networkStream; } - Endpoint = socket.RemoteEndPoint?.ToString(); + RemoteEndPoint = socket.RemoteEndPoint; } catch (Exception) { diff --git a/Source/MQTTnet/Implementations/MqttWebSocketChannel.cs b/Source/MQTTnet/Implementations/MqttWebSocketChannel.cs index 0227dce46..8c7e59114 100644 --- a/Source/MQTTnet/Implementations/MqttWebSocketChannel.cs +++ b/Source/MQTTnet/Implementations/MqttWebSocketChannel.cs @@ -26,18 +26,18 @@ public MqttWebSocketChannel(MqttClientWebSocketOptions options) _options = options ?? throw new ArgumentNullException(nameof(options)); } - public MqttWebSocketChannel(WebSocket webSocket, string endpoint, bool isSecureConnection, X509Certificate2 clientCertificate) + public MqttWebSocketChannel(WebSocket webSocket, EndPoint remoteEndPoint, bool isSecureConnection, X509Certificate2 clientCertificate) { _webSocket = webSocket ?? throw new ArgumentNullException(nameof(webSocket)); - Endpoint = endpoint; + RemoteEndPoint = remoteEndPoint; IsSecureConnection = isSecureConnection; ClientCertificate = clientCertificate; } public X509Certificate2 ClientCertificate { get; } - public string Endpoint { get; } + public EndPoint RemoteEndPoint { get; } public bool IsSecureConnection { get; private set; }