public void StorePeer(BinaryNumber networkID, PeerEndPoint peerEP) { lock (_data) { List <PeerEndPoint> peerList; if (_data.ContainsKey(networkID)) { peerList = _data[networkID]; } else { peerList = new List <PeerEndPoint>(); _data.Add(networkID, peerList); } foreach (PeerEndPoint peer in peerList) { if (peer.Equals(peerEP)) { peer.UpdateDateAdded(); return; } } peerList.Add(peerEP); } }
public DhtRpcPacket(Stream s) { int version = s.ReadByte(); switch (version) { case -1: throw new EndOfStreamException(); case 2: byte[] buffer = new byte[20]; OffsetStream.StreamRead(s, buffer, 0, 2); _sourceNodePort = BitConverter.ToUInt16(buffer, 0); _type = (DhtRpcType)s.ReadByte(); switch (_type) { case DhtRpcType.PING: break; case DhtRpcType.FIND_NODE: { OffsetStream.StreamRead(s, buffer, 0, 20); _networkID = BinaryNumber.Clone(buffer, 0, 20); int count = s.ReadByte(); _contacts = new NodeContact[count]; for (int i = 0; i < count; i++) { _contacts[i] = new NodeContact(s); } } break; case DhtRpcType.FIND_PEERS: { OffsetStream.StreamRead(s, buffer, 0, 20); _networkID = BinaryNumber.Clone(buffer, 0, 20); int count = s.ReadByte(); _contacts = new NodeContact[count]; for (int i = 0; i < count; i++) { _contacts[i] = new NodeContact(s); } count = s.ReadByte(); _peers = new PeerEndPoint[count]; for (int i = 0; i < count; i++) { _peers[i] = new PeerEndPoint(s); } } break; case DhtRpcType.ANNOUNCE_PEER: { OffsetStream.StreamRead(s, buffer, 0, 20); _networkID = BinaryNumber.Clone(buffer, 0, 20); OffsetStream.StreamRead(s, buffer, 0, 2); _servicePort = BitConverter.ToUInt16(buffer, 0); int count = s.ReadByte(); _peers = new PeerEndPoint[count]; for (int i = 0; i < count; i++) { _peers[i] = new PeerEndPoint(s); } } break; default: throw new IOException("Invalid DHT-RPC type."); } break; default: throw new IOException("DHT-RPC packet version not supported: " + version); } }
public DhtRpcPacket(Stream s, IPAddress nodeIP) { int version = s.ReadByte(); switch (version) { case 1: byte[] buffer = new byte[20]; OffsetStream.StreamRead(s, buffer, 0, 4); _transactionID = BitConverter.ToInt32(buffer, 0); OffsetStream.StreamRead(s, buffer, 0, 20); BinaryID nodeID = BinaryID.Clone(buffer, 0, 20); OffsetStream.StreamRead(s, buffer, 0, 2); _sourceNode = new NodeContact(nodeID, new IPEndPoint(nodeIP, BitConverter.ToUInt16(buffer, 0))); _type = (RpcPacketType)s.ReadByte(); _queryType = (RpcQueryType)s.ReadByte(); switch (_queryType) { case RpcQueryType.FIND_NODE: OffsetStream.StreamRead(s, buffer, 0, 20); _networkID = BinaryID.Clone(buffer, 0, 20); if (_type == RpcPacketType.Response) { int count = s.ReadByte(); _contacts = new NodeContact[count]; for (int i = 0; i < count; i++) { _contacts[i] = new NodeContact(s); } } break; case RpcQueryType.FIND_PEERS: OffsetStream.StreamRead(s, buffer, 0, 20); _networkID = BinaryID.Clone(buffer, 0, 20); if (_type == RpcPacketType.Response) { int count = s.ReadByte(); _contacts = new NodeContact[count]; for (int i = 0; i < count; i++) { _contacts[i] = new NodeContact(s); } count = s.ReadByte(); _peers = new PeerEndPoint[count]; for (int i = 0; i < count; i++) { _peers[i] = new PeerEndPoint(s); } OffsetStream.StreamRead(s, buffer, 0, 20); _token = new BinaryID(buffer); } break; case RpcQueryType.ANNOUNCE_PEER: OffsetStream.StreamRead(s, buffer, 0, 20); _networkID = BinaryID.Clone(buffer, 0, 20); if (_type == RpcPacketType.Query) { OffsetStream.StreamRead(s, buffer, 0, 2); _servicePort = BitConverter.ToUInt16(buffer, 0); OffsetStream.StreamRead(s, buffer, 0, 20); _token = new BinaryID(buffer); } break; } break; default: throw new IOException("DHT-RPC packet version not supported: " + version); } }