/// <summary>Reject a connection request.</summary> /// <param name="request">Connection request to reject.</param> /// <param name="message">Rejection message.</param> public void Reject(ConnectionRequest request, IWritable message = null) { // Validate if (request == null) { throw new ArgumentNullException(nameof(request), "Rejected connection request is null"); } else if (request.Host != this) { throw new ArgumentException("Rejected connection request host mismatch", nameof(request)); } // Start sending reject packet Task.Factory.StartNew( () => SendAsync(PacketType.Reject, request.Remote, message), TaskCreationOptions.PreferFairness ); }
/// <summary>Accept a connection request and return a connected local peer.</summary> /// <param name="request">Connection request to accept.</param> /// <param name="config">Peer configuration values. If null, default is used.</param> /// <param name="listener">Peer listener to use. If null, event based listener is created.</param> /// <returns>Connected local peer.</returns> public Peer Accept(ConnectionRequest request, PeerConfig config, IPeerListener listener) { // Validate request if (Disposed) { throw new ObjectDisposedException(GetType().FullName); } else if (request == null) { throw new ArgumentNullException(nameof(request), "Connection request is null"); } else if (request.Host != this) { throw new ArgumentException("Connection request host mismatch", nameof(request)); } else if (request.Disposed) { throw new InvalidOperationException(string.Format( "Connection request from {0} is disposed", request.Remote )); } else if (config.RemotePublicKey != null) { throw new ArgumentException(string.Format( "Connection request from {0} cannot be authenticated", request.Remote ), nameof(config)); } else if (request.Key.Count > 0 && request.Key.Count != ExchangerKeyLength) { throw new InvalidOperationException(string.Format( "Connection request from {0} has {1} exchanger bytes", request.Remote, request.Key.Count )); } else if (request.Random.Count > 0 && request.Random.Count != Authenticator.SignatureLength) { throw new InvalidOperationException(string.Format( "Connection request from {0} has {1} random bytes", request.Remote, request.Random.Count )); } else if (request.Random.Count > 0 && Config.PrivateKey == null) { throw new InvalidOperationException(string.Format( "Connection request from {0} has authentication", request.Remote )); } // Create peer Peer peer = null; try { PeersLock.EnterWriteLock(); Peers.TryGetValue(request.Remote, out peer); if (peer == null || peer.Disposed) { peer = new Peer(this, request.Remote, config, listener); Peers[request.Remote] = peer; } else { // Peer already exists } } finally { PeersLock.ExitWriteLock(); } // Accept the request peer.Accept(request); // Return peer return(peer); }
void IHostListener.OnHostReceiveRequest(ConnectionRequest request, Reader message) { OnReceiveRequest?.Invoke(request, message); }