private void OnClientConnected(IAsyncResult ar) { if (IsRunning) { PBEServerClient client = null; try { client = new PBEServerClient(_listener.EndAccept(ar), _encryption); bool isBanned; lock (_bannedIPs) { isBanned = _bannedIPs.Contains(client.IP); } if (isBanned) { RefuseClient(client, true); } else { int count; lock (_connectedClients) { count = _connectedClients.Count; } if (count >= _maxConnections) { RefuseClient(client, false); } else { lock (_connectedClients) { _connectedClients.Add(client); } client.IsConnected = true; ClientConnected?.Invoke(this, client); BeginReceive(client); } } } catch (Exception ex) { NotifyError(ex); if (client != null) { DisconnectClient(client); } } _listener.BeginAccept(OnClientConnected, _listener); } }
public bool DisconnectClient(PBEServerClient client) { bool b; lock (_connectedClients) { b = _connectedClients.Remove(client); } if (b) { client.IsConnected = false; client.Socket.Shutdown(SocketShutdown.Both); client.Socket.Dispose(); ClientDisconnected?.Invoke(this, client); } return(b); }
private void RefuseClient(PBEServerClient client, bool isBanned) { client.Socket.Shutdown(SocketShutdown.Both); client.Socket.Dispose(); ClientRefused?.Invoke(this, client.IP, isBanned); }
private void BeginReceive(PBEServerClient client) { byte[] buffer = new byte[2]; client.Buffer = buffer; client.Socket.BeginReceive(buffer, 0, 2, SocketFlags.None, OnReceiveLength, client); }