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); } }
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); } }