]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
use the right binding code for TCP vs UDP, thanks Sander Hoentjen. Closes #644 and...
authorPeter van Dijk <peter.van.dijk@netherlabs.nl>
Wed, 2 Jan 2013 09:30:44 +0000 (09:30 +0000)
committerPeter van Dijk <peter.van.dijk@netherlabs.nl>
Wed, 2 Jan 2013 09:30:44 +0000 (09:30 +0000)
git-svn-id: svn://svn.powerdns.com/pdns/trunk/pdns@3014 d19b8d6e-7fed-0310-83ef-9ca221ded41b

pdns/resolver.cc

index 9cc3b8487c80a8dcfe8e744a8d45441b6345602a..6ffb3a11edcaa39b77b8092ceabce929fa837adb 100644 (file)
@@ -55,7 +55,8 @@ int makeQuerySocket(const ComboAddress& local, bool udpOrTCP)
     unixDie("Creating local resolver socket for "+ourLocal.toString() + ((local.sin4.sin_family == AF_INET6) ? ", does your OS miss IPv6?" : ""));
   }
 
-  if(!udpOrTCP) {
+  if(udpOrTCP) {
+    // udp, try hard to bind an unpredictable port
     int tries=10;
     while(--tries) {
       ourLocal.sin4.sin_port = htons(10000+(dns_random(10000)));
@@ -63,12 +64,16 @@ int makeQuerySocket(const ComboAddress& local, bool udpOrTCP)
       if (::bind(sock, (struct sockaddr *)&ourLocal, ourLocal.getSocklen()) >= 0) 
         break;
     }
+    // cerr<<"bound udp port "<<ourLocal.sin4.sin_port<<", "<<tries<<" tries left"<<endl;
+
     if(!tries) {
       Utility::closesocket(sock);
       throw AhuException("Resolver binding to local UDP socket on "+ourLocal.toString()+": "+stringerror());
     }
   }
   else {
+    // tcp, let the kernel figure out the port
+    // cerr<<"letting kernel pick TCP port"<<endl;
     ourLocal.sin4.sin_port = 0;
     if(::bind(sock, (struct sockaddr *)&ourLocal, ourLocal.getSocklen()) < 0)
       throw AhuException("Resolver binding to local TCP socket on "+ourLocal.toString()+": "+stringerror());