diff --git a/Build/MQTTnet.nuspec b/Build/MQTTnet.nuspec
index 71ec12d..8d13023 100644
--- a/Build/MQTTnet.nuspec
+++ b/Build/MQTTnet.nuspec
@@ -28,6 +28,7 @@
* [Server] Rewritten the _ConnectedClients_ API and added new features for disconnecting and Endpoint information (IP etc.).
* [Server] Added settings for disabling persistent sessions and defining a max pending messages queue size per session.
* [Server] Added a new interceptor which is invoked before a new message is added to the client queue.
+* [Server] Added support for Linux servers by dividing IPv4 and IPv6 support and adding new options (BREAKING CHANGE!).
Copyright Christian Kratky 2016-2018
MQTT Message Queue Telemetry Transport MQTTClient MQTTServer Server MQTTBroker Broker NETStandard IoT InternetOfThings Messaging Hardware Arduino Sensor Actuator M2M ESP Smart Home Cities Automation Xamarin
diff --git a/Extensions/MQTTnet.Extensions.ManagedClient/MQTTnet.Extensions.ManagedClient.csproj b/Extensions/MQTTnet.Extensions.ManagedClient/MQTTnet.Extensions.ManagedClient.csproj
index 64bbf92..46e9a0a 100644
--- a/Extensions/MQTTnet.Extensions.ManagedClient/MQTTnet.Extensions.ManagedClient.csproj
+++ b/Extensions/MQTTnet.Extensions.ManagedClient/MQTTnet.Extensions.ManagedClient.csproj
@@ -25,7 +25,7 @@
-
+
diff --git a/Extensions/MQTTnet.Extensions.Rpc/MQTTnet.Extensions.Rpc.csproj b/Extensions/MQTTnet.Extensions.Rpc/MQTTnet.Extensions.Rpc.csproj
index 64bbf92..46e9a0a 100644
--- a/Extensions/MQTTnet.Extensions.Rpc/MQTTnet.Extensions.Rpc.csproj
+++ b/Extensions/MQTTnet.Extensions.Rpc/MQTTnet.Extensions.Rpc.csproj
@@ -25,7 +25,7 @@
-
+
diff --git a/Frameworks/MQTTnet.AspnetCore/MQTTnet.AspnetCore.csproj b/Frameworks/MQTTnet.AspnetCore/MQTTnet.AspnetCore.csproj
index d3f06e8..1bc391b 100644
--- a/Frameworks/MQTTnet.AspnetCore/MQTTnet.AspnetCore.csproj
+++ b/Frameworks/MQTTnet.AspnetCore/MQTTnet.AspnetCore.csproj
@@ -22,7 +22,7 @@
-
+
diff --git a/Frameworks/MQTTnet.NetStandard/Implementations/MqttTcpServerAdapter.Uwp.cs b/Frameworks/MQTTnet.NetStandard/Implementations/MqttTcpServerAdapter.Uwp.cs
index 26bae2e..26759b2 100644
--- a/Frameworks/MQTTnet.NetStandard/Implementations/MqttTcpServerAdapter.Uwp.cs
+++ b/Frameworks/MQTTnet.NetStandard/Implementations/MqttTcpServerAdapter.Uwp.cs
@@ -38,8 +38,8 @@ namespace MQTTnet.Implementations
_defaultEndpointSocket.Control.KeepAlive = true;
_defaultEndpointSocket.Control.QualityOfService = SocketQualityOfService.LowLatency;
_defaultEndpointSocket.ConnectionReceived += AcceptDefaultEndpointConnectionsAsync;
-
- await _defaultEndpointSocket.BindServiceNameAsync(options.GetDefaultEndpointPort().ToString(), SocketProtectionLevel.PlainSocket);
+
+ await _defaultEndpointSocket.BindServiceNameAsync(options.DefaultEndpointOptions.Port.ToString(), SocketProtectionLevel.PlainSocket);
}
diff --git a/Frameworks/MQTTnet.NetStandard/Implementations/MqttTcpServerAdapter.cs b/Frameworks/MQTTnet.NetStandard/Implementations/MqttTcpServerAdapter.cs
index 40f6b2e..38869bd 100644
--- a/Frameworks/MQTTnet.NetStandard/Implementations/MqttTcpServerAdapter.cs
+++ b/Frameworks/MQTTnet.NetStandard/Implementations/MqttTcpServerAdapter.cs
@@ -1,28 +1,23 @@
#if NET452 || NET461 || NETSTANDARD1_3 || NETSTANDARD2_0
using System;
-using System.Net;
-using System.Net.Security;
+using System.Collections.Generic;
using System.Net.Sockets;
-using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;
using System.Threading;
using System.Threading.Tasks;
using MQTTnet.Adapter;
using MQTTnet.Diagnostics;
-using MQTTnet.Serializer;
using MQTTnet.Server;
namespace MQTTnet.Implementations
{
public class MqttTcpServerAdapter : IMqttServerAdapter
{
+ private readonly List _listeners = new List();
private readonly IMqttNetChildLogger _logger;
-
+
private CancellationTokenSource _cancellationTokenSource;
- private Socket _defaultEndpointSocket;
- private Socket _tlsEndpointSocket;
- private X509Certificate2 _tlsCertificate;
-
+
public MqttTcpServerAdapter(IMqttNetChildLogger logger)
{
if (logger == null) throw new ArgumentNullException(nameof(logger));
@@ -40,13 +35,7 @@ namespace MQTTnet.Implementations
if (options.DefaultEndpointOptions.IsEnabled)
{
- _defaultEndpointSocket = new Socket(SocketType.Stream, ProtocolType.Tcp) { NoDelay = true };
-
- _defaultEndpointSocket.Bind(new IPEndPoint(options.DefaultEndpointOptions.BoundIPAddress, options.GetDefaultEndpointPort()));
- _defaultEndpointSocket.Listen(options.ConnectionBacklog);
-
- Task.Run(() => AcceptDefaultEndpointConnectionsAsync(_cancellationTokenSource.Token),
- _cancellationTokenSource.Token);
+ RegisterListeners(options.DefaultEndpointOptions);
}
if (options.TlsEndpointOptions.IsEnabled)
@@ -56,19 +45,13 @@ namespace MQTTnet.Implementations
throw new ArgumentException("TLS certificate is not set.");
}
- _tlsCertificate = new X509Certificate2(options.TlsEndpointOptions.Certificate);
- if (!_tlsCertificate.HasPrivateKey)
+ var tlsCertificate = new X509Certificate2(options.TlsEndpointOptions.Certificate);
+ if (!tlsCertificate.HasPrivateKey)
{
throw new InvalidOperationException("The certificate for TLS encryption must contain the private key.");
}
- _tlsEndpointSocket = new Socket(SocketType.Stream, ProtocolType.Tcp);
- _tlsEndpointSocket.Bind(new IPEndPoint(options.TlsEndpointOptions.BoundIPAddress, options.GetTlsEndpointPort()));
- _tlsEndpointSocket.Listen(options.ConnectionBacklog);
-
- Task.Run(
- () => AcceptTlsEndpointConnectionsAsync(_cancellationTokenSource.Token),
- _cancellationTokenSource.Token);
+ RegisterListeners(options.TlsEndpointOptions);
}
return Task.FromResult(0);
@@ -76,93 +59,60 @@ namespace MQTTnet.Implementations
public Task StopAsync()
{
- _cancellationTokenSource?.Cancel(false);
- _cancellationTokenSource?.Dispose();
- _cancellationTokenSource = null;
-
- _defaultEndpointSocket?.Dispose();
- _defaultEndpointSocket = null;
-
- _tlsCertificate = null;
-
- _tlsEndpointSocket?.Dispose();
- _tlsEndpointSocket = null;
-
+ Dispose();
return Task.FromResult(0);
}
public void Dispose()
{
- StopAsync().GetAwaiter().GetResult();
- }
+ _cancellationTokenSource?.Cancel(false);
+ _cancellationTokenSource?.Dispose();
+ _cancellationTokenSource = null;
- private async Task AcceptDefaultEndpointConnectionsAsync(CancellationToken cancellationToken)
- {
- while (!cancellationToken.IsCancellationRequested)
+ foreach (var listener in _listeners)
{
- try
- {
- //todo: else branch can be used with min dependency NET46
-#if NET452 || NET461
- var clientSocket = await Task.Factory.FromAsync(_defaultEndpointSocket.BeginAccept, _defaultEndpointSocket.EndAccept, null).ConfigureAwait(false);
-#else
- var clientSocket = await _defaultEndpointSocket.AcceptAsync().ConfigureAwait(false);
-#endif
- clientSocket.NoDelay = true;
-
- var clientAdapter = new MqttChannelAdapter(new MqttTcpChannel(clientSocket, null), new MqttPacketSerializer(), _logger);
- ClientAccepted?.Invoke(this, new MqttServerAdapterClientAcceptedEventArgs(clientAdapter));
- }
- catch (ObjectDisposedException)
- {
- // It can happen that the listener socket is accessed after the cancellation token is already set and the listener socket is disposed.
- }
- catch (Exception exception)
- {
- if (exception is SocketException s && s.SocketErrorCode == SocketError.OperationAborted)
- {
- return;
- }
-
- _logger.Error(exception, "Error while accepting connection at default endpoint.");
- await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken).ConfigureAwait(false);
- }
+ listener.Dispose();
}
+
+ _listeners.Clear();
}
- private async Task AcceptTlsEndpointConnectionsAsync(CancellationToken cancellationToken)
+ private void RegisterListeners(MqttServerTcpEndpointBaseOptions options)
{
- while (!cancellationToken.IsCancellationRequested)
- {
- try
- {
-#if NET452 || NET461
- var clientSocket = await Task.Factory.FromAsync(_tlsEndpointSocket.BeginAccept, _tlsEndpointSocket.EndAccept, null).ConfigureAwait(false);
-#else
- var clientSocket = await _tlsEndpointSocket.AcceptAsync().ConfigureAwait(false);
-#endif
+ var tlsOptions = options as MqttServerTlsTcpEndpointOptions;
- var sslStream = new SslStream(new NetworkStream(clientSocket));
- await sslStream.AuthenticateAsServerAsync(_tlsCertificate, false, SslProtocols.Tls12, false).ConfigureAwait(false);
+ X509Certificate2 tlsCertificate = null;
+ if (tlsOptions != null)
+ {
+ tlsCertificate = new X509Certificate2(tlsOptions.Certificate);
+ }
- var clientAdapter = new MqttChannelAdapter(new MqttTcpChannel(clientSocket, sslStream), new MqttPacketSerializer(), _logger);
- ClientAccepted?.Invoke(this, new MqttServerAdapterClientAcceptedEventArgs(clientAdapter));
- }
- catch (ObjectDisposedException)
- {
- // It can happen that the listener socket is accessed after the cancellation token is already set and the listener socket is disposed.
- }
- catch (Exception exception)
- {
- if (exception is SocketException s && s.SocketErrorCode == SocketError.OperationAborted)
- {
- return;
- }
+ var listenerV4 = new MqttTcpServerListener(
+ AddressFamily.InterNetwork,
+ options,
+ tlsCertificate,
+ _cancellationTokenSource.Token,
+ _logger);
+
+ listenerV4.ClientAccepted += OnClientAccepted;
+ listenerV4.Start();
+ _listeners.Add(listenerV4);
+
+ var listenerV6 = new MqttTcpServerListener(
+ AddressFamily.InterNetworkV6,
+ options,
+ tlsCertificate,
+ _cancellationTokenSource.Token,
+ _logger);
+
+ listenerV6.ClientAccepted += OnClientAccepted;
+ listenerV6.Start();
+ _listeners.Add(listenerV6);
+ }
- _logger.Error(exception, "Error while accepting connection at TLS endpoint.");
- await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken).ConfigureAwait(false);
- }
- }
+ private void OnClientAccepted(object sender, MqttServerAdapterClientAcceptedEventArgs e)
+ {
+ ClientAccepted?.Invoke(this, e);
}
}
}
diff --git a/Frameworks/MQTTnet.NetStandard/Implementations/MqttTcpServerListener.cs b/Frameworks/MQTTnet.NetStandard/Implementations/MqttTcpServerListener.cs
new file mode 100644
index 0000000..4bf2b08
--- /dev/null
+++ b/Frameworks/MQTTnet.NetStandard/Implementations/MqttTcpServerListener.cs
@@ -0,0 +1,109 @@
+#if NET452 || NET461 || NETSTANDARD1_3 || NETSTANDARD2_0
+using System;
+using System.Net;
+using System.Net.Security;
+using System.Net.Sockets;
+using System.Security.Authentication;
+using System.Security.Cryptography.X509Certificates;
+using System.Threading;
+using System.Threading.Tasks;
+using MQTTnet.Adapter;
+using MQTTnet.Diagnostics;
+using MQTTnet.Serializer;
+using MQTTnet.Server;
+
+namespace MQTTnet.Implementations
+{
+ public class MqttTcpServerListener : IDisposable
+ {
+ private readonly IMqttNetChildLogger _logger;
+ private readonly CancellationToken _cancellationToken;
+ private readonly AddressFamily _addressFamily;
+ private readonly MqttServerTcpEndpointBaseOptions _options;
+ private readonly X509Certificate2 _tlsCertificate;
+
+ private Socket _socket;
+
+ public MqttTcpServerListener(
+ AddressFamily addressFamily,
+ MqttServerTcpEndpointBaseOptions options,
+ X509Certificate2 tlsCertificate,
+ CancellationToken cancellationToken,
+ IMqttNetChildLogger logger)
+ {
+ _addressFamily = addressFamily;
+ _options = options;
+ _tlsCertificate = tlsCertificate;
+ _cancellationToken = cancellationToken;
+ _logger = logger.CreateChildLogger(nameof(MqttTcpServerListener));
+ }
+
+ public event EventHandler ClientAccepted;
+
+ public void Start()
+ {
+ var boundIp = _options.BoundInterNetworkAddress;
+ if (_addressFamily == AddressFamily.InterNetworkV6)
+ {
+ boundIp = _options.BoundInterNetworkV6Address;
+ }
+
+ _socket = new Socket(_addressFamily, SocketType.Stream, ProtocolType.Tcp);
+ _socket.Bind(new IPEndPoint(boundIp, _options.Port));
+
+ _logger.Info($"Starting TCP listener for {_socket.LocalEndPoint} TLS={_tlsCertificate != null}.");
+
+ _socket.Listen(_options.ConnectionBacklog);
+ Task.Run(AcceptClientConnectionsAsync, _cancellationToken);
+ }
+
+ private async Task AcceptClientConnectionsAsync()
+ {
+ while (!_cancellationToken.IsCancellationRequested)
+ {
+ try
+ {
+#if NET452 || NET461
+ var clientSocket = await Task.Factory.FromAsync(_socket.BeginAccept, _socket.EndAccept, null).ConfigureAwait(false);
+#else
+ var clientSocket = await _socket.AcceptAsync().ConfigureAwait(false);
+#endif
+ clientSocket.NoDelay = true;
+
+ if (_tlsCertificate != null)
+ {
+ var sslStream = new SslStream(new NetworkStream(clientSocket), false);
+ await sslStream.AuthenticateAsServerAsync(_tlsCertificate, false, SslProtocols.Tls12, false).ConfigureAwait(false);
+ }
+
+ var clientAdapter = new MqttChannelAdapter(new MqttTcpChannel(clientSocket, null), new MqttPacketSerializer(), _logger);
+ ClientAccepted?.Invoke(this, new MqttServerAdapterClientAcceptedEventArgs(clientAdapter));
+ }
+ catch (ObjectDisposedException)
+ {
+ // It can happen that the listener socket is accessed after the cancellation token is already set and the listener socket is disposed.
+ }
+ catch (Exception exception)
+ {
+ if (exception is SocketException s && s.SocketErrorCode == SocketError.OperationAborted)
+ {
+ return;
+ }
+
+ _logger.Error(exception, $"Error while accepting connection at TCP listener {_socket.LocalEndPoint} TLS={_tlsCertificate != null}.");
+ await Task.Delay(TimeSpan.FromSeconds(1), _cancellationToken).ConfigureAwait(false);
+ }
+ }
+ }
+
+ public void Dispose()
+ {
+ _socket?.Dispose();
+
+#if NETSTANDARD1_3 || NETSTANDARD2_0 || NET461
+ _tlsCertificate?.Dispose();
+#endif
+ }
+ }
+}
+#endif
\ No newline at end of file
diff --git a/Frameworks/MQTTnet.NetStandard/MQTTnet.Netstandard.csproj b/Frameworks/MQTTnet.NetStandard/MQTTnet.csproj
similarity index 100%
rename from Frameworks/MQTTnet.NetStandard/MQTTnet.Netstandard.csproj
rename to Frameworks/MQTTnet.NetStandard/MQTTnet.csproj
diff --git a/Frameworks/MQTTnet.NetStandard/Server/IMqttServerOptions.cs b/Frameworks/MQTTnet.NetStandard/Server/IMqttServerOptions.cs
index b753587..2ae4c9f 100644
--- a/Frameworks/MQTTnet.NetStandard/Server/IMqttServerOptions.cs
+++ b/Frameworks/MQTTnet.NetStandard/Server/IMqttServerOptions.cs
@@ -4,8 +4,6 @@ namespace MQTTnet.Server
{
public interface IMqttServerOptions
{
- int ConnectionBacklog { get; }
-
bool EnablePersistentSessions { get; }
int MaxPendingMessagesPerClient { get; }
@@ -18,8 +16,8 @@ namespace MQTTnet.Server
Action ApplicationMessageInterceptor { get; }
Action ClientMessageQueueInterceptor { get; set; }
- MqttServerDefaultEndpointOptions DefaultEndpointOptions { get; }
- MqttServerTlsEndpointOptions TlsEndpointOptions { get; }
+ MqttServerTcpEndpointOptions DefaultEndpointOptions { get; }
+ MqttServerTlsTcpEndpointOptions TlsEndpointOptions { get; }
IMqttServerStorage Storage { get; }
}
diff --git a/Frameworks/MQTTnet.NetStandard/Server/MqttServerDefaultEndpointOptions.cs b/Frameworks/MQTTnet.NetStandard/Server/MqttServerDefaultEndpointOptions.cs
deleted file mode 100644
index 0965104..0000000
--- a/Frameworks/MQTTnet.NetStandard/Server/MqttServerDefaultEndpointOptions.cs
+++ /dev/null
@@ -1,13 +0,0 @@
-using System.Net;
-
-namespace MQTTnet.Server
-{
- public class MqttServerDefaultEndpointOptions
- {
- public bool IsEnabled { get; set; } = true;
-
- public int? Port { get; set; }
-
- public IPAddress BoundIPAddress { get; set; } = IPAddress.Any;
- }
-}
diff --git a/Frameworks/MQTTnet.NetStandard/Server/MqttServerOptions.cs b/Frameworks/MQTTnet.NetStandard/Server/MqttServerOptions.cs
index 4d06b94..6c7c4f9 100644
--- a/Frameworks/MQTTnet.NetStandard/Server/MqttServerOptions.cs
+++ b/Frameworks/MQTTnet.NetStandard/Server/MqttServerOptions.cs
@@ -4,14 +4,12 @@ namespace MQTTnet.Server
{
public class MqttServerOptions : IMqttServerOptions
{
- public MqttServerDefaultEndpointOptions DefaultEndpointOptions { get; } = new MqttServerDefaultEndpointOptions();
+ public MqttServerTcpEndpointOptions DefaultEndpointOptions { get; } = new MqttServerTcpEndpointOptions();
- public MqttServerTlsEndpointOptions TlsEndpointOptions { get; } = new MqttServerTlsEndpointOptions();
+ public MqttServerTlsTcpEndpointOptions TlsEndpointOptions { get; } = new MqttServerTlsTcpEndpointOptions();
public bool EnablePersistentSessions { get; set; }
- public int ConnectionBacklog { get; set; } = 10;
-
public int MaxPendingMessagesPerClient { get; set; } = 250;
public MqttPendingMessagesOverflowStrategy PendingMessagesOverflowStrategy { get; set; } = MqttPendingMessagesOverflowStrategy.DropOldestQueuedMessage;
diff --git a/Frameworks/MQTTnet.NetStandard/Server/MqttServerOptionsBuilder.cs b/Frameworks/MQTTnet.NetStandard/Server/MqttServerOptionsBuilder.cs
index a8800d0..f54f379 100644
--- a/Frameworks/MQTTnet.NetStandard/Server/MqttServerOptionsBuilder.cs
+++ b/Frameworks/MQTTnet.NetStandard/Server/MqttServerOptionsBuilder.cs
@@ -9,7 +9,8 @@ namespace MQTTnet.Server
public MqttServerOptionsBuilder WithConnectionBacklog(int value)
{
- _options.ConnectionBacklog = value;
+ _options.DefaultEndpointOptions.ConnectionBacklog = value;
+ _options.TlsEndpointOptions.ConnectionBacklog = value;
return this;
}
@@ -31,7 +32,7 @@ namespace MQTTnet.Server
return this;
}
- public MqttServerOptionsBuilder WithDefaultEndpointPort(int? value)
+ public MqttServerOptionsBuilder WithDefaultEndpointPort(int value)
{
_options.DefaultEndpointOptions.Port = value;
return this;
@@ -39,10 +40,16 @@ namespace MQTTnet.Server
public MqttServerOptionsBuilder WithDefaultEndpointBoundIPAddress(IPAddress value)
{
- _options.DefaultEndpointOptions.BoundIPAddress = value ?? IPAddress.Any;
+ _options.DefaultEndpointOptions.BoundInterNetworkAddress = value ?? IPAddress.Any;
return this;
}
-
+
+ public MqttServerOptionsBuilder WithDefaultEndpointBoundIPV6Address(IPAddress value)
+ {
+ _options.DefaultEndpointOptions.BoundInterNetworkV6Address = value ?? IPAddress.Any;
+ return this;
+ }
+
public MqttServerOptionsBuilder WithoutDefaultEndpoint()
{
_options.DefaultEndpointOptions.IsEnabled = false;
@@ -55,7 +62,7 @@ namespace MQTTnet.Server
return this;
}
- public MqttServerOptionsBuilder WithEncryptedEndpointPort(int? value)
+ public MqttServerOptionsBuilder WithEncryptedEndpointPort(int value)
{
_options.TlsEndpointOptions.Port = value;
return this;
@@ -63,7 +70,7 @@ namespace MQTTnet.Server
public MqttServerOptionsBuilder WithEncryptedEndpointBoundIPAddress(IPAddress value)
{
- _options.TlsEndpointOptions.BoundIPAddress = value;
+ _options.TlsEndpointOptions.BoundInterNetworkAddress = value;
return this;
}
diff --git a/Frameworks/MQTTnet.NetStandard/Server/MqttServerOptionsExtensions.cs b/Frameworks/MQTTnet.NetStandard/Server/MqttServerOptionsExtensions.cs
deleted file mode 100644
index db93ef1..0000000
--- a/Frameworks/MQTTnet.NetStandard/Server/MqttServerOptionsExtensions.cs
+++ /dev/null
@@ -1,31 +0,0 @@
-using System;
-
-namespace MQTTnet.Server
-{
- public static class MqttServerOptionsExtensions
- {
- public static int GetTlsEndpointPort(this IMqttServerOptions options)
- {
- if (options == null) throw new ArgumentNullException(nameof(options));
-
- if (!options.TlsEndpointOptions.Port.HasValue)
- {
- return 8883;
- }
-
- return options.TlsEndpointOptions.Port.Value;
- }
-
- public static int GetDefaultEndpointPort(this IMqttServerOptions options)
- {
- if (options == null) throw new ArgumentNullException(nameof(options));
-
- if (!options.DefaultEndpointOptions.Port.HasValue)
- {
- return 1883;
- }
-
- return options.DefaultEndpointOptions.Port.Value;
- }
- }
-}
diff --git a/Frameworks/MQTTnet.NetStandard/Server/MqttServerTcpEndpointBaseOptions.cs b/Frameworks/MQTTnet.NetStandard/Server/MqttServerTcpEndpointBaseOptions.cs
new file mode 100644
index 0000000..8ef8d41
--- /dev/null
+++ b/Frameworks/MQTTnet.NetStandard/Server/MqttServerTcpEndpointBaseOptions.cs
@@ -0,0 +1,17 @@
+using System.Net;
+
+namespace MQTTnet.Server
+{
+ public abstract class MqttServerTcpEndpointBaseOptions
+ {
+ public bool IsEnabled { get; set; }
+
+ public int Port { get; set; }
+
+ public int ConnectionBacklog { get; set; } = 10;
+
+ public IPAddress BoundInterNetworkAddress { get; set; } = IPAddress.Any;
+
+ public IPAddress BoundInterNetworkV6Address { get; set; } = IPAddress.IPv6Any;
+ }
+}
\ No newline at end of file
diff --git a/Frameworks/MQTTnet.NetStandard/Server/MqttServerTcpEndpointOptions.cs b/Frameworks/MQTTnet.NetStandard/Server/MqttServerTcpEndpointOptions.cs
new file mode 100644
index 0000000..0eb6dc2
--- /dev/null
+++ b/Frameworks/MQTTnet.NetStandard/Server/MqttServerTcpEndpointOptions.cs
@@ -0,0 +1,11 @@
+namespace MQTTnet.Server
+{
+ public class MqttServerTcpEndpointOptions : MqttServerTcpEndpointBaseOptions
+ {
+ public MqttServerTcpEndpointOptions()
+ {
+ IsEnabled = true;
+ Port = 1883;
+ }
+ }
+}
diff --git a/Frameworks/MQTTnet.NetStandard/Server/MqttServerTlsEndpointOptions.cs b/Frameworks/MQTTnet.NetStandard/Server/MqttServerTlsEndpointOptions.cs
deleted file mode 100644
index aaf4948..0000000
--- a/Frameworks/MQTTnet.NetStandard/Server/MqttServerTlsEndpointOptions.cs
+++ /dev/null
@@ -1,15 +0,0 @@
-using System.Net;
-
-namespace MQTTnet.Server
-{
- public class MqttServerTlsEndpointOptions
- {
- public bool IsEnabled { get; set; }
-
- public int? Port { get; set; }
-
- public byte[] Certificate { get; set; }
-
- public IPAddress BoundIPAddress { get; set; } = IPAddress.Any;
- }
-}
diff --git a/Frameworks/MQTTnet.NetStandard/Server/MqttServerTlsTcpEndpointOptions.cs b/Frameworks/MQTTnet.NetStandard/Server/MqttServerTlsTcpEndpointOptions.cs
new file mode 100644
index 0000000..76d6c86
--- /dev/null
+++ b/Frameworks/MQTTnet.NetStandard/Server/MqttServerTlsTcpEndpointOptions.cs
@@ -0,0 +1,12 @@
+namespace MQTTnet.Server
+{
+ public class MqttServerTlsTcpEndpointOptions : MqttServerTcpEndpointBaseOptions
+ {
+ public MqttServerTlsTcpEndpointOptions()
+ {
+ Port = 8883;
+ }
+
+ public byte[] Certificate { get; set; }
+ }
+}
diff --git a/MQTTnet.sln b/MQTTnet.sln
index 2e487b0..68a35f1 100644
--- a/MQTTnet.sln
+++ b/MQTTnet.sln
@@ -11,7 +11,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Frameworks", "Frameworks",
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MQTTnet.TestApp.UniversalWindows", "Tests\MQTTnet.TestApp.UniversalWindows\MQTTnet.TestApp.UniversalWindows.csproj", "{FF1F72D6-9524-4422-9497-3CC0002216ED}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MQTTnet.NetStandard", "Frameworks\MQTTnet.NetStandard\MQTTnet.NetStandard.csproj", "{3587E506-55A2-4EB3-99C7-DC01E42D25D2}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MQTTnet", "Frameworks\MQTTnet.NetStandard\MQTTnet.csproj", "{3587E506-55A2-4EB3-99C7-DC01E42D25D2}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Build", "Build", "{67C28AC1-BC3A-420A-BE9C-FA2401431CF9}"
ProjectSection(SolutionItems) = preProject
diff --git a/Tests/MQTTnet.Benchmarks/MQTTnet.Benchmarks.csproj b/Tests/MQTTnet.Benchmarks/MQTTnet.Benchmarks.csproj
index ad3aa55..4db064f 100644
--- a/Tests/MQTTnet.Benchmarks/MQTTnet.Benchmarks.csproj
+++ b/Tests/MQTTnet.Benchmarks/MQTTnet.Benchmarks.csproj
@@ -13,7 +13,7 @@
-
+
\ No newline at end of file
diff --git a/Tests/MQTTnet.Benchmarks/Tcp/TcpConnection.cs b/Tests/MQTTnet.Benchmarks/Tcp/TcpConnection.cs
index 96b1d85..83cb98a 100644
--- a/Tests/MQTTnet.Benchmarks/Tcp/TcpConnection.cs
+++ b/Tests/MQTTnet.Benchmarks/Tcp/TcpConnection.cs
@@ -1,5 +1,4 @@
using System;
-using System.Collections.Generic;
using System.IO;
using System.IO.Pipelines;
using System.Net;
@@ -21,7 +20,7 @@ namespace MQTTnet.Benchmarks.Tcp
public TcpConnection(EndPoint endPoint)
{
- _socket = new Socket(SocketType.Stream, ProtocolType.Tcp);
+ _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_endPoint = endPoint;
_sender = new SocketSender(_socket, PipeScheduler.ThreadPool);
diff --git a/Tests/MQTTnet.Core.Tests/MQTTnet.Core.Tests.csproj b/Tests/MQTTnet.Core.Tests/MQTTnet.Core.Tests.csproj
index 89e96e2..52e3326 100644
--- a/Tests/MQTTnet.Core.Tests/MQTTnet.Core.Tests.csproj
+++ b/Tests/MQTTnet.Core.Tests/MQTTnet.Core.Tests.csproj
@@ -13,7 +13,7 @@
-
+
\ No newline at end of file
diff --git a/Tests/MQTTnet.TestApp.NetCore/MQTTnet.TestApp.NetCore.csproj b/Tests/MQTTnet.TestApp.NetCore/MQTTnet.TestApp.NetCore.csproj
index 0f2d0bf..5050163 100644
--- a/Tests/MQTTnet.TestApp.NetCore/MQTTnet.TestApp.NetCore.csproj
+++ b/Tests/MQTTnet.TestApp.NetCore/MQTTnet.TestApp.NetCore.csproj
@@ -16,7 +16,7 @@
-
+
diff --git a/Tests/MQTTnet.TestApp.NetCore/PerformanceTest.cs b/Tests/MQTTnet.TestApp.NetCore/PerformanceTest.cs
index 27d8077..e9e4bc4 100644
--- a/Tests/MQTTnet.TestApp.NetCore/PerformanceTest.cs
+++ b/Tests/MQTTnet.TestApp.NetCore/PerformanceTest.cs
@@ -18,6 +18,7 @@ namespace MQTTnet.TestApp.NetCore
var concurrent = Console.ReadKey(true).KeyChar == 'c';
var server = Task.Run(RunServerAsync);
+ await Task.Delay(1000);
var client = Task.Run(() => RunClientAsync(2000, TimeSpan.FromMilliseconds(10), concurrent));
await Task.WhenAll(server, client).ConfigureAwait(false);
diff --git a/Tests/MQTTnet.TestApp.UniversalWindows/MQTTnet.TestApp.UniversalWindows.csproj b/Tests/MQTTnet.TestApp.UniversalWindows/MQTTnet.TestApp.UniversalWindows.csproj
index ae621c2..0b6cad8 100644
--- a/Tests/MQTTnet.TestApp.UniversalWindows/MQTTnet.TestApp.UniversalWindows.csproj
+++ b/Tests/MQTTnet.TestApp.UniversalWindows/MQTTnet.TestApp.UniversalWindows.csproj
@@ -135,9 +135,9 @@
{c444e9c8-95fa-430e-9126-274129de16cd}
MQTTnet.Extensions.Rpc
-
+
{3587e506-55a2-4eb3-99c7-dc01e42d25d2}
- MQTTnet.NetStandard
+ MQTTnet