X-Git-Url: https://git.novaco.in/?a=blobdiff_plain;f=src%2Fntp.cpp;h=1d43fdbb7a656e39c7ec9c19cc661530c23ab9df;hb=7b1fc4e89eec43568d7ac94d4f30e50cee1d52ab;hp=9c1b6e548e0039560f6622653491e72e2d2c413f;hpb=cd37f49194e0f377335ecbf8990b7c92e0a19ef0;p=novacoin.git diff --git a/src/ntp.cpp b/src/ntp.cpp index 9c1b6e5..1d43fdb 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,9 +80,9 @@ struct pkt { uint8_t mac[5 * sizeof(uint32_t)]; /* mac */ }; -int nServersCount = 107; +const int nServersCount = 147; -std::string NtpServers[107] = { +std::string NtpServers[147] = { // Microsoft "time.windows.com", @@ -93,7 +92,22 @@ std::string NtpServers[107] = { "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", "ntp1.stratum2.ru", "ntp2.stratum2.ru", @@ -123,6 +137,15 @@ std::string NtpServers[107] = { "3.ru.pool.ntp.org", // United States + "tock.cs.unlv.edu", + "timex.cs.columbia.edu", + "tick.cs.unlv.edu", + "sundial.columbia.edu", + "ntp-1.ece.cmu.edu", + "ntp-2.ece.cmu.edu", + "ntp1.cs.wisc.edu", + "ntp2.cs.wisc.edu", + "ntp3.cs.wisc.edu", "ntp-01.caltech.edu", "ntp-02.caltech.edu", "ntp-03.caltech.edu", @@ -194,6 +217,7 @@ std::string NtpServers[107] = { // United Kingdom "ntp2d.mcc.ac.uk", "ntp2c.mcc.ac.uk", + "ntp2b.mcc.ac.uk", "ntp.exnet.com", "ntp.cis.strath.ac.uk", "ntppub.le.ac.uk", @@ -202,6 +226,19 @@ std::string NtpServers[107] = { "2.uk.pool.ntp.org", "3.uk.pool.ntp.org", + // Canada + "chime.utoronto.ca", + "tick.utoronto.ca", + "time.nrc.ca", + "timelord.uregina.ca", + "tock.utoronto.ca", + "www1.cmc.ec.gc.ca", + "www2.cmc.ec.gc.ca", + "0.ca.pool.ntp.org", + "1.ca.pool.ntp.org", + "2.ca.pool.ntp.org", + "3.ca.pool.ntp.org", + // Japan "ntp.nict.jp", "0.jp.pool.ntp.org", @@ -209,91 +246,53 @@ std::string NtpServers[107] = { "2.jp.pool.ntp.org", "3.jp.pool.ntp.org", - // ... To be continued -}; - -bool InitWithRandom(SOCKET &sockfd, socklen_t &servlen, struct sockaddr *pcliaddr) -{ - int nAttempt = 0; - - while(nAttempt < 100) - { - sockfd = -1; - nAttempt++; - - int nServerNum = GetRandInt(nServersCount); - - std::vector vIP; - bool fRet = LookupHost(NtpServers[nServerNum].c_str(), vIP, 10, true); - if (!fRet) - continue; - - 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))) - { - break; - } - } - - if (!found) - continue; + // Australia + "ntp.cs.mu.oz.au", + "augean.eleceng.adelaide.edu.au", + "0.au.pool.ntp.org", + "1.au.pool.ntp.org", + "2.au.pool.ntp.org", + "3.au.pool.ntp.org", - sockfd = socket(AF_INET, SOCK_DGRAM, 0); - - if (sockfd == INVALID_SOCKET) - continue; // socket initialization error - - if (connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) == -1 ) - { - continue; // "connection" error - } + // Slovenia + "time.ijs.si", - *pcliaddr = *((struct sockaddr *) &servaddr); - servlen = sizeof(servaddr); - return true; - } + // ??? + "clepsydra.dec.com", - return false; -} + // ... To be continued +}; -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 } @@ -304,18 +303,25 @@ bool InitWithHost(std::string &strHostName, SOCKET &sockfd, socklen_t &servlen, return true; } +bool InitWithRandom(SOCKET &sockfd, socklen_t &servlen, struct sockaddr *pcliaddr) { -int64_t DoReq(SOCKET sockfd, socklen_t servlen, struct sockaddr cliaddr) -{ + for (int nAttempt = 0; nAttempt < nServersCount; nAttempt++) { + int nServerNum = GetRandInt(nServersCount); + if (InitWithHost(NtpServers[nServerNum], sockfd, servlen, pcliaddr)) { + return true; + } + } + + return false; +} +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; @@ -353,8 +359,7 @@ int64_t DoReq(SOCKET sockfd, socklen_t servlen, struct sockaddr cliaddr) FD_SET(sockfd, &fdset); retcode = select(sockfd + 1, &fdset, NULL, NULL, &timeout); - if (retcode <= 0) - { + if (retcode <= 0) { printf("recvfrom() error"); return -4; } @@ -376,8 +381,7 @@ int64_t DoReq(SOCKET sockfd, socklen_t servlen, struct sockaddr cliaddr) return (seconds_receive + seconds_transmit) / 2; } -int64_t NtpGetTime() -{ +int64_t NtpGetTime(CNetAddr& ip) { struct sockaddr cliaddr; SOCKET sockfd; @@ -386,6 +390,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); @@ -393,17 +398,16 @@ int64_t NtpGetTime() return nTime; } -int64_t NtpGetTime(CNetAddr& ip) +int64_t NtpGetTime(std::string &strHostName) { struct sockaddr cliaddr; SOCKET sockfd; socklen_t servlen; - if (!InitWithRandom(sockfd, servlen, &cliaddr)) + if (!InitWithHost(strHostName, sockfd, servlen, &cliaddr)) return -1; - ip = CNetAddr(((sockaddr_in *)&cliaddr)->sin_addr); int64_t nTime = DoReq(sockfd, servlen, cliaddr); closesocket(sockfd); @@ -411,19 +415,29 @@ int64_t NtpGetTime(CNetAddr& ip) return nTime; } -int64_t NtpGetTime(std::string &strHostName) +void ThreadNtpSamples(void* parg) { - struct sockaddr cliaddr; + printf("ThreadNtpSamples started\n"); + vnThreadsRunning[THREAD_NTP]++; - SOCKET sockfd; - socklen_t servlen; + // Make this thread recognisable as time synchronization thread + RenameThread("novacoin-ntp-samples"); - if (!InitWithHost(strHostName, sockfd, servlen, &cliaddr)) - return -1; + while (!fShutdown) { + CNetAddr ip; + int64_t nTime = NtpGetTime(ip); - int64_t nTime = DoReq(sockfd, servlen, cliaddr); + 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; + } - closesocket(sockfd); + Sleep(43200000); // Sleep for 12 hours + } - return nTime; + vnThreadsRunning[THREAD_NTP]--; + printf("ThreadNtpSamples exited\n"); }