private void OnQueryReceive(object sender, MessageEventArgs e) { fLogger.WriteDebug("Query received: {0} :: {1}", e.EndPoint, e.Data.EncodeAsString()); var pr = FindPeer(e.EndPoint); string queryType = e.Data.Get <BString>("q").ToString(); var args = e.Data.Get <BDictionary>("a"); switch (queryType) { case "handshake": SendData(e.EndPoint, ProtocolHelper.CreateHandshakeResponse(DHTTransactions.GetNextId(), fDHTClient.LocalID, fLocalPeer.Presence)); break; case "get_peer_info": SendData(e.EndPoint, ProtocolHelper.CreateGetPeerInfoResponse(DHTTransactions.GetNextId(), fDHTClient.LocalID, fProfile)); break; case ProtocolHelper.MSG_SIGN_CHAT: long timestamp = args.Get <BNumber>("ts").Value; try { var enc = Convert.ToBoolean(args.Get <BNumber>("enc").Value); var msgdata = args.Get <BString>("msg").Value; string msg = Encoding.UTF8.GetString(msgdata); OnMessageReceive(pr, msg, enc); } finally { SendData(e.EndPoint, ProtocolHelper.CreateChatResponse(DHTTransactions.GetNextId(), fDHTClient.LocalID, timestamp)); } break; } }
public Message SendMessage(Peer peer, string message) { if (peer == null || peer.ID == null || string.IsNullOrEmpty(message)) { return(null); } fLogger.WriteDebug("SendMessage: {0}, `{1}`", peer.EndPoint, message); var msg = new Message(DateTime.UtcNow, message, fLocalPeer.ID.ToString(), peer.ID.ToString()); fDatabase.SaveMessage(msg); bool encrypted = false; if (peer.Profile != null && !string.IsNullOrEmpty(peer.Profile.PublicKey)) { message = Utilities.Encrypt(message, peer.Profile.PublicKey); encrypted = true; } SendData(peer.EndPoint, ProtocolHelper.CreateChatMessage(DHTTransactions.GetNextId(), fDHTClient.LocalID, message, encrypted, msg.Timestamp.ToBinary())); return(msg); }
/// <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); }
private void CheckPeers() { DateTime dtNow = DateTime.UtcNow; bool changed = false; bool hasCheckedPeers = false; for (int i = fPeers.Count - 1; i >= 0; i--) { var peer = fPeers[i]; if (peer.IsLocal) { continue; } if (peer.IsUnknown && (peer.PingTries >= 10 || dtNow - peer.LastUpdateTime > TimeSpan.FromMinutes(10))) { fPeers.Remove(peer); changed = true; continue; } // always send ping SendPing(peer, (peer.State < PeerState.Checked)); if (peer.State >= PeerState.Checked) { hasCheckedPeers = true; } if (peer.State == PeerState.Unknown) { fDHTClient.FindUnkPeer(peer); } SendData(peer.EndPoint, ProtocolHelper.CreateHandshakeQuery(DHTTransactions.GetNextId(), fDHTClient.LocalID)); } if (hasCheckedPeers) { if (fConnectionState == ConnectionState.Connection) { fConnectionState = ConnectionState.Connected; changed = true; } } else { if (fConnectionState == ConnectionState.Connected) { fConnectionState = ConnectionState.Connection; changed = true; } } if (changed) { fForm.OnPeersListChanged(); } }
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 void Test_CreateChatMessage() { var tid = DHTTransactions.GetNextId(); var nodeId = DHTId.CreateRandom(); var msg = ProtocolHelper.CreateChatMessage(tid, nodeId, "test", false, 0); Assert.IsNotNull(msg); // TODO: test contents }
public void Test_CreateHandshakeResponse() { var tid = DHTTransactions.GetNextId(); var nodeId = DHTId.CreateRandom(); var msg = ProtocolHelper.CreateHandshakeResponse(tid, nodeId, PresenceStatus.Online); Assert.IsNotNull(msg); // TODO: test contents }
public void Test_CreateGetPeerInfoResponse() { var peerInfo = new UserProfile(); peerInfo.Reset(); var tid = DHTTransactions.GetNextId(); var nodeId = DHTId.CreateRandom(); var msg = ProtocolHelper.CreateGetPeerInfoResponse(tid, nodeId, peerInfo); Assert.IsNotNull(msg); // TODO: test contents }