X-Git-Url: https://git.novaco.in/?p=novacoin.git;a=blobdiff_plain;f=src%2Fntp.cpp;h=76b0afdf34d8fed2032cc12fa425b2a4c74700e4;hp=0cd94b9074718daa6391332bf6f8dd8aaa3ce52d;hb=4ca0237ec0d2825004fa3aa2b00a94da2a083b8b;hpb=0592a5eff7d0151fdff020618be2d63601ec5ef8 diff --git a/src/ntp.cpp b/src/ntp.cpp index 0cd94b9..76b0afd 100644 --- a/src/ntp.cpp +++ b/src/ntp.cpp @@ -13,7 +13,8 @@ #include "netbase.h" #include "net.h" -#include "util.h" +//#include "util.h" +#include "ui_interface.h" extern int GetRandInt(int nMax); @@ -51,7 +52,7 @@ typedef struct { } l_fp; -inline void Ntp2Unix(uint32_t &n, time_t &u) { +inline void Ntp2Unix(const uint32_t &n, time_t &u) { // Ntp's time scale starts in 1900, Unix in 1970. u = n - 0x83aa7e80; // 2208988800 1970 - 1900 in seconds @@ -79,9 +80,12 @@ struct pkt { uint8_t mac[5 * sizeof(uint32_t)]; /* mac */ }; -const int nServersCount = 147; +const int nServersCount = 154; + +std::string NtpServers[nServersCount] = { + // Apple + "time.apple.com", -const std::string NtpServers[147] = { // Microsoft "time.windows.com", @@ -95,12 +99,6 @@ const std::string NtpServers[147] = { "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", @@ -113,12 +111,11 @@ const std::string NtpServers[147] = { "ntp3.stratum2.ru", "ntp4.stratum2.ru", "ntp5.stratum2.ru", - "ntp6.stratum2.ru", - "ntp7.stratum2.ru", "ntp1.stratum1.ru", "ntp2.stratum1.ru", "ntp3.stratum1.ru", "ntp4.stratum1.ru", + "ntp5.stratum1.ru", "ntp1.vniiftri.ru", "ntp2.vniiftri.ru", "ntp3.vniiftri.ru", @@ -142,34 +139,34 @@ const std::string NtpServers[147] = { "sundial.columbia.edu", "ntp-1.ece.cmu.edu", "ntp-2.ece.cmu.edu", + "ntp-3.ece.cmu.edu", "ntp1.cs.wisc.edu", "ntp2.cs.wisc.edu", "ntp3.cs.wisc.edu", + "ntp4.cs.wisc.edu", "ntp-01.caltech.edu", "ntp-02.caltech.edu", "ntp-03.caltech.edu", "ntp-04.caltech.edu", + "nist0-pa.ustiming.org", "nist1-pa.ustiming.org", - "time-a.nist.gov ", - "time-b.nist.gov ", - "time-c.nist.gov ", - "time-d.nist.gov ", + "nist2-pa.ustiming.org", + "time.nist.gov", + "time-a.nist.gov", + "time-b.nist.gov", + "time-c.nist.gov", + "time-d.nist.gov", + "time-nw.nist.gov", "nist1-macon.macon.ga.us", "nist.netservicesgroup.com", - "nisttime.carsoncity.k12.mi.us", - "nist1-lnk.binary.net", "wwv.nist.gov", "time-a.timefreq.bldrdoc.gov", "time-b.timefreq.bldrdoc.gov", "time-c.timefreq.bldrdoc.gov", - "time.nist.gov", "utcnist.colorado.edu", "utcnist2.colorado.edu", - "ntp-nist.ldsbc.net", "nist1-lv.ustiming.org", "time-nw.nist.gov", - "nist-time-server.eoni.com", - "nist-time-server.eoni.com", "ntp1.bu.edu", "ntp2.bu.edu", "ntp3.bu.edu", @@ -177,6 +174,12 @@ const std::string NtpServers[147] = { "1.us.pool.ntp.org", "2.us.pool.ntp.org", "3.us.pool.ntp.org", + "otc1.psu.edu", + "otc2.psu.edu", + "now.okstate.edu", + "ntp.colby.edu", + "bonehed.lcs.mit.edu", + "ntp-s1.cise.ufl.edu", // South Africa "ntp1.meraka.csir.co.za", @@ -196,6 +199,9 @@ const std::string NtpServers[147] = { "3.za.pool.ntp.org", // Italy + "ntp0.ien.it", + "ntp1.ien.it", + "ntp2.ien.it", "ntp1.inrim.it", "ntp2.inrim.it", "0.it.pool.ntp.org", @@ -231,8 +237,6 @@ const std::string NtpServers[147] = { "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", @@ -256,6 +260,12 @@ const std::string NtpServers[147] = { // Slovenia "time.ijs.si", + // Austria + "0.at.pool.ntp.org", + "1.at.pool.ntp.org", + "2.at.pool.ntp.org", + "3.at.pool.ntp.org", + // ??? "clepsydra.dec.com", @@ -263,7 +273,8 @@ const std::string NtpServers[147] = { }; bool InitWithHost(const std::string &strHostName, SOCKET &sockfd, socklen_t &servlen, struct sockaddr *pcliaddr) { - sockfd = -1; + + sockfd = INVALID_SOCKET; std::vector vIP; bool fRet = LookupHost(strHostName.c_str(), vIP, 10, true); @@ -277,7 +288,7 @@ bool InitWithHost(const std::string &strHostName, SOCKET &sockfd, socklen_t &ser bool found = false; for(unsigned int i = 0; i < vIP.size(); i++) { - if ((found = vIP[i].GetInAddr(&servaddr.sin_addr))) { + if ((found = vIP[i].GetInAddr(&servaddr.sin_addr)) != false) { break; } } @@ -315,6 +326,8 @@ bool InitWithRandom(SOCKET &sockfd, socklen_t &servlen, struct sockaddr *pcliadd } int64_t DoReq(SOCKET sockfd, socklen_t servlen, struct sockaddr cliaddr) { + + #ifdef WIN32 u_long nOne = 1; if (ioctlsocket(sockfd, FIONBIO, &nOne) == SOCKET_ERROR) { @@ -326,8 +339,11 @@ int64_t DoReq(SOCKET sockfd, socklen_t servlen, struct sockaddr cliaddr) { return -2; } + struct timeval timeout = {10, 0}; struct pkt *msg = new pkt; struct pkt *prt = new pkt; + time_t seconds_transmit; + int len = 48; msg->li_vn_mode=227; msg->stratum=0; @@ -345,29 +361,30 @@ int64_t DoReq(SOCKET sockfd, socklen_t servlen, struct sockaddr cliaddr) { msg->xmt.Ul_i.Xl_i=0; msg->xmt.Ul_f.Xl_f=0; - int len=48; int retcode = sendto(sockfd, (char *) msg, len, 0, &cliaddr, servlen); if (retcode < 0) { - printf("sendto() failed: %d", retcode); - return -3; + printf("sendto() failed: %d\n", retcode); + seconds_transmit = -3; + goto _end; } fd_set fdset; - struct timeval timeout = {10, 0}; FD_ZERO(&fdset); FD_SET(sockfd, &fdset); retcode = select(sockfd + 1, &fdset, NULL, NULL, &timeout); if (retcode <= 0) { - printf("recvfrom() error"); - return -4; + printf("recvfrom() error\n"); + seconds_transmit = -4; + goto _end; } recvfrom(sockfd, (char *) msg, len, 0, NULL, NULL); ntohl_fp(&msg->xmt, &prt->xmt); - time_t seconds_transmit; Ntp2Unix(prt->xmt.Ul_i.Xl_ui, seconds_transmit); + _end: + delete msg; delete prt; @@ -386,7 +403,7 @@ int64_t NtpGetTime(CNetAddr& ip) { ip = CNetAddr(((sockaddr_in *)&cliaddr)->sin_addr); int64_t nTime = DoReq(sockfd, servlen, cliaddr); - closesocket(sockfd); + CloseSocket(sockfd); return nTime; } @@ -403,7 +420,7 @@ int64_t NtpGetTime(const std::string &strHostName) int64_t nTime = DoReq(sockfd, servlen, cliaddr); - closesocket(sockfd); + CloseSocket(sockfd); return nTime; } @@ -420,13 +437,11 @@ int64_t GetNtpOffset() { } void ThreadNtpSamples(void* parg) { - - // Maximum offset is 2 hours. - const int64_t nMaxOffset = 7200; + const int64_t nMaxOffset = nOneDay; // Not a real limit, just sanity threshold. printf("Trying to find NTP server at localhost...\n"); - const std::string strLocalHost = "127.0.0.1"; + std::string strLocalHost = "127.0.0.1"; if (NtpGetTime(strLocalHost) == GetTime()) { printf("There is NTP server active at localhost, we don't need NTP thread.\n"); @@ -443,7 +458,7 @@ void ThreadNtpSamples(void* parg) { CMedianFilter vTimeOffsets(200,0); while (!fShutdown) { - if (strTrustedUpstream != strLocalHost) { + if (strTrustedUpstream != "localhost") { // Trying to get new offset sample from trusted NTP server. int64_t nClockOffset = NtpGetTime(strTrustedUpstream) - GetTime(); @@ -455,7 +470,7 @@ void ThreadNtpSamples(void* parg) { else { // Something went wrong, disable trusted offset sampling. nNtpOffset = INT64_MAX; - strTrustedUpstream = strLocalHost; + strTrustedUpstream = "localhost"; int nSleepMinutes = 1 + GetRandInt(9); // Sleep for 1-10 minutes. for (int i = 0; i < nSleepMinutes * 60 && !fShutdown; i++) @@ -478,11 +493,11 @@ void ThreadNtpSamples(void* parg) { } } - if (vTimeOffsets.size() > 2) { + if (vTimeOffsets.size() > 1) { nNtpOffset = vTimeOffsets.median(); } else { - // Not enough offsets yet, try again later. + // Not enough offsets yet, try to collect additional samples later. nNtpOffset = INT64_MAX; int nSleepMinutes = 1 + GetRandInt(4); // Sleep for 1-5 minutes. for (int i = 0; i < nSleepMinutes * 60 && !fShutdown; i++) @@ -491,6 +506,15 @@ void ThreadNtpSamples(void* parg) { } } + if (GetNodesOffset() == INT_MAX && abs64(nNtpOffset) > 40 * 60) + { + // If there is not enough node offsets data and NTP time offset is greater than 40 minutes then give a warning. + std::string strMessage = _("Warning: Please check that your computer's date and time are correct! If your clock is wrong NovaCoin will not work properly."); + strMiscWarning = strMessage; + printf("*** %s\n", strMessage.c_str()); + uiInterface.ThreadSafeMessageBox(strMessage+" ", std::string("NovaCoin"), CClientUIInterface::OK | CClientUIInterface::ICON_EXCLAMATION); + } + printf("nNtpOffset = %+" PRId64 " (%+" PRId64 " minutes)\n", nNtpOffset, nNtpOffset/60); int nSleepHours = 1 + GetRandInt(5); // Sleep for 1-6 hours.