//------------------------------------------------------------------------------------------------------------------------- // //------------------------------------------------------------------------------------------------------------------------- /// <summary> /// Adds session. /// </summary> /// <param name="p_session">Session ID.</param> /// <param name="p_responsor">Session object.</param> /// <param name="logWriter">Log writer.</param> public void AddSession(string p_session, MailResponsor p_responsor) { SessionTable.Add(p_session, p_responsor); WriteLog(String.Format("session[{0}]: {1}", p_session, "added"), true); }
//------------------------------------------------------------------------------------------------------------------------- // //------------------------------------------------------------------------------------------------------------------------- /// <summary> /// /// </summary> public void Listen() { try { ELogger.SNG.WriteLog(String.Format("starting for connection: {0}, {1}...", "IPAddress.Any", PortNumber)); smtpListener = new TcpListener(IPAddress.Any, PortNumber); smtpListener.Start(); while (true) { // Check if maximum allowed thread count isn't exceeded if (SessionTable.Count <= MaxThreads) { WriteLog(String.Format("waiting for connection: {0}/{1}...", SessionTable.Count, MaxThreads), true); // Thread is sleeping, until a client connects Socket _clientSocket = smtpListener.AcceptSocket(); string _sessionId = _clientSocket.GetHashCode().ToString(); WriteLog(String.Format("session[{0}]: listener accepted...", _sessionId), true); MailResponsor _newRequestor = new MailResponsor(this, _clientSocket, _sessionId); Thread _requestor = new Thread(_newRequestor.Process) { Name = "SMTP Requestor" }; // Add session to session list AddSession(_sessionId, _newRequestor); // Start proccessing _requestor.Start(); } else { Thread.Sleep(100); } } } catch (ThreadInterruptedException ex) { ELogger.SNG.WriteLog(ex); Thread.CurrentThread.Abort(); } catch (ThreadAbortException ex) { ELogger.SNG.WriteLog(ex); } catch (SocketException ex) { ELogger.SNG.WriteLog("X", String.Format("{0}: {1}:{2}", ex.Message, HostName, PortNumber)); } catch (ProviderException ex) { ELogger.SNG.WriteLog(ex); } catch (Exception ex) { ELogger.SNG.WriteLog(ex); } finally { smtpListener.Stop(); } }