private void OnAcceptConnection(IAsyncResult iar) { if (IsRunning) { try { var socket = ((Socket)iar.AsyncState).EndAccept(iar); lock (_connections) { var connection = new TcpConnectionEntity(socket, (uint)_idProvider.GetId()); connection.Disconnected += (reason) => { _connections.Remove(connection.Id); OnClientDisconnected(connection, reason); }; _connections.Add(connection.Id, connection); connection.StartReception(); OnClientConnected(connection); } } catch (Exception e) { if (e is SocketException || e is ObjectDisposedException) { return; } } if (IsRunning) { _socket.BeginAccept(new AsyncCallback(OnAcceptConnection), _socket); } } }
protected virtual void OnClientDisconnected(TcpConnectionEntity connection, NetworkDisconnectReason reason) { }
protected virtual void OnClientConnected(TcpConnectionEntity connection) { }