/// <summary> /// Occurs when a client connected /// </summary> /// <param name="worker">The worker that handles connection</param> protected virtual void OnClientConnected(ServerWorker worker) { if (ClientConnected != null) { ClientConnected(this, worker); } }
private void OnClientConnect(IAsyncResult asyn) { try { if (_Listener == null) { return; } Socket socketWorker = _Listener.EndAccept(asyn); ServerWorker serverWorker = new ServerWorker(_MessageTranslator, BufferSize, this); serverWorker.Name = string.Format("Client{0}", _IdGenerator); System.Threading.Interlocked.Increment(ref _IdGenerator); // Add the workerSocket reference to our ArrayList lock (_WorkerList) { _WorkerList.Add(serverWorker); } // Since the main Socket is now free, it can go back and wait for // other clients who are attempting to connect _Listener.BeginAccept(OnClientConnect, null); serverWorker.Start(socketWorker); OnClientConnected(serverWorker); } catch (ObjectDisposedException) { System.Diagnostics.Debugger.Log(0, "Errors", "OnClientConnection: Socket has been closed"); } catch (SocketException se) { Logger.LogError(se); } }
/// <summary> /// Notify worker disconnect /// </summary> /// <param name="serverWorker">The worker that disconnected</param> internal void NotifyWorkerDisconnected(ServerWorker serverWorker) { // Remove the reference to the worker socket of the closed client // so that this object will get garbage collected lock (_WorkerList) { _WorkerList.Remove(serverWorker); } OnClientDisconnected(serverWorker); }
/// <summary> /// Retrieves workers by name /// </summary> /// <param name="name">name of worker</param> /// <returns>ServerWorker</returns> public ServerWorker this[string name] { get { lock (_WorkerList) { foreach (var w in _WorkerList) { ServerWorker sw = w as ServerWorker; if (sw.Name == name) { return(sw); } } return(null); } } }
/// <summary> /// Close server and all workers /// </summary> public void Close() { if (_Listener != null) { _Listener.Close(); } _Listener = null; lock (_WorkerList) { while (_WorkerList.Count > 0) { ServerWorker serverWorker = _WorkerList[0] as ServerWorker; if (serverWorker != null) { serverWorker.Close(); // by closing a worker it remove itself } else { _WorkerList.RemoveAt(0); } } } IsListening = false; }