X-Git-Url: https://git.novaco.in/?a=blobdiff_plain;f=src%2Fntp.cpp;h=efedce8dc4fae1ace0d6e8b6ba20161093612ca2;hb=b71fb9d52ca6df5c303bdffa3144f36a0f969781;hp=720cfb14583d633361ec72f3b2ebb29e849dcfb9;hpb=f2bcacaf01a0c77083fdf9d1baa6a201078c1efd;p=novacoin.git diff --git a/src/ntp.cpp b/src/ntp.cpp index 720cfb1..efedce8 100644 --- a/src/ntp.cpp +++ b/src/ntp.cpp @@ -14,6 +14,7 @@ #include "netbase.h" #include "util.h" +#include "net.h" extern int GetRandInt(int nMax); @@ -51,15 +52,13 @@ typedef struct { } l_fp; -inline void Ntp2Unix(uint32_t &n, time_t &u) -{ +inline void Ntp2Unix(uint32_t &n, time_t &u) { // Ntp's time scale starts in 1900, Unix in 1970. u = n - 0x83aa7e80; // 2208988800 1970 - 1900 in seconds } -inline void ntohl_fp(l_fp *n, l_fp *h) -{ +inline void ntohl_fp(l_fp *n, l_fp *h) { (h)->Ul_i.Xl_ui = ntohl((n)->Ul_i.Xl_ui); (h)->Ul_f.Xl_uf = ntohl((n)->Ul_f.Xl_uf); } @@ -81,22 +80,35 @@ struct pkt { uint8_t mac[5 * sizeof(uint32_t)]; /* mac */ }; -int nServersCount = 65; +int nServersCount = 118; -std::string NtpServers[65] = { +std::string NtpServers[118] = { // Microsoft "time.windows.com", // Google "time1.google.com", "time2.google.com", + "time3.google.com", + "time4.google.com", + + // Hurricane Electric + "clock.sjc.he.net", + "clock.nyc.he.net", + + // SixXS + "ntp.sixxs.net", + "ntp.eu.sixxs.net", + "ntp.us.sixxs.net", + "ntp.ap.sixxs.net", // Russian Federation + "ntp.karelia.pro", + "ntp.alpet.me", + "aviel.alpet.me", + "ntp.sampo.ru", + "ntp.szt.ru", "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,8 +129,18 @@ 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 + "ntp-01.caltech.edu", + "ntp-02.caltech.edu", + "ntp-03.caltech.edu", + "ntp-04.caltech.edu", "nist1-pa.ustiming.org", "time-a.nist.gov ", "time-b.nist.gov ", @@ -143,6 +165,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,20 +182,54 @@ 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 }; -bool InitWithRandom(SOCKET &sockfd, socklen_t &servlen, struct sockaddr *pcliaddr) -{ +bool InitWithRandom(SOCKET &sockfd, socklen_t &servlen, struct sockaddr *pcliaddr) { int nAttempt = 0; - while(nAttempt < 100) - { + while(nAttempt < 100) { sockfd = -1; nAttempt++; @@ -185,10 +245,8 @@ bool InitWithRandom(SOCKET &sockfd, socklen_t &servlen, struct sockaddr *pcliadd servaddr.sin_port = htons(123); bool found = false; - for(unsigned int i = 0; i < vIP.size(); i++) - { - if ((found = vIP[i].GetInAddr(&servaddr.sin_addr))) - { + for(unsigned int i = 0; i < vIP.size(); i++) { + if ((found = vIP[i].GetInAddr(&servaddr.sin_addr))) { break; } } @@ -201,8 +259,7 @@ bool InitWithRandom(SOCKET &sockfd, socklen_t &servlen, struct sockaddr *pcliadd if (sockfd == INVALID_SOCKET) continue; // socket initialization error - if (connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) == -1 ) - { + if (connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) == -1 ) { continue; // "connection" error } @@ -214,38 +271,36 @@ bool InitWithRandom(SOCKET &sockfd, socklen_t &servlen, struct sockaddr *pcliadd return false; } -bool InitWithHost(std::string &strHostName, SOCKET &sockfd, socklen_t &servlen, struct sockaddr *pcliaddr) -{ +bool InitWithHost(std::string &strHostName, SOCKET &sockfd, socklen_t &servlen, struct sockaddr *pcliaddr) { sockfd = -1; std::vector vIP; bool fRet = LookupHost(strHostName.c_str(), vIP, 10, true); - if (!fRet) + if (!fRet) { return false; + } struct sockaddr_in servaddr; servaddr.sin_family = AF_INET; servaddr.sin_port = htons(123); bool found = false; - for(unsigned int i = 0; i < vIP.size(); i++) - { - if ((found = vIP[i].GetInAddr(&servaddr.sin_addr))) - { + for(unsigned int i = 0; i < vIP.size(); i++) { + if ((found = vIP[i].GetInAddr(&servaddr.sin_addr))) { break; } } - if (!found) + if (!found) { return false; + } sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd == INVALID_SOCKET) return false; // socket initialization error - if (connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) == -1 ) - { + if (connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) == -1 ) { return false; // "connection" error } @@ -257,17 +312,13 @@ bool InitWithHost(std::string &strHostName, SOCKET &sockfd, socklen_t &servlen, } -int64_t DoReq(SOCKET sockfd, socklen_t servlen, struct sockaddr cliaddr) -{ - +int64_t DoReq(SOCKET sockfd, socklen_t servlen, struct sockaddr cliaddr) { #ifdef WIN32 u_long nOne = 1; - if (ioctlsocket(sockfd, FIONBIO, &nOne) == SOCKET_ERROR) - { + if (ioctlsocket(sockfd, FIONBIO, &nOne) == SOCKET_ERROR) { printf("ConnectSocket() : ioctlsocket non-blocking setting failed, error %d\n", WSAGetLastError()); #else - if (fcntl(sockfd, F_SETFL, O_NONBLOCK) == SOCKET_ERROR) - { + if (fcntl(sockfd, F_SETFL, O_NONBLOCK) == SOCKET_ERROR) { printf("ConnectSocket() : fcntl non-blocking setting failed, error %d\n", errno); #endif return -2; @@ -299,21 +350,19 @@ int64_t DoReq(SOCKET sockfd, socklen_t servlen, struct sockaddr cliaddr) return -3; } - retcode = 0; - int nWait = 0; - - while(retcode <= 0) { - Sleep(1000); - retcode = recvfrom(sockfd, (char *) msg, len, 0, NULL, NULL); + fd_set fdset; + struct timeval timeout = {10, 0}; + FD_ZERO(&fdset); + FD_SET(sockfd, &fdset); - 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); @@ -329,8 +378,23 @@ int64_t DoReq(SOCKET sockfd, socklen_t servlen, struct sockaddr cliaddr) return (seconds_receive + seconds_transmit) / 2; } -int64_t NtpGetTime() -{ +int64_t NtpGetTime() { + struct sockaddr cliaddr; + + SOCKET sockfd; + socklen_t servlen; + + if (!InitWithRandom(sockfd, servlen, &cliaddr)) + return -1; + + int64_t nTime = DoReq(sockfd, servlen, cliaddr); + + closesocket(sockfd); + + return nTime; +} + +int64_t NtpGetTime(CNetAddr& ip) { struct sockaddr cliaddr; SOCKET sockfd; @@ -339,6 +403,7 @@ int64_t NtpGetTime() if (!InitWithRandom(sockfd, servlen, &cliaddr)) return -1; + ip = CNetAddr(((sockaddr_in *)&cliaddr)->sin_addr); int64_t nTime = DoReq(sockfd, servlen, cliaddr); closesocket(sockfd); @@ -362,3 +427,30 @@ int64_t NtpGetTime(std::string &strHostName) return nTime; } + +void ThreadNtpSamples(void* parg) +{ + printf("ThreadNtpSamples started\n"); + vnThreadsRunning[THREAD_NTP]++; + + // Make this thread recognisable as time synchronization thread + RenameThread("novacoin-ntp-samples"); + + while (!fShutdown) { + CNetAddr ip; + int64_t nTime = NtpGetTime(ip); + + if (nTime > 0 && nTime != 2085978496) { // Skip the deliberately wrong timestamps + AddTimeData(ip, nTime); + } + else { + Sleep(600000); // In case of failure wait 600 seconds and then try again + continue; + } + + Sleep(43200000); // Sleep for 12 hours + } + + vnThreadsRunning[THREAD_NTP]--; + printf("ThreadNtpSamples exited\n"); +}