private void raiseNodeConnectionStateChanged(P2PNode node) { if (this.NodeConnectionStateChanged != null) { NodeConnectionStateChanged(node); } }
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); } }
public bool ConnectToNewPeer(string address, int port, bool isTracker = false) { IPAddress ip; if (!IPAddress.TryParse(address, out ip)) { try { var ips = Dns.GetHostAddresses(address); if (ips.Length > 0) { ip = ips[0]; address = ip.ToString(); } else { throw new CommonException(ErrorCode.Engine.P2P.Connection.HOST_NAME_CAN_NOT_RESOLVED_TO_IP_ADDRESS); } } catch { throw new CommonException(ErrorCode.Engine.P2P.Connection.HOST_NAME_CAN_NOT_RESOLVED_TO_IP_ADDRESS); } } if (BlackList.Contains(address + ":" + port)) { throw new CommonException(ErrorCode.Engine.P2P.Connection.PEER_IN_BLACK_LIST); } var peer = this.Peers.Where(p => p.IP == address && p.Port == port).FirstOrDefault(); if (peer != null) { //if (!this.receivedMessageBuffer.ContainsKey(address + ":" + port)) //{ // this.receivedMessageBuffer.Add(address + ":" + port, new List<byte>()); //} ////else ////{ //// this.receivedMessageBuffer[address + ":" + port] = new List<byte>(); ////} ////var command = P2PCommand.CreateCommand(CommandNames.P2P.Ping, null); ////this.Send(command, peer.IP, peer.Port); //LogHelper.Debug(DateTime.Now + " Connect to " + address); ////return true; //throw new CommonException(ErrorCode.Engine.P2P.Connection.THE_PEER_IS_EXISTED); return(false); } else { if (this.Peers.Count >= this.maxConnections) { throw new CommonException(ErrorCode.Engine.P2P.Connection.THE_NUMBER_OF_CONNECTIONS_IS_FULL); } peer = new P2PNode(); peer.IP = address; peer.Port = port; peer.IsConnected = false; peer.ConnectedTime = Time.EpochTime; peer.IsTrackerServer = isTracker; peer.IsInbound = false; this.Peers.Add(peer); if (this.receivedMessageBuffer.ContainsKey(address + ":" + port)) { this.receivedMessageBuffer[address + ":" + port] = new List <byte>(); } else { this.receivedMessageBuffer.Add(address + ":" + port, new List <byte>()); } var command = P2PCommand.CreateCommand(CommandNames.P2P.Ping, null); this.Send(command, peer.IP, peer.Port); LogHelper.Debug(DateTime.Now + " Connect to " + address); return(true); } }