result_message.decode( ReceiveBuffer );
// check ID
- if (RequestId != result_message.id())
+ if (RequestId == 0)
+ { // system DNS or firewall might have longer timeout than me
+ // --> might receive replies for old requests whose time-out has expired
+ // --> have already called callbacks etc, so nothing to do with result
+ // TODO: did receive probably same data several times --> reset buffer?
+ GlobalLogger.info() << LogPrefix << "Ignoring reply to old DNS request "
+ << "(reply has ID " << std::showbase << std::hex
+ << result_message.id() << " or buffer not reset)";
+ return;
+ }
+ else if (RequestId != result_message.id())
+ {
GlobalLogger.info() << LogPrefix << "Received answer for request ID "
<< std::showbase << std::hex << result_message.id()
- << " but expected ID " << RequestId;
+ << " but expected ID " << RequestId << " --> ignore and retry";
+ schedule_retry(recursion_count);
+ return;
+ }
else
GlobalLogger.debug() << LogPrefix << "Result has correct ID "
<< std::showbase << std::hex << RequestId;
LongtermTimerIsActive = true;
// for now, admit failure
+ RequestId = 0; // do not accept answers from old requests
bool was_success = false;
finalize_resolve(was_success, recursion_count);
}