Add some public NTP servers.
[novacoin.git] / src / ntp.cpp
index b125e35..58d224c 100644 (file)
@@ -1,9 +1,9 @@
-#include <sys/time.h>
 
 #ifdef WIN32
 #include <winsock2.h>
 #else
 #include <sys/socket.h>
+#include <sys/time.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
 #include <netdb.h>
@@ -81,22 +81,20 @@ struct pkt {
   uint8_t  mac[5 * sizeof(uint32_t)]; /* mac */
 };
 
-int nServersCount = 65;
+int nServersCount = 103;
 
-std::string NtpServers[65] = {
+std::string NtpServers[103] = {
     // Microsoft
     "time.windows.com",
 
     // Google
     "time1.google.com",
     "time2.google.com",
+    "time3.google.com",
+    "time4.google.com",
 
     // Russian Federation
     "ntp.ix.ru",
-    "0.ru.pool.ntp.org",
-    "1.ru.pool.ntp.org",
-    "2.ru.pool.ntp.org",
-    "3.ru.pool.ntp.org",
     "ntp1.stratum2.ru",
     "ntp2.stratum2.ru",
     "ntp3.stratum2.ru",
@@ -117,6 +115,12 @@ std::string NtpServers[65] = {
     "ntp2.niiftri.irkutsk.ru",
     "vniiftri.khv.ru",
     "vniiftri2.khv.ru",
+    "ntp0.zenon.net",
+    "ntp.mobatime.ru",
+    "0.ru.pool.ntp.org",
+    "1.ru.pool.ntp.org",
+    "2.ru.pool.ntp.org",
+    "3.ru.pool.ntp.org",
 
     // United States
     "nist1-pa.ustiming.org",
@@ -143,6 +147,10 @@ std::string NtpServers[65] = {
     "ntp1.bu.edu",
     "ntp2.bu.edu",
     "ntp3.bu.edu",
+    "0.us.pool.ntp.org",
+    "1.us.pool.ntp.org",
+    "2.us.pool.ntp.org",
+    "3.us.pool.ntp.org",
 
     // South Africa
     "ntp1.meraka.csir.co.za",
@@ -156,10 +164,46 @@ std::string NtpServers[65] = {
     "ntp.time.org.za",
     "ntp1.meraka.csir.co.za",
     "ntp2.meraka.csir.co.za",
+    "0.za.pool.ntp.org",
+    "1.za.pool.ntp.org",
+    "2.za.pool.ntp.org",
+    "3.za.pool.ntp.org",
 
     // Italy
     "ntp1.inrim.it",
     "ntp2.inrim.it",
+    "0.it.pool.ntp.org",
+    "1.it.pool.ntp.org",
+    "2.it.pool.ntp.org",
+    "3.it.pool.ntp.org",
+
+    // Netherlands
+    "ntp0.nl.net",
+    "ntp1.nl.net",
+    "ntp2.nl.net",
+    "ntp.utwente.nl",
+    "0.nl.pool.ntp.org",
+    "1.nl.pool.ntp.org",
+    "2.nl.pool.ntp.org",
+    "3.nl.pool.ntp.org",
+
+    // United Kingdom
+    "ntp2d.mcc.ac.uk",
+    "ntp2c.mcc.ac.uk",
+    "ntp.exnet.com",
+    "ntp.cis.strath.ac.uk",
+    "ntppub.le.ac.uk",
+    "0.uk.pool.ntp.org",
+    "1.uk.pool.ntp.org",
+    "2.uk.pool.ntp.org",
+    "3.uk.pool.ntp.org",
+
+    // Japan
+    "ntp.nict.jp",
+    "0.jp.pool.ntp.org",
+    "1.jp.pool.ntp.org",
+    "2.jp.pool.ntp.org",
+    "3.jp.pool.ntp.org",
 
     // ... To be continued
 };
@@ -299,21 +343,20 @@ int64_t DoReq(SOCKET sockfd, socklen_t servlen, struct sockaddr cliaddr)
         return -3;
     }
 
-    retcode = 0;
-    int nWait = 0;
+    fd_set fdset;
+    struct timeval timeout = {5, 0};
+    FD_ZERO(&fdset);
+    FD_SET(sockfd, &fdset);
 
-    while(retcode <= 0) {
-        Sleep(1000);
-        retcode = recvfrom(sockfd, (char *) msg, len, 0, NULL, NULL);
-
-        if (nWait > 4) {
-            printf("recvfrom() timeout");
-            return -4;
-        }
-
-        nWait++;
+    retcode = select(sockfd + 1, &fdset, NULL, NULL, &timeout);
+    if (retcode <= 0)
+    {
+        printf("recvfrom() error");
+        return -4;
     }
 
+    recvfrom(sockfd, (char *) msg, len, 0, NULL, NULL);
+
     ntohl_fp(&msg->rec, &prt->rec);
     ntohl_fp(&msg->xmt, &prt->xmt);