// Process the client connection.
        private static void DoAcceptTcpClientCallback(IAsyncResult ar, IDataWriter writer, IDataGetter reader, CancellationToken ct)
        {
            if (ct.IsCancellationRequested)
                return;
            // Get the listener that handles the client request.
            var listener = (TcpListener)ar.AsyncState;

            // End the operation
            var client = listener.EndAcceptTcpClient(ar);

            client.ReceiveTimeout = TimingConstants.ClientCommunicationTimeout;
            client.SendTimeout = TimingConstants.ClientCommunicationTimeout;
            writer.Log(new LogItem("New client is coming!", ((IPEndPoint)client.Client.RemoteEndPoint).Address.ToString()));
            try
            {
                var currentClient = new ClientThread(client, writer, reader);
                //
                Task.Run(() => currentClient.Execute(ct), ct);
            }
            catch (Exception e)
            {
                writer.Log(new LogItem("Server got an exception when client arrived: " + e.Message, "no ip"));
            }

            // Signal the calling thread to continue.
            _tcpClientConnected.Set();
        }
        public static void DoAcceptConnections(int port, IDataWriter writer, IDataGetter reader, CancellationToken ct)
        {
            writer.Log(new LogItem("Server is starting now", "no ip"));
            var listener = new TcpListener(IPAddress.Any, port);
            _tcpClientConnected =  new ManualResetEvent(false);

            try
            {
                listener.Start();
                writer.Log(new LogItem("Server is started and begin to listen", "All IP"));

                var connected = true;

                while (!ct.IsCancellationRequested)
                {
                    if (connected)
                    {
                        _tcpClientConnected.Reset();
                        listener.BeginAcceptTcpClient(
                            ar => DoAcceptTcpClientCallback(ar, writer, reader, ct),
                            listener);
                    }

                    connected = _tcpClientConnected.WaitOne(TimingConstants.DefaultWaitTime);
                }

            }
            catch (SocketException e)
            {
                writer.Log(new LogItem("Server got an socket error: " + e.Message, "no ip"));
            }
            finally
            {
                listener.Stop();
                writer.Log(new LogItem("Server is terminated", "no ip"));
            }
        }