uint8_t mac[5 * sizeof(uint32_t)]; /* mac */
};
-int nServersCount = 118;
+const int nServersCount = 147;
-std::string NtpServers[118] = {
+std::string NtpServers[147] = {
// Microsoft
"time.windows.com",
"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",
// 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",
"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",
"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++;
+ // 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",
- int nServerNum = GetRandInt(nServersCount);
-
- std::vector<CNetAddr> vIP;
- bool fRet = LookupHost(NtpServers[nServerNum].c_str(), vIP, 10, true);
- if (!fRet)
- continue;
+ // Slovenia
+ "time.ijs.si",
- struct sockaddr_in servaddr;
- servaddr.sin_family = AF_INET;
- servaddr.sin_port = htons(123);
+ // ???
+ "clepsydra.dec.com",
- bool found = false;
- for(unsigned int i = 0; i < vIP.size(); i++) {
- if ((found = vIP[i].GetInAddr(&servaddr.sin_addr))) {
- break;
- }
- }
-
- if (!found)
- continue;
-
- 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
- }
-
- *pcliaddr = *((struct sockaddr *) &servaddr);
- servlen = sizeof(servaddr);
- return true;
- }
-
- return false;
-}
+ // ... To be continued
+};
bool InitWithHost(std::string &strHostName, SOCKET &sockfd, socklen_t &servlen, struct sockaddr *pcliaddr) {
sockfd = -1;
return true;
}
+bool InitWithRandom(SOCKET &sockfd, socklen_t &servlen, struct sockaddr *pcliaddr) {
+
+ 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
return (seconds_receive + seconds_transmit) / 2;
}
-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;