Listen on both IPV4 and IPV6 interfaces
This commit is contained in:
@@ -13,31 +13,44 @@ namespace TimberWinR.Inputs
|
||||
{
|
||||
public class TcpInputListener : InputListener
|
||||
{
|
||||
private readonly System.Net.Sockets.TcpListener _tcpListener;
|
||||
private Thread _listenThread;
|
||||
private readonly System.Net.Sockets.TcpListener _tcpListenerV4;
|
||||
private readonly System.Net.Sockets.TcpListener _tcpListenerV6;
|
||||
private Thread _listenThreadV4;
|
||||
private Thread _listenThreadV6;
|
||||
private readonly int _port;
|
||||
|
||||
public TcpInputListener(CancellationToken cancelToken, int port = 5140)
|
||||
: base(cancelToken, "Win32-Tcp")
|
||||
{
|
||||
_port = port;
|
||||
_tcpListener = new System.Net.Sockets.TcpListener(IPAddress.Any, port);
|
||||
_listenThread = new Thread(new ThreadStart(ListenForClients));
|
||||
_listenThread.Start();
|
||||
LogManager.GetCurrentClassLogger().Info("Tcp Input on Port: {0}", _port);
|
||||
|
||||
_tcpListenerV6 = new System.Net.Sockets.TcpListener(IPAddress.IPv6Any, port);
|
||||
_tcpListenerV4 = new System.Net.Sockets.TcpListener(IPAddress.Any, port);
|
||||
|
||||
_listenThreadV4 = new Thread(new ParameterizedThreadStart(ListenForClients));
|
||||
_listenThreadV4.Start(_tcpListenerV4);
|
||||
|
||||
_listenThreadV6 = new Thread(new ParameterizedThreadStart(ListenForClients));
|
||||
_listenThreadV6.Start(_tcpListenerV6);
|
||||
}
|
||||
|
||||
|
||||
public override void Shutdown()
|
||||
{
|
||||
this._tcpListener.Stop();
|
||||
this._tcpListenerV4.Stop();
|
||||
this._tcpListenerV6.Stop();
|
||||
|
||||
Finished();
|
||||
base.Shutdown();
|
||||
}
|
||||
|
||||
|
||||
private void ListenForClients()
|
||||
private void ListenForClients(object olistener)
|
||||
{
|
||||
this._tcpListener.Start();
|
||||
System.Net.Sockets.TcpListener listener = olistener as System.Net.Sockets.TcpListener;
|
||||
|
||||
listener.Start();
|
||||
|
||||
LogManager.GetCurrentClassLogger().Info("Tcp Input on Port {0} Ready", _port);
|
||||
|
||||
@@ -46,7 +59,7 @@ namespace TimberWinR.Inputs
|
||||
try
|
||||
{
|
||||
//blocks until a client has connected to the server
|
||||
TcpClient client = this._tcpListener.AcceptTcpClient();
|
||||
TcpClient client = listener.AcceptTcpClient();
|
||||
|
||||
// Wait for a client, spin up a thread.
|
||||
var clientThread = new Thread(new ParameterizedThreadStart(HandleNewClient));
|
||||
@@ -66,7 +79,8 @@ namespace TimberWinR.Inputs
|
||||
{
|
||||
var tcpClient = (TcpClient)client;
|
||||
NetworkStream clientStream = null;
|
||||
do
|
||||
|
||||
try
|
||||
{
|
||||
clientStream = tcpClient.GetStream();
|
||||
var stream = new StreamReader(clientStream);
|
||||
@@ -85,9 +99,15 @@ namespace TimberWinR.Inputs
|
||||
if (CancelToken.IsCancellationRequested)
|
||||
break;
|
||||
}
|
||||
} while (!CancelToken.IsCancellationRequested);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogManager.GetCurrentClassLogger().Error("Tcp Exception", ex);
|
||||
}
|
||||
|
||||
if (clientStream != null)
|
||||
clientStream.Close();
|
||||
|
||||
tcpClient.Close();
|
||||
Finished();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user