Exemplo n.º 1
0
        private void ReceiveMessage()
        {
            if (_receiveQueue.Count == 0)
            {
                return;
            }

            KeyValuePair <IPEndPoint, DhtMessage> receive = _receiveQueue.Dequeue();
            DhtMessage message = receive.Value;
            IPEndPoint source  = receive.Key;

            for (int i = 0; i < _waitingResponse.Count; i++)
            {
                if (_waitingResponse[i].Message.TransactionId.Equals(message.TransactionId))
                {
                    _waitingResponse.RemoveAt(i--);
                }
            }

            //DHT.NET: We don't want to add these to the routing table as their ID is 0
            if (message.GetType() == typeof(ErrorMessage))
            {
                return;
            }

            try
            {
                Node node = _engine.RoutingTable.FindNode(message.Id);

                // What do i do with a null node?
                if (node == null)
                {
                    node = new Node(message.Id, source);
                    _engine.RoutingTable.Add(node);
                }

                node.Seen();
                message.Handle(_engine, node);

                ResponseBase response = message as ResponseBase;
                if (response != null)
                {
                    QuerySent?.Invoke(this, new SendQueryEventArgs(node.EndPoint, response.Query, response));
                }
            }
            catch (DHTMessageException ex)
            {
                Logger.Log("Incoming message barfed: {0}", ex);
                // Normal operation (FIXME: do i need to send a response error message?)
            }
            catch (Exception ex)
            {
                Logger.Log("Handle Error for message: {0}", ex);
                EnqueueSend(new ErrorMessage(ErrorCode.GenericError, "Misshandle received message!"), source);
            }
        }
Exemplo n.º 2
0
        private void ReceiveMessage()
        {
            if (receiveQueue.Count == 0)
            {
                return;
            }

            KeyValuePair <IPEndPoint, DhtMessage> receive;

            lock (locker)
            {
                receive = receiveQueue.Dequeue();
            }
            DhtMessage m      = receive.Value;
            IPEndPoint source = receive.Key;

            if (m == null || source == null)
            {
                return;
            }
            try
            {
                if (m is QueryMessage)
                {
                    m.Handle(engine, new Node(m.Id, source));
                }
                else if (m is ErrorMessage)
                {
                    RaiseOnError(((ErrorMessage)m).ErrorList.ToString());
                }
                RaiseMessageReceived(source, m);
            }
            catch (Exception ex)
            {
                RaiseOnError(string.Format("Handle Error for message: {0}", ex));
                Debug.WriteLine(ex);
            }
        }