From: bert hubert Date: Tue, 11 Jun 2013 10:57:14 +0000 (+0200) Subject: add initial tcpbench - untested X-Git-Tag: rec-3.6.0-rc1~684 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=a51b52c972b1eba4b8e5a2355e66fdee33ad784b;p=thirdparty%2Fpdns.git add initial tcpbench - untested --- diff --git a/pdns/Makefile.am b/pdns/Makefile.am index c46d95df3b..6d50bbd860 100644 --- a/pdns/Makefile.am +++ b/pdns/Makefile.am @@ -39,7 +39,7 @@ sbin_PROGRAMS = pdns_server bin_PROGRAMS = pdns_control pdnssec dnsreplay endif -EXTRA_PROGRAMS=pdns_recursor sdig tsig-tests speedtest pdns_control dnsscope dnsgram \ +EXTRA_PROGRAMS=pdns_recursor sdig tcpbench tsig-tests speedtest pdns_control dnsscope dnsgram \ testrunner \ toysdig dnsdemog dnswasher dnsscan nproxy notify pdnssec dnsbulktest nsec3dig # dnslabel # tcptorture @@ -142,6 +142,11 @@ sdig_SOURCES=sdig.cc sstuff.hh dnsparser.cc dnsparser.hh dnsrecords.cc dnswriter misc.cc misc.hh rcpgenerator.cc rcpgenerator.hh base64.cc base64.hh unix_utility.cc \ logger.cc statbag.cc qtype.cc sillyrecords.cc nsecrecords.cc base32.cc +tcpbench_SOURCES=tcpbench.cc sstuff.hh dnsparser.cc dnsparser.hh dnsrecords.cc dnswriter.cc dnslabeltext.cc dnswriter.hh \ + misc.cc misc.hh rcpgenerator.cc rcpgenerator.hh base64.cc base64.hh unix_utility.cc \ + logger.cc statbag.cc qtype.cc sillyrecords.cc nsecrecords.cc base32.cc + + nsec3dig_SOURCES=nsec3dig.cc sstuff.hh dnsparser.cc dnsparser.hh dnsrecords.cc dnswriter.cc dnslabeltext.cc \ dnswriter.hh dnssecinfra.cc \ misc.cc misc.hh rcpgenerator.cc rcpgenerator.hh base64.cc base64.hh unix_utility.cc \ diff --git a/pdns/tcpbench.cc b/pdns/tcpbench.cc new file mode 100644 index 0000000000..f30a6a80be --- /dev/null +++ b/pdns/tcpbench.cc @@ -0,0 +1,116 @@ +#include "dnsparser.hh" +#include "sstuff.hh" +#include "misc.hh" +#include "dnswriter.hh" +#include "dnsrecords.hh" +#include "statbag.hh" +#include +StatBag S; + +bool g_onlyTCP; + +void doQuery(const std::string& qname, uint16_t qtype, const ComboAddress& dest) +{ + vector packet; + DNSPacketWriter pw(packet, qname, qtype); + + string reply; + + if(!g_onlyTCP) { + Socket udpsock(InterNetwork, Datagram); + + udpsock.sendTo(string((char*)&*packet.begin(), (char*)&*packet.end()), dest); + ComboAddress origin; + udpsock.recvFrom(reply, origin); + MOADNSParser mdp(reply); + if(!mdp.d_header.tc) + return; + } + + + Socket sock(InterNetwork, Stream); + + sock.connect(dest); + uint16_t len; + len = htons(packet.size()); + if(sock.write((char *) &len, 2) != 2) + throw AhuException("tcp write failed"); + + sock.writen(string((char*)&*packet.begin(), (char*)&*packet.end())); + + if(sock.read((char *) &len, 2) != 2) + throw AhuException("tcp read failed"); + + len=ntohs(len); + char *creply = new char[len]; + int n=0; + int numread; + while(n g_queries; +ComboAddress g_dest; +void* worker(void*) +{ + Query q; + for(;;) { + unsigned int pos = ++g_pos; + if(pos > g_queries.size()) + break; + q=g_queries[pos]; + doQuery(q.qname, q.qtype, g_dest); + } + return 0; +} + + +int main(int argc, char** argv) +try +{ + reportAllTypes(); + g_onlyTCP=true; + g_dest = ComboAddress("127.0.0.1", 5300); + unsigned int numworkers=100; + pthread_t workers[numworkers]; + + for(unsigned int n = 0; n < 1000000; ++n) { + g_queries.push_back(Query("www.powerdns.com", QType::A)); + } + + for(unsigned int n = 0; n < numworkers; ++n) { + pthread_create(&workers[n], 0, worker, 0); + } + for(unsigned int n = 0; n < numworkers; ++n) { + void* status; + pthread_join(workers[n], &status); + } + +} +catch(std::exception &e) +{ + cerr<<"Fatal: "<