From a8495f4c93e8664c8d7fad3e69f077afb655f8d6 Mon Sep 17 00:00:00 2001 From: CryptoManiac Date: Sat, 19 Sep 2015 23:29:35 +0300 Subject: [PATCH] NTP: use select & recvfrom for async socket handling. --- src/ntp.cpp | 23 +++++++++++------------ src/rpcnet.cpp | 8 ++++++-- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/ntp.cpp b/src/ntp.cpp index 720cfb1..7ec195c 100644 --- a/src/ntp.cpp +++ b/src/ntp.cpp @@ -299,21 +299,20 @@ int64_t DoReq(SOCKET sockfd, socklen_t servlen, struct sockaddr cliaddr) return -3; } - retcode = 0; - int nWait = 0; + fd_set fdset; + struct timeval timeout = {5, 0}; + FD_ZERO(&fdset); + FD_SET(sockfd, &fdset); - while(retcode <= 0) { - Sleep(1000); - retcode = recvfrom(sockfd, (char *) msg, len, 0, NULL, NULL); - - 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); diff --git a/src/rpcnet.cpp b/src/rpcnet.cpp index 3386cd8..c746674 100644 --- a/src/rpcnet.cpp +++ b/src/rpcnet.cpp @@ -404,8 +404,12 @@ Value ntptime(const Array& params, bool fHelp) case -4: throw runtime_error("Receive timed out"); default: - obj.push_back(Pair("epoch", nTime)); - obj.push_back(Pair("time", DateTimeStrFormat(nTime))); + if (nTime > 0 && nTime != 2085978496) + { + obj.push_back(Pair("epoch", nTime)); + obj.push_back(Pair("time", DateTimeStrFormat(nTime))); + } + else throw runtime_error("Unexpected response"); } return obj; -- 1.7.1