Exemple #1
0
            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);
                }
            }
Exemple #2
0
        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);
            }
        }