#include "inflighter.cc"
+#include <deque>
#include "namespaces.hh"
#include "dnsparser.hh"
#include "sstuff.hh"
typedef int Identifier;
typedef DNSResult Answer; // ip
int d_socket;
- uint16_t d_id;
+ deque<uint16_t> d_idqueue;
SendReceive(const std::string& remoteAddr, uint16_t port)
connect(d_socket, (struct sockaddr*)&remote, remote.getSocklen());
d_oks = d_errors = d_nodatas = d_nxdomains = d_unknowns = 0;
d_receiveds = d_receiveerrors = 0;
+ for(unsigned int id =0 ; id < numeric_limits<uint16_t>::max(); ++id)
+ d_idqueue.push_back(id);
}
~SendReceive()
DNSPacketWriter pw(packet, domain, QType::A);
- pw.getHeader()->id = d_id++;
+ pw.getHeader()->id = d_idqueue.front();
+ d_idqueue.pop_front();
pw.getHeader()->rd = 1;
pw.getHeader()->qr = 0;
return 0;
}
+ void deliverTimeout(const Identifier& id)
+ {
+ d_idqueue.push_back(id);
+ }
+
void deliverAnswer(string& domain, const DNSResult& dr)
{
cout<<domain<<": rcode: "<<dr.rcode;
for(typename waiters_by_ttd_index_t::iterator valiter = waiters_index.begin(); valiter != waiters_index.end(); ) {
if(valiter->ttd.tv_sec < now.tv_sec || (valiter->ttd.tv_sec == now.tv_sec && valiter->ttd.tv_usec < now.tv_usec)) {
+ d_sr.deliverTimeout(valiter->id); // so backend can release id
waiters_index.erase(valiter++);
// cerr<<"Have timeout for id="<< valiter->id <<endl;
d_timeouts++;