예제 #1
0
        /// <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
                );
        }
예제 #2
0
        /// <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);
        }
예제 #3
0
 void IHostListener.OnHostReceiveRequest(ConnectionRequest request, Reader message)
 {
     OnReceiveRequest?.Invoke(request, message);
 }