-#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>
#endif
#include "netbase.h"
+#include "util.h"
extern int GetRandInt(int nMax);
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",
"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",
"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",
"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
};
return false; // "connection" error
}
+
*pcliaddr = *((struct sockaddr *) &servaddr);
servlen = sizeof(servaddr);
int64_t DoReq(SOCKET sockfd, socklen_t servlen, struct sockaddr cliaddr)
{
+
+#ifdef WIN32
+ u_long nOne = 1;
+ 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)
+ {
+ printf("ConnectSocket() : fcntl non-blocking setting failed, error %d\n", errno);
+#endif
+ return -2;
+ }
+
struct pkt *msg = new pkt;
struct pkt *prt = new pkt;
msg->xmt.Ul_f.Xl_f=0;
int len=48;
- sendto(sockfd, (char *) msg, len, 0, &cliaddr, servlen);
- int n = recvfrom(sockfd, (char *) msg, len, 0, NULL, NULL);
+ int retcode = sendto(sockfd, (char *) msg, len, 0, &cliaddr, servlen);
+ if (retcode < 0) {
+ printf("sendto() failed: %d", retcode);
+ return -3;
+ }
+
+ fd_set fdset;
+ struct timeval timeout = {5, 0};
+ FD_ZERO(&fdset);
+ FD_SET(sockfd, &fdset);
+
+ 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);