Ejemplo 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);
            }
        }
Ejemplo n.º 2
0
        private void TimeoutMessage()
        {
            if (_waitingResponse.Count <= 0)
            {
                return;
            }

            if (DateTime.UtcNow - _waitingResponse[0].SentAt <= _engine.TimeOut)
            {
                return;
            }

            SendDetails details = _waitingResponse.TakeFirst();

            MessageFactory.UnregisterSend((QueryBase)details.Message);
            QuerySent?.Invoke(this, new SendQueryEventArgs(details.Destination, (QueryBase)details.Message, null));
        }
Ejemplo n.º 3
0
 private void RaiseMessageSent(IPEndPoint endpoint, QueryMessage query, ResponseMessage response)
 {
     //Console.WriteLine ("Query: {0}. Response: {1}. TimedOut: {2}", query.GetType ().Name, response?.GetType ().Name, response == null);
     QuerySent?.Invoke(this, new SendQueryEventArgs(endpoint, query, response));
 }
Ejemplo n.º 4
0
 void RaiseMessageSent(Node node, IPEndPoint endpoint, QueryMessage query, ErrorMessage error)
 => QuerySent?.Invoke(this, new SendQueryEventArgs(node, endpoint, query, error));
Ejemplo n.º 5
0
 void RaiseMessageSent(Node node, IPEndPoint endpoint, QueryMessage query, ResponseMessage response)
 => QuerySent?.Invoke(this, new SendQueryEventArgs(node, endpoint, query, response));
Ejemplo n.º 6
0
 void RaiseMessageSent(Node node, IPEndPoint endpoint, QueryMessage query)
 {
     QuerySent?.Invoke(this, new SendQueryEventArgs(node, endpoint, query));
 }