private void ThreadTask()
 {
     try
     {
         while (!m_Terminate)
         {
             Socket sckt = null;
             try
             {
                 sckt = m_IncomingSocket.Accept();
             }
             catch (SocketException e)
             {
                 Trace(e);
                 sckt = null;
             }
             if (sckt != null)
             {
                 if (MaxConn == 0 ||
                     m_ConnList.Count < MaxConn)
                 {
                     var scktConn = new SocketConn(sckt, false);
                     scktConn.OnEventTrace += ScktConn_OnEventTrace;
                     scktConn.OnDisconnect += new SocketConn.DlgDisconnect(SocketConn_Disconnect);
                     scktConn.OnSendError  += new SocketConn.DlgSendError(SocketConn_SendError);
                     if (!m_ConnList.TryAdd(scktConn, scktConn))
                     {
                         Trace(EventType.Exception,
                               "Couldn't add connection to socket server connection list. Refusing connection. ConnID: {0}",
                               scktConn);
                         sckt.Close();
                     }
                     OnConnect?.Invoke(scktConn);
                     if (m_StartScktConnReadThread)
                     {
                         scktConn.OnReceiveData  += new SocketConn.DlgReceiveData(SocketConn_ReceiveData);
                         scktConn.OnReceiveError += new SocketConn.DlgReceiveError(SocketConn_ReceiveError);
                         scktConn.StartReadThread();
                     }
                     if (m_AcceptDelay)
                     {
                         m_AcceptDelayWaitHandle.WaitOne(ACCEPT_DELAY, false);
                     }
                 }
                 else
                 {
                     sckt.Close();
                     Trace(
                         EventType.Warning,
                         "Socket connection refused. Reached connection limit of {0} connections. {1}/{2}",
                         MaxConn,
                         sckt.LocalEndPoint,
                         sckt.RemoteEndPoint);
                 }
             }
         }
     }
     catch (Exception exc) { Trace(exc); }
 }
 private void ThreadTask()
 {
     try
     {
         while (!m_Terminate)
         {
             if (m_SocketConn == null || !m_SocketConn.Connected)
             {
                 var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                 try
                 {
                     socket.Connect(m_RemoteAddress, m_RemotePort);
                     m_SocketConn = new SocketConn(socket, false);
                     m_SocketConn.OnEventTrace += ScktConn_OnEventTrace;
                     m_SocketConn.OnDisconnect += new SocketConn.DlgDisconnect(SocketConn_Disconnect);
                     m_SocketConn.OnSendError  += new SocketConn.DlgSendError(SocketConn_SendError);
                     if (m_StartScktConnReadThread)
                     {
                         m_SocketConn.OnReceiveData  += new SocketConn.DlgReceiveData(SocketConn_ReceiveData);
                         m_SocketConn.OnReceiveError += new SocketConn.DlgReceiveError(SocketConn_ReceiveError);
                         m_SocketConn.StartReadThread();
                     }
                     OnConnect?.Invoke(m_SocketConn);
                 }
                 catch (Exception e)
                 {
                     Trace(EventType.Error,
                           "Exception connecting the socket. Remote endpoint: {0}",
                           RemoteEndPoint);
                     OnConnectError?.Invoke(e);
                     TryToReconnect();
                 }
             }
             m_ReconnectSignal.WaitOne(RETRY_CONNECT);
         }
     }
     catch (Exception exc)
     {
         Trace(exc);
     }
 }