private void OnRecvAnnouncePeerQuery(IPEndPoint ipinfo, BDictionary data) { var t = data.Get <BString>("t"); var args = data.Get <BDictionary>("a"); var id = args.Get <BString>("id"); var infoHash = args.Get <BString>("info_hash"); var impliedPort = args.Get <BNumber>("implied_port"); int port = (impliedPort != null && impliedPort.Value == 1) ? ipinfo.Port : (int)args.Get <BNumber>("port").Value; fLogger.WriteDebug("Receive `announce_peer` query from {0} [{1}] for {2}", ipinfo.ToString(), id.Value.ToHexString(), infoHash.Value.ToHexString()); fRoutingTable.UpdateNode(new DHTNode(id.Value, ipinfo)); if (!DHTHelper.ArraysEqual(infoHash.Value, fSearchInfoHash)) { // skip response for another infohash query return; } // receive `announce_peer` query for our infohash var nodesList = fRoutingTable.FindNodes(infoHash.Value); Send(ipinfo, DHTMessage.CreateAnnouncePeerResponse(t, fLocalID, nodesList)); }
private void ProcessNodesStr(IPEndPoint ipinfo, BString nodesStr) { if (nodesStr != null && nodesStr.Length != 0) { List <DHTNode> nodesList = null; if (nodesStr.Value.Length % DHTHelper.CompactNodeRecordLengthIP4 == 0) { nodesList = DHTHelper.ParseNodesListIP4(nodesStr.Value); } else if (nodesStr.Value.Length % DHTHelper.CompactNodeRecordLengthIP6 == 0) { nodesList = DHTHelper.ParseNodesListIP6(nodesStr.Value); } else { throw new Exception("sd"); } fLogger.WriteDebug("Receive {0} nodes from {1}", nodesList.Count, ipinfo.ToString()); if (nodesList.Count > 0) { fRoutingTable.UpdateNodes(nodesList); fLastNodesUpdateTime = DateTime.Now.Ticks; } } }
public static DHTMessage CreateGetPeersResponse( BString transactionID, byte[] nodeId, byte[] infoHash, IList <IDHTPeer> peersList, IList <DHTNode> nodesList) { BList values = DHTHelper.CompactPeers(peersList); var nodes = new BString(DHTHelper.CompactNodes(nodesList)); BDictionary sendData = new BDictionary(); sendData.Add("t", transactionID); sendData.Add("y", "r"); var r = new BDictionary(); r.Add("id", new BString(nodeId)); r.Add("token", new BString(infoHash.Take(2))); if (values != null) { r.Add("values", values); } r.Add("nodes", nodes); sendData.Add("r", r); return(new DHTMessage(MessageType.Response, QueryType.None, sendData)); }
public void Test_BytesToHexString() { var bytes = new byte[] { 0xFF, 0xAF, 0x05, 0x77, 0xAB }; string str = DHTHelper.BytesToHexString(bytes).ToLowerInvariant(); Assert.AreEqual("ffaf0577ab", str); }
public void Test_GetRandomHashID() { var randShaId = DHTHelper.GetRandomHashID(); Assert.IsNotNull(randShaId); Assert.AreEqual(20, randShaId.Length); }
public void Test_GetTransactionId() { var tid = DHTHelper.GetTransactionId(); Assert.IsNotNull(tid); Assert.AreEqual(2, tid.Length); }
private bool ProcessValuesStr(IPEndPoint ipinfo, BList valuesList) { bool result = false; if (valuesList != null && valuesList.Count != 0) { var values = DHTHelper.ParseValuesList(valuesList); if (values.Count > 0) { fLogger.WriteDebug("Receive {0} values (peers) from {1}", values.Count, ipinfo.ToString()); RaisePeersFound(fSearchInfoHash, values); // FIXME: it's temp debug code foreach (var val in values) { SendPingQuery(val); SendPingQuery(new IPEndPoint(val.Address, fLocalIP.Port)); } result = true; } } return(result); }
public void Test_GetNeighbor() { var bytes1 = new byte[] { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11 }; var bytes2 = new byte[] { 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77 }; var result = DHTHelper.GetNeighbor(bytes1, bytes2); Assert.AreEqual("1111111111111111111177777777777777777777", result.ToHexString()); }
internal void SendGetPeersQuery(IPEndPoint address, byte[] infoHash) { var transactionID = DHTHelper.GetTransactionId(); var msg = DHTMessage.CreateGetPeersQuery(transactionID, fLocalID, infoHash); SetTransaction(transactionID, msg); Send(address, msg); }
public void Test_ToString() { var endPoint = new IPEndPoint(IPAddress.Any, 0); var randId = DHTHelper.GetRandomID(); var node = new DHTNode(randId, endPoint); Assert.IsNotNullOrEmpty(node.ToString()); }
public void Test_CreateHandshakeResponse() { var tid = DHTHelper.GetTransactionId(); var nodeId = DHTHelper.GetRandomID(); var msg = ProtocolHelper.CreateHandshakeResponse(tid, nodeId); Assert.IsNotNull(msg); // TODO: test contents }
public void Test_CreateGetPeerInfoQuery() { var tid = DHTHelper.GetTransactionId(); var nodeId = DHTHelper.GetRandomID(); var msg = ProtocolHelper.CreateGetPeerInfoQuery(tid, nodeId); Assert.IsNotNull(msg); // TODO: test contents }
public void Test_CreateChatMessage() { var tid = DHTHelper.GetTransactionId(); var nodeId = DHTHelper.GetRandomID(); var msg = ProtocolHelper.CreateChatMessage(tid, nodeId, "test"); Assert.IsNotNull(msg); // TODO: test contents }
public void Test_UpdateNode() { var table = new DHTRoutingTable(10); table.UpdateNode(null); var node = new DHTNode(DHTHelper.GetRandomID(), new IPEndPoint(IPAddress.Any, 0)); table.UpdateNode(node); }
public void Test_CreateAnnouncePeerResponse() { var tid = DHTHelper.GetTransactionId(); var nodeId = DHTHelper.GetRandomID(); DHTMessage msg = DHTMessage.CreateAnnouncePeerResponse(tid, nodeId, new List <DHTNode>()); Assert.IsNotNull(msg); Assert.AreEqual(MessageType.Response, msg.Type); // TODO: test contents }
public void Test_PeersFoundEventArgs() { byte[] infoHash = DHTHelper.GetRandomHashID(); List <IPEndPoint> peers = new List <IPEndPoint>(); var evt = new PeersFoundEventArgs(infoHash, peers); Assert.IsNotNull(evt); Assert.AreEqual(infoHash, evt.InfoHash); Assert.AreEqual(peers, evt.Peers); }
internal void SendPingQuery(IPEndPoint address) { fLogger.WriteDebug("Send peer ping {0}", address); var transactionID = DHTHelper.GetTransactionId(); var msg = DHTMessage.CreatePingQuery(transactionID, fLocalID); SetTransaction(transactionID, msg); Send(address, msg); }
public void Test_PeerPingedEventArgs() { IPEndPoint peerEndPoint = new IPEndPoint(IPAddress.Any, 1111); byte[] nodeId = DHTHelper.GetRandomID(); var evt = new PeerPingedEventArgs(peerEndPoint, nodeId); Assert.IsNotNull(evt); Assert.AreEqual(peerEndPoint, evt.EndPoint); Assert.AreEqual(nodeId, evt.NodeId); }
private void SendFindNodeQuery(IPEndPoint address, byte[] data) { var transactionID = DHTHelper.GetTransactionId(); byte[] nid = (data == null) ? fLocalID : DHTHelper.GetNeighbor(data, fLocalID); BDictionary sendData = DHTMessage.CreateFindNodeQuery(transactionID, nid); SetTransaction(transactionID, new DHTMessage(MsgType.query, QueryType.find_node, sendData)); Send(address, sendData); }
public void Test_CreateFindNodeQuery() { var tid = DHTHelper.GetTransactionId(); var nodeId = DHTHelper.GetRandomID(); DHTMessage msg = DHTMessage.CreateFindNodeQuery(tid, nodeId); Assert.IsNotNull(msg); Assert.AreEqual(MessageType.Query, msg.Type); Assert.AreEqual(QueryType.FindNode, msg.QueryType); // TODO: test contents }
internal void SendFindNodeQuery(IPEndPoint address, byte[] data) { var transactionID = DHTHelper.GetTransactionId(); byte[] nid = (data == null) ? fLocalID : DHTHelper.GetNeighbor(data, fLocalID); var msg = DHTMessage.CreateFindNodeQuery(transactionID, nid); SetTransaction(transactionID, msg); Send(address, msg); }
private void SendGetPeersQuery(IPEndPoint address, byte[] infoHash) { var transactionID = DHTHelper.GetTransactionId(); byte[] nid = fLocalID; BDictionary sendData = DHTMessage.CreateGetPeersQuery(transactionID, nid, infoHash); SetTransaction(transactionID, new DHTMessage(MsgType.query, QueryType.get_peers, sendData)); Send(address, sendData); }
public void Test_CreateGetPeersQuery() { var tid = DHTHelper.GetTransactionId(); var nodeId = DHTHelper.GetRandomID(); var infoHash = DHTHelper.GetRandomHashID(); DHTMessage msg = DHTMessage.CreateGetPeersQuery(tid, nodeId, infoHash); Assert.IsNotNull(msg); Assert.AreEqual(MessageType.Query, msg.Type); Assert.AreEqual(QueryType.GetPeers, msg.QueryType); // TODO: test contents }
private void SendShakeHand() { var peer = DHTHelper.GetRandomHashID(); var list = new List <byte>(); list.Add(0x13); list.AddRange(Encoding.ASCII.GetBytes("BitTorrent protocol")); list.AddRange(new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00 }); list.AddRange(InfoHash); list.AddRange(peer); fSocket.Send(list.ToArray(), SocketFlags.None); }
public void Test_CreateAnnouncePeerQuery() { var tid = DHTHelper.GetTransactionId(); var nodeId = DHTHelper.GetRandomID(); var infoHash = DHTHelper.GetRandomHashID(); DHTMessage msg = DHTMessage.CreateAnnouncePeerQuery(tid, nodeId, infoHash, 1, 1, new BString("XX")); Assert.IsNotNull(msg); Assert.AreEqual(MessageType.Query, msg.Type); Assert.AreEqual(QueryType.AnnouncePeer, msg.QueryType); // TODO: test contents }
public void Test_CreateGetPeersResponse() { var tid = DHTHelper.GetTransactionId(); var nodeId = DHTHelper.GetRandomID(); var infoHash = DHTHelper.GetRandomHashID(); var peers = new List <IDHTPeer>(); var nodes = new List <DHTNode>(); DHTMessage msg = DHTMessage.CreateGetPeersResponse(tid, nodeId, infoHash, peers, nodes); Assert.IsNotNull(msg); Assert.AreEqual(MessageType.Response, msg.Type); // TODO: test contents }
public void Test_ctor2() { var endPoint = new IPEndPoint(IPAddress.Any, 0); var randId = DHTHelper.GetRandomID(); var node = new DHTNode(randId, endPoint); Assert.IsNotNull(node); Assert.AreEqual(randId, node.ID); Assert.AreEqual(endPoint, node.EndPoint); Assert.AreEqual(0, node.LastAnnouncementTime); Assert.AreEqual(0, node.LastUpdateTime); }
public void Test_MessageEventArgs() { IPEndPoint peerEndPoint = new IPEndPoint(IPAddress.Any, 1111); byte[] nodeId = DHTHelper.GetRandomID(); BDictionary data = new BDictionary(); var evt = new MessageEventArgs(peerEndPoint, nodeId, data); Assert.IsNotNull(evt); Assert.AreEqual(peerEndPoint, evt.EndPoint); Assert.AreEqual(nodeId, evt.NodeId); Assert.AreEqual(data, evt.Data); }
public void Test_CreateGetPeerInfoResponse() { var peerInfo = new PeerProfile(); peerInfo.ResetSystem(); var tid = DHTHelper.GetTransactionId(); var nodeId = DHTHelper.GetRandomID(); var msg = ProtocolHelper.CreateGetPeerInfoResponse(tid, nodeId, peerInfo); Assert.IsNotNull(msg); // TODO: test contents }
private void SendPingQuery(IPEndPoint address) { fLogger.WriteDebug("Send peer ping " + address.ToString()); var transactionID = DHTHelper.GetTransactionId(); byte[] nid = fLocalID; BDictionary sendData = DHTMessage.CreatePingQuery(transactionID, nid); SetTransaction(transactionID, new DHTMessage(MsgType.query, QueryType.ping, sendData)); Send(address, sendData); }