private void AcceptConnection()

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);
			}
		}