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 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)); }
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)); }
void RaiseMessageSent(Node node, IPEndPoint endpoint, QueryMessage query, ErrorMessage error) => QuerySent?.Invoke(this, new SendQueryEventArgs(node, endpoint, query, error));
void RaiseMessageSent(Node node, IPEndPoint endpoint, QueryMessage query, ResponseMessage response) => QuerySent?.Invoke(this, new SendQueryEventArgs(node, endpoint, query, response));
void RaiseMessageSent(Node node, IPEndPoint endpoint, QueryMessage query) { QuerySent?.Invoke(this, new SendQueryEventArgs(node, endpoint, query)); }