Example #1
0
        //-------------------------------------------------------------------------------------------------------------------------
        //
        //-------------------------------------------------------------------------------------------------------------------------

        /// <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);
        }
Example #2
0
        //-------------------------------------------------------------------------------------------------------------------------
        //
        //-------------------------------------------------------------------------------------------------------------------------

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