{
vector<ComboAddress> ips;
int rcode;
+ bool seenauthsoa;
};
struct SendReceive
ComboAddress remote(remoteAddr, port);
connect(d_socket, (struct sockaddr*)&remote, remote.getSocklen());
- d_oks = d_errors = 0;
+ d_oks = d_errors = d_nodatas = d_nxdomains = 0;
}
~SendReceive()
// parse packet, set 'id', fill out 'ip'
MOADNSParser mdp(string(buf, len));
- //cout<<"Reply to question for qname='"<<mdp.d_qname<<"', qtype="<<DNSRecordContent::NumberToType(mdp.d_qtype)<<endl;
- //cout<<"Rcode: "<<mdp.d_header.rcode<<", RD: "<<mdp.d_header.rd<<", QR: "<<mdp.d_header.qr;
- //cout<<", TC: "<<mdp.d_header.tc<<", AA: "<<mdp.d_header.aa<<", opcode: "<<mdp.d_header.opcode<<endl;
+ cout<<"Reply to question for qname='"<<mdp.d_qname<<"', qtype="<<DNSRecordContent::NumberToType(mdp.d_qtype)<<endl;
+ cout<<"Rcode: "<<mdp.d_header.rcode<<", RD: "<<mdp.d_header.rd<<", QR: "<<mdp.d_header.qr;
+ cout<<", TC: "<<mdp.d_header.tc<<", AA: "<<mdp.d_header.aa<<", opcode: "<<mdp.d_header.opcode<<endl;
dr.rcode = mdp.d_header.rcode;
for(MOADNSParser::answers_t::const_iterator i=mdp.d_answers.begin(); i!=mdp.d_answers.end(); ++i) {
if(i->first.d_place == 1 && i->first.d_type == QType::A)
dr.ips.push_back(ComboAddress(i->first.d_content->getZoneRepresentation()));
- //cout<<i->first.d_place-1<<"\t"<<i->first.d_label<<"\tIN\t"<<DNSRecordContent::NumberToType(i->first.d_type);
- //cout<<"\t"<<i->first.d_ttl<<"\t"<< i->first.d_content->getZoneRepresentation()<<"\n";
+ if(i->first.d_place == 3 && i->first.d_type == QType::SOA) {
+ dr.seenauthsoa = 1;
+ }
+ cout<<i->first.d_place-1<<"\t"<<i->first.d_label<<"\tIN\t"<<DNSRecordContent::NumberToType(i->first.d_type);
+ cout<<"\t"<<i->first.d_ttl<<"\t"<< i->first.d_content->getZoneRepresentation()<<"\n";
}
+
id = mdp.d_header.id;
+
return 1;
}
return 0;
cout<<", "<<ca.toString();
}
cout<<endl;
- if(dr.rcode)
+ if(dr.rcode == RCode::NXDomain) {
+ d_nxdomains++;
+ }
+ else if(dr.rcode) {
d_errors++;
+ }
+ else if(dr.ips.empty() && dr.seenauthsoa)
+ d_nodatas++;
else if(!dr.ips.empty())
d_oks++;
}
- int d_errors, d_oks;
+ int d_errors, d_nxdomains, d_nodatas, d_oks;
};
Inflighter<vector<string>, SendReceive> inflighter(domains, sr);
inflighter.d_maxInFlight = 1000;
+ inflighter.d_timeoutSeconds = 5;
string line;
pair<string, string> split;
domains.push_back("www."+split.second);
}
cerr<<"Read "<<domains.size()<<" domains!"<<endl;
-
+ random_shuffle(domains.begin(), domains.end());
for(;;) {
try {
cerr<<"Caught exception: "<<e.what()<<endl;
}
}
- cerr<<"Results: "<<sr.d_errors<<" errors, "<<sr.d_oks<<" oks, "<<inflighter.getTimeouts()<<" timeouts"<<endl;
+ cerr<<"Results: "<<sr.d_errors<<" errors, "<<sr.d_oks<<" oks, "<<sr.d_nodatas<<" nodatas, "<<sr.d_nxdomains<<" nxdomains, "<<inflighter.getTimeouts()<<" timeouts"<<endl;
+ cerr<<inflighter.getUnexpecteds()<<" unexpected responses (probably seen as timeouts)"<<endl;
}
return d_timeouts;
}
+ uint64_t getUnexpecteds()
+ {
+ return d_unexpectedResponse;
+ }
+
private:
struct TTDItem
{
break; // we can send new questions!
}
else {
- // cerr<<"UNEXPECTED ANSWER!"<<endl;
+ // cerr<<"UNEXPECTED ANSWER: "<<id<<endl;
d_unexpectedResponse++;
}
}
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)) {
waiters_index.erase(valiter++);
- // cerr<<"Have timeout"<<endl;
+ // cerr<<"Have timeout for id="<< valiter->id <<endl;
+ d_timeouts++;
}
else
break;