private void ProcessMessageCore(IncomingMessage message) { if(message.Message.Payload is VersionPayload) { var version = message.AssertPayload<VersionPayload>(); var connectedToSelf = version.Nonce == Nonce; if(message.Node != null && connectedToSelf) { NodeServerTrace.ConnectionToSelfDetected(); message.Node.Disconnect(); return; } if(message.Node == null) { var remoteEndpoint = version.AddressFrom; if(!remoteEndpoint.Address.IsRoutable(AllowLocalPeers)) { //Send his own endpoint remoteEndpoint = new IPEndPoint(((IPEndPoint)message.Socket.RemoteEndPoint).Address, Network.DefaultPort); } if(IsConnectedTo(remoteEndpoint)) { NodeServerTrace.Warning("Ongoing connection with " + remoteEndpoint + " detected, aborting the incoming connection attempt"); Utils.SafeCloseSocket(message.Socket); return; } var node = new Node(new Peer(PeerOrigin.Advertised, new NetworkAddress() { Endpoint = remoteEndpoint, Time = DateTimeOffset.UtcNow }), this, message.Socket, version); if(connectedToSelf) { node.SendMessage(CreateVersionPayload(node.Peer, ExternalEndpoint, Version)); NodeServerTrace.ConnectionToSelfDetected(); node.Disconnect(); return; } CancellationTokenSource cancel = new CancellationTokenSource(); cancel.CancelAfter(TimeSpan.FromSeconds(10.0)); try { node.RespondToHandShake(cancel.Token); AddNode(node); } catch(OperationCanceledException ex) { NodeServerTrace.Error("The remote node did not respond fast enough (10 seconds) to the handshake completion, dropping connection", ex); node.Disconnect(); throw; } catch(Exception) { node.Disconnect(); throw; } } } }
private void ProcessMessageCore(IncomingMessage message) { if (message.Message.Payload is VersionPayload) { VersionPayload version = message.AssertPayload <VersionPayload>(); bool connectedToSelf = version.Nonce == this.Nonce; if ((message.NetworkPeer != null) && connectedToSelf) { NodeServerTrace.ConnectionToSelfDetected(); message.NetworkPeer.DisconnectAsync(); return; } if (message.NetworkPeer == null) { IPEndPoint remoteEndpoint = version.AddressFrom; if (!remoteEndpoint.Address.IsRoutable(this.AllowLocalPeers)) { // Send his own endpoint. remoteEndpoint = new IPEndPoint(((IPEndPoint)message.Socket.RemoteEndPoint).Address, this.Network.DefaultPort); } var peerAddress = new NetworkAddress() { Endpoint = remoteEndpoint, Time = DateTimeOffset.UtcNow }; NetworkPeer networkPeer = this.networkPeerFactory.CreateNetworkPeer(peerAddress, this.Network, CreateNetworkPeerConnectionParameters(), message.Socket, version); if (connectedToSelf) { networkPeer.SendMessage(CreateNetworkPeerConnectionParameters().CreateVersion(networkPeer.PeerAddress.Endpoint, this.Network)); NodeServerTrace.ConnectionToSelfDetected(); networkPeer.Disconnect(); return; } CancellationTokenSource cancel = new CancellationTokenSource(); cancel.CancelAfter(TimeSpan.FromSeconds(10.0)); try { this.ConnectedNetworkPeers.Add(networkPeer); networkPeer.StateChanged += Peer_StateChanged; networkPeer.RespondToHandShake(cancel.Token); } catch (OperationCanceledException ex) { NodeServerTrace.Error("The remote peer did not respond fast enough (10 seconds) to the handshake completion, dropping connection", ex); networkPeer.DisconnectAsync(); throw; } catch (Exception) { networkPeer.DisconnectAsync(); throw; } } } this.MessageReceived?.Invoke(this, message); }
private void ProcessMessageCore(IncomingMessage message) { if(message.Message.Payload is VersionPayload) { var version = message.AssertPayload<VersionPayload>(); var connectedToSelf = version.Nonce == Nonce; if(message.Node != null && connectedToSelf) { NodeServerTrace.ConnectionToSelfDetected(); message.Node.DisconnectAsync(); return; } if(message.Node == null) { var remoteEndpoint = version.AddressFrom; if(!remoteEndpoint.Address.IsRoutable(AllowLocalPeers)) { //Send his own endpoint remoteEndpoint = new IPEndPoint(((IPEndPoint)message.Socket.RemoteEndPoint).Address, Network.DefaultPort); } var peer = new NetworkAddress() { Endpoint = remoteEndpoint, Time = DateTimeOffset.UtcNow }; var node = new Node(peer, Network, CreateNodeConnectionParameters(), message.Socket, version); if(connectedToSelf) { node.SendMessage(CreateNodeConnectionParameters().CreateVersion(node.Peer.Endpoint, Network)); NodeServerTrace.ConnectionToSelfDetected(); node.Disconnect(); return; } CancellationTokenSource cancel = new CancellationTokenSource(); cancel.CancelAfter(TimeSpan.FromSeconds(10.0)); try { ConnectedNodes.Add(node); node.StateChanged += node_StateChanged; node.RespondToHandShake(cancel.Token); } catch(OperationCanceledException ex) { NodeServerTrace.Error("The remote node did not respond fast enough (10 seconds) to the handshake completion, dropping connection", ex); node.DisconnectAsync(); throw; } catch(Exception) { node.DisconnectAsync(); throw; } } } var messageReceived = MessageReceived; if(messageReceived != null) messageReceived(this, message); }
/// <summary> /// Processes a new message received from a connected client peer. /// </summary> /// <param name="message">Message received from the client.</param> private void ProcessMessageCore(IncomingMessage message) { this.logger.LogTrace("({0}:'{1}')", nameof(message), message.Message.Command); if (message.Message.Payload is VersionPayload) { VersionPayload version = message.AssertPayload <VersionPayload>(); bool connectedToSelf = version.Nonce == this.Nonce; if (connectedToSelf) { this.logger.LogDebug("Connection to self detected and will be aborted."); } if ((message.NetworkPeer != null) && connectedToSelf) { message.NetworkPeer.DisconnectWithException(); this.logger.LogTrace("(-)[CONNECTED_TO_SELF]"); return; } if (message.NetworkPeer == null) { this.logger.LogDebug("First message received from peer '{0}'.", version.AddressFrom); IPEndPoint remoteEndpoint = version.AddressFrom; if (!remoteEndpoint.Address.IsRoutable(this.AllowLocalPeers)) { // Send his own endpoint. remoteEndpoint = new IPEndPoint(((IPEndPoint)message.Socket.RemoteEndPoint).Address, this.Network.DefaultPort); } var peerAddress = new NetworkAddress() { Endpoint = remoteEndpoint, Time = this.dateTimeProvider.GetUtcNow() }; NetworkPeer networkPeer = this.networkPeerFactory.CreateNetworkPeer(peerAddress, this.Network, CreateNetworkPeerConnectionParameters(), message.Socket, version); if (connectedToSelf) { networkPeer.SendMessage(CreateNetworkPeerConnectionParameters().CreateVersion(networkPeer.PeerAddress.Endpoint, this.Network, this.dateTimeProvider.GetTimeOffset())); networkPeer.Disconnect(); this.logger.LogTrace("(-)[CONNECTED_TO_SELF_2]"); return; } using (CancellationTokenSource cancel = new CancellationTokenSource()) { cancel.CancelAfter(TimeSpan.FromSeconds(10.0)); try { this.ConnectedNetworkPeers.Add(networkPeer); networkPeer.StateChanged += Peer_StateChanged; networkPeer.RespondToHandShake(cancel.Token); } catch (OperationCanceledException) { this.logger.LogTrace("Remote peer haven't responded within 10 seconds of the handshake completion, dropping connection."); networkPeer.DisconnectWithException(); this.logger.LogTrace("(-)[HANDSHAKE_TIMEDOUT]"); throw; } catch (Exception ex) { this.logger.LogTrace("Exception occurred: {0}", ex.ToString()); networkPeer.DisconnectWithException(); this.logger.LogTrace("(-)[HANDSHAKE_EXCEPTION]"); throw; } } } } this.logger.LogTrace("(-)"); }