private void pongMsgHandle(P2PState state) { var peer = this.Peers.Where(p => p.IP == state.IP && p.Port == state.Port).FirstOrDefault(); if (peer != null) { var verPayload = new VersionMsg(); verPayload.Version = Versions.EngineVersion; verPayload.Timestamp = Time.EpochTime; var versionCommand = P2PCommand.CreateCommand(CommandNames.P2P.Version, verPayload); this.Send(versionCommand, state.IP, state.Port); //peer.IsConnected = true; //peer.ConnectedTime = Time.EpochTime; //peer.LatestHeartbeat = Time.EpochTime; } }
private void versionMsgHandle(P2PState state) { var peer = this.Peers.Where(p => p.IP == state.IP && p.Port == state.Port).FirstOrDefault(); if (peer != null) { var versionMsg = new VersionMsg(); int index = 0; versionMsg.Deserialize(state.Command.Payload, ref index); bool checkResult; if (versionMsg.Version < Versions.MinimumSupportVersion) { checkResult = false; var data = new RejectMsg(); data.ReasonCode = ErrorCode.Engine.P2P.Connection.P2P_VERSION_NOT_BE_SUPPORT_BY_REMOTE_PEER; var rejectCommand = P2PCommand.CreateCommand(CommandNames.Other.Reject, data); this.Send(rejectCommand, state.IP, state.Port); this.RemovePeer(state.IP, state.Port); } else if (Math.Abs(Time.EpochTime - versionMsg.Timestamp) > 2 * 60 * 60 * 1000) { checkResult = false; var data = new RejectMsg(); data.ReasonCode = ErrorCode.Engine.P2P.Connection.TIME_NOT_MATCH_WITH_RMOTE_PEER; var rejectCommand = P2PCommand.CreateCommand(CommandNames.Other.Reject, data); this.Send(rejectCommand, state.IP, state.Port); } else { peer.Version = versionMsg.Version; checkResult = true; } if (checkResult) { var verAckCommand = P2PCommand.CreateCommand(CommandNames.P2P.VerAck, null); this.Send(verAckCommand, state.IP, state.Port); } } }
private void pingMsgHandle(P2PState state) { var peer = this.Peers.Where(p => p.IP == state.IP && p.Port == state.Port).FirstOrDefault(); if (peer == null) { if (this.Peers.Count < this.maxConnections) { var newPeer = new P2PNode(); newPeer.IP = state.IP; newPeer.Port = state.Port; newPeer.IsConnected = false; newPeer.ConnectedTime = Time.EpochTime; newPeer.IsTrackerServer = false; newPeer.IsInbound = true; this.Peers.Add(newPeer); if (this.receivedMessageBuffer.ContainsKey(state.IP + ":" + state.Port)) { this.receivedMessageBuffer[state.IP + ":" + state.Port] = new List <byte>(); } else { this.receivedMessageBuffer.Add(state.IP + ":" + state.Port, new List <byte>()); } var pongCommand = P2PCommand.CreateCommand(CommandNames.P2P.Pong, null); this.Send(pongCommand, newPeer.IP, newPeer.Port); var verPayload = new VersionMsg(); verPayload.Version = Versions.EngineVersion; verPayload.Timestamp = Time.EpochTime; var versionCommand = P2PCommand.CreateCommand(CommandNames.P2P.Version, verPayload); this.Send(versionCommand, state.IP, state.Port); } else { var payload = new RejectMsg(); payload.ReasonCode = ErrorCode.Engine.P2P.Connection.THE_NUMBER_OF_CONNECTIONS_IS_FULL; var rejectCommand = P2PCommand.CreateCommand(CommandNames.Other.Reject, payload); this.Send(rejectCommand, state.IP, state.Port); } } else { var pongCommand = P2PCommand.CreateCommand(CommandNames.P2P.Pong, null); this.Send(pongCommand, state.IP, state.Port); var verPayload = new VersionMsg(); verPayload.Version = Versions.EngineVersion; verPayload.Timestamp = Time.EpochTime; var versionCommand = P2PCommand.CreateCommand(CommandNames.P2P.Version, verPayload); this.Send(versionCommand, state.IP, state.Port); if (!this.receivedMessageBuffer.ContainsKey(state.IP + ":" + state.Port)) { this.receivedMessageBuffer.Add(state.IP + ":" + state.Port, new List <byte>()); } //var payload = new RejectMsg(); //payload.ReasonCode = ErrorCode.Engine.P2P.Connection.THE_PEER_IS_EXISTED; //var rejectCommand = P2PCommand.CreateCommand(CommandNames.Other.Reject, payload); //this.Send(rejectCommand, state.IP, state.Port); } }