{
get
{
+ CreateNewSocketIfNeeded();
return _serverSocket;
}
}
{
get
{
- return _serverSocket.ExclusiveAddressUse;
+ return _serverSocket != null ? _serverSocket.ExclusiveAddressUse : _exclusiveAddressUse;
}
set
{
throw new InvalidOperationException(SR.net_tcplistener_mustbestopped);
}
- _serverSocket.ExclusiveAddressUse = value;
+ if (_serverSocket != null)
+ {
+ _serverSocket.ExclusiveAddressUse = value;
+ }
_exclusiveAddressUse = value;
}
}
return;
}
+ CreateNewSocketIfNeeded();
+
_serverSocket.Bind(_serverSocketEP);
try
{
{
if (NetEventSource.IsEnabled) NetEventSource.Enter(this);
- _serverSocket.Dispose();
+ _serverSocket?.Dispose();
_active = false;
- _serverSocket = new Socket(_serverSocketEP.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
-
- if (_exclusiveAddressUse)
- {
- _serverSocket.ExclusiveAddressUse = true;
- }
+ _serverSocket = null;
if (NetEventSource.IsEnabled) NetEventSource.Exit(this);
}
return listener;
}
+
+ private void CreateNewSocketIfNeeded()
+ {
+ _serverSocket ??= new Socket(_serverSocketEP.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
+
+ if (_exclusiveAddressUse)
+ {
+ _serverSocket.ExclusiveAddressUse = true;
+ }
+ }
}
}
s.Close();
}
+ [Fact]
+ public async Task Accept_StartAfterStop_AcceptsSuccessfully()
+ {
+ var listener = new TcpListener(IPAddress.Loopback, 0);
+ listener.Start();
+ await VerifyAccept(listener);
+ listener.Stop();
+
+ Assert.NotNull(listener.Server);
+
+ listener.Start();
+ Assert.NotNull(listener.Server);
+ await VerifyAccept(listener);
+ listener.Stop();
+
+ async Task VerifyAccept(TcpListener listener)
+ {
+ using var client = new TcpClient();
+ Task connectTask = client.ConnectAsync(IPAddress.Loopback, ((IPEndPoint)listener.LocalEndpoint).Port);
+ using Socket s = await listener.AcceptSocketAsync();
+ Assert.False(listener.Pending());
+ await connectTask;
+ }
+ }
+
+ [Fact]
+ public void ExclusiveAddressUse_ListenerNotStarted_SetAndReadSuccessfully()
+ {
+ var listener = new TcpListener(IPAddress.Loopback, 0);
+
+ listener.ExclusiveAddressUse = true;
+ Assert.True(listener.ExclusiveAddressUse);
+ listener.ExclusiveAddressUse = false;
+ Assert.False(listener.ExclusiveAddressUse);
+ }
+
+ [Fact]
+ public void ExclusiveAddressUse_SetStartListenerThenRead_ReadSuccessfully()
+ {
+ var listener = new TcpListener(IPAddress.Loopback, 0);
+
+ listener.ExclusiveAddressUse = true;
+
+ listener.Start();
+ Assert.True(listener.ExclusiveAddressUse);
+ listener.Stop();
+
+ Assert.True(listener.ExclusiveAddressUse);
+ }
+
+ [Fact]
+ public void ExclusiveAddressUse_SetStartAndStopListenerThenRead_ReadSuccessfully()
+ {
+ var listener = new TcpListener(IPAddress.Loopback, 0);
+
+ listener.Start();
+ listener.Stop();
+
+ listener.ExclusiveAddressUse = true;
+ Assert.True(listener.ExclusiveAddressUse);
+
+ listener.Start();
+ Assert.True(listener.ExclusiveAddressUse);
+ listener.Stop();
+
+ Assert.True(listener.ExclusiveAddressUse);
+ }
+
private sealed class DerivedTcpListener : TcpListener
{
#pragma warning disable 0618