public bool CheckPeer(IPEndPoint peerEndPoint) { bool result = false; if (peerEndPoint == null) { return(false); } var peerAddress = peerEndPoint.Address; Peer peer = FindPeer(peerAddress); if (peer == null) { peer = AddPeer(peerAddress, peerEndPoint.Port); result = true; } if (peer.State != PeerState.Checked && !peer.IsLocal) { peer.EndPoint.Port = peerEndPoint.Port; peer.State = PeerState.Checked; result = true; } SendData(peer.EndPoint, ProtocolHelper.CreateGetPeerInfoQuery(DHTHelper.GetTransactionId(), fDHTClient.LocalID)); return(result); }
private void OnResponseReceive(object sender, MessageEventArgs e) { fLogger.WriteDebug("Response received: {0} :: {1}", e.EndPoint, e.Data.EncodeAsString()); var pr = FindPeer(e.EndPoint.Address); var resp = e.Data.Get <BDictionary>("r"); var qt = resp.Get <BString>("q"); string queryType = (qt != null) ? qt.ToString() : ""; switch (queryType) { case "handshake": if (pr != null) { pr.State = PeerState.Checked; SendData(e.EndPoint, ProtocolHelper.CreateGetPeerInfoQuery(DHTHelper.GetTransactionId(), fDHTClient.LocalID)); } break; case "get_peer_info": if (pr != null) { pr.Profile.Load(resp); } break; } }
/// <summary> /// Peer confirmation after receiving a ping from it. /// </summary> /// <param name="peerEndPoint"></param> /// <returns></returns> public bool CheckPeer(IPEndPoint peerEndPoint) { bool result = false; if (peerEndPoint == null) { return(false); } Peer peer = FindPeer(peerEndPoint); if (peer == null) { // ping can come from various sources, // if a node with such an endpoint is not found - then the source is not a peer return(false); } peer.PingTries = 0; if (peer.State != PeerState.Checked && !peer.IsLocal) { peer.State = PeerState.Checked; SendData(peer.EndPoint, ProtocolHelper.CreateGetPeerInfoQuery(DHTTransactions.GetNextId(), fDHTClient.LocalID)); result = true; } return(result); }
public void Test_CreateGetPeerInfoQuery() { var tid = DHTTransactions.GetNextId(); var nodeId = DHTId.CreateRandom(); var msg = ProtocolHelper.CreateGetPeerInfoQuery(tid, nodeId); Assert.IsNotNull(msg); // TODO: test contents }
public CommunicatorCore(IChatForm form) { if (form == null) { throw new ArgumentNullException("form"); } fConnected = false; fForm = form; fLogger = LogManager.GetLogger(ProtocolHelper.LOG_FILE, ProtocolHelper.LOG_LEVEL, "ChatDHTCP"); fProfile = new UserProfile(); fParser = new BencodeParser(); fPeers = new List <Peer>(); fSTUNInfo = null; int dhtPort = DHTClient.PublicDHTPort; fDHTClient = new DHTClient(DHTClient.IPAnyAddress, dhtPort, this, CLIENT_VER); fDHTClient.PeersFound += delegate(object sender, PeersFoundEventArgs e) { fLogger.WriteInfo(string.Format("Found DHT peers: {0}", e.Peers.Count)); bool changed = false; foreach (var p in e.Peers) { changed = UpdatePeer(p); } if (changed) { fForm.OnPeersListChanged(); } }; fDHTClient.PeerPinged += delegate(object sender, PeerPingedEventArgs e) { fLogger.WriteInfo(string.Format("Peer pinged: {0}", e.EndPoint)); bool changed = CheckPeer(e.EndPoint); if (changed) { fForm.OnPeersListChanged(); SendData(e.EndPoint, ProtocolHelper.CreateGetPeerInfoQuery()); } }; fDHTClient.QueryReceived += OnQueryReceive; fDHTClient.ResponseReceived += OnResponseReceive; NATHolePunching(); fTCPClient = new TCPDuplexClient(); fTCPClient.DataReceive += OnDataReceive; }