Changeset 2458


Ignore:
Timestamp:
Jan 24, 2011, 10:13:42 PM (10 years ago)
Author:
schwittmann
Message:

Fixed exception on calling Shutdown before Run

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/CrypPlugins/KeySearcher/Server/Server.cs

    r2417 r2458  
    3636    private Dictionary<EndPoint, TcpClient> connectedClients = new Dictionary<EndPoint, TcpClient>();
    3737    private TcpListener tcpListener;
    38     private bool running = false;
    39 
     38
     39    enum State
     40    {
     41        Created,
     42        Running,
     43        Exiting,
     44        Dead
     45    }
     46    private State state = State.Created;
    4047    #endregion
    4148
     
    5461        }
    5562
    56         lock (this)
    57         {
    58             if (running)
    59             {
    60                 throw new Exception("Invalid state: Already running");
    61             }
    62             running = true;
    63         }
    64 
    6563        try
    6664        {
    67             tcpListener = new TcpListener(IPAddress.Any, Port);
    68             tcpListener.Start();
    69             while (running)
     65            lock (this)
     66            {
     67                if (state != State.Created)
     68                {
     69                    if (OnErrorLog != null)
     70                    {
     71                        OnErrorLog("Invalid state: " + state);
     72                    }
     73                    return;
     74                }
     75
     76                // has to be in lock, otherwise a Stop call can cause an object
     77                // disposed exception on tcpListener.start()
     78                state = State.Running;
     79                tcpListener = new TcpListener(IPAddress.Any, Port);
     80                tcpListener.Start();
     81            }
     82
     83
     84            while (state == State.Running)
    7085            {
    7186                TcpClient client = tcpListener.AcceptTcpClient();
     
    7893            }
    7994        }
    80         catch (ThreadInterruptedException)
    81         {
    82         }
    83         catch (SocketException e)
    84         {
    85             if (running && OnErrorLog != null)
    86             {
    87                 OnErrorLog("CryptoolServer: Got SocketException while running");
     95        catch (Exception e)
     96        {
     97            if (state == State.Running && OnErrorLog != null)
     98            {
     99                OnErrorLog("CryptoolServer: Got Exception while running "+e.Message);
    88100            }
    89101        }
     
    92104            try
    93105            {
     106                state = State.Dead;
    94107                tcpListener.Stop();
    95108            }
     
    244257        lock (this)
    245258        {
    246             running = false;
    247             tcpListener.Stop();
     259            if (state == State.Dead ||
     260                state == State.Exiting)
     261            {
     262                return;
     263            }
     264            state = State.Exiting;
     265            try
     266            {
     267                tcpListener.Stop();
     268            }
     269            catch (Exception)
     270            {
     271            }
    248272        }
    249273    }
Note: See TracChangeset for help on using the changeset viewer.