in FixAntenna/NetCore/FixEngine/Transport/Server/Tcp/TcpServer.cs [121:203]
private void AcceptConnection(IAsyncResult ar)
{
TcpAcceptorTransport acceptorTransport;
if (string.IsNullOrEmpty(Thread.CurrentThread.Name))
Thread.CurrentThread.Name = $"TcpServer.Thread-{++ThreadNum}";
lock (_lock)
{
if (_serverSocket == null)
{
_log.Info("Server socket has died, exiting.");
return;
}
// BeginAcceptSocket blocks a thread on Linux, hence the usage of tasks.
// Starting new listening thread.
Task.Factory.StartNew(() =>
{
try
{
_serverSocket.BeginAcceptSocket(AcceptConnection, this);
}
catch (ObjectDisposedException ode)
{
_log.Trace(ode.Message, ode);
}
catch (SocketException ex)
{
if (_log.IsDebugEnabled)
{
_log.Warn(ex.Message, ex);
}
else
{
_log.Warn(ex.Message);
}
}
}, TaskCreationOptions.PreferFairness | TaskCreationOptions.LongRunning).ConfigureAwait(false);
Socket incomingConnectionSocket = null;
try
{
incomingConnectionSocket = _serverSocket.EndAcceptSocket(ar);
if (_log.IsInfoEnabled)
{
_log.Info(
$"Connection accepted from remote address: {incomingConnectionSocket.RemoteEndPoint.AsString()} on local address: {incomingConnectionSocket.LocalEndPoint.AsString()}");
}
acceptorTransport = new TcpAcceptorTransport(incomingConnectionSocket, _confAdapter);
acceptorTransport.Open();
}
catch (ObjectDisposedException)
{
incomingConnectionSocket.ShutdownAndClose();
return;
}
catch (Exception ex)
{
if (_log.IsDebugEnabled)
{
_log.Warn(ex.Message, ex);
}
else
{
_log.Warn(ex.Message);
}
incomingConnectionSocket.ShutdownAndClose();
return;
}
}
var isOpen = acceptorTransport.IsOpen;
if (isOpen)
{
_listener.OnConnect(acceptorTransport);
}
}