for the last attempt of choosing a port, let the OS decide
[lcore.git] / dnssync.pas
index d037a68ea9cc350bee1ca33d95cbd95e770efcce..f6b02817fd07301b75d1d3920e7209e0912bdad8 100644 (file)
@@ -71,6 +71,7 @@ implementation
 \r
 {$i unixstuff.inc}\r
 \r
+type tdnsstatearr=array[0..numsock-1] of tdnsstate;\r
 \r
 {$ifdef syncdnscore}\r
 \r
@@ -98,9 +99,6 @@ begin
 {$endif}\r
 end;\r
 \r
-\r
-type tdnsstatearr=array[0..numsock-1] of tdnsstate;\r
-\r
 procedure resolveloop(timeout:integer;var state:tdnsstatearr;numsockused:integer);\r
 var\r
   selectresult   : integer;\r
@@ -134,7 +132,8 @@ procedure setupsocket;
 var\r
   inAddrtemp : TInetSockAddrV;\r
   biniptemp:tbinip;\r
-  a:integer;\r
+  a,retrycount,porttemp:integer;\r
+  bindresult:boolean;\r
 begin\r
   biniptemp := getcurrentsystemnameserverbin(id);\r
   //must get the DNS server here so we know to init v4 or v6\r
@@ -143,11 +142,22 @@ begin
 \r
 \r
   for a := 0 to numsockused-1 do begin\r
-    makeinaddrv(biniptemp,inttostr( 1024 + randominteger(65536 - 1024) ),inaddrtemp);\r
+    retrycount := 5;\r
+    repeat\r
+      if (retrycount <= 1) then begin\r
+        porttemp := 0; //for the last attempt let the OS decide\r
+      end else begin\r
+        porttemp := 1024 + randominteger(65536 - 1024);\r
+      end;\r
+\r
+      makeinaddrv(biniptemp,inttostr( porttemp ),inaddrtemp);\r
 \r
-    fd[a] := Socket(biniptemp.family,SOCK_DGRAM,0);\r
+      fd[a] := Socket(biniptemp.family,SOCK_DGRAM,0);\r
+      bindresult := {$ifdef win32}Not{$endif} Bind(fd[a],inAddrtemp,inaddrsize(inaddrtemp));\r
+      dec(retrycount);\r
+    until (retrycount <= 0) or (bindresult);\r
 \r
-    If {$ifndef win32}Not{$endif} Bind(fd[a],inAddrtemp,inaddrsize(inaddrtemp)) Then begin\r
+    If (not bindresult) Then begin\r
       {$ifdef win32}\r
         raise Exception.create('unable to bind '+inttostr(WSAGetLastError));\r
       {$else}\r