NTP: use select & recvfrom for async socket handling.
authorCryptoManiac <balthazar@yandex.ru>
Sat, 19 Sep 2015 20:29:35 +0000 (23:29 +0300)
committerCryptoManiac <balthazar@yandex.ru>
Sat, 19 Sep 2015 20:29:35 +0000 (23:29 +0300)
src/ntp.cpp
src/rpcnet.cpp

index 720cfb1..7ec195c 100644 (file)
@@ -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);
 
index 3386cd8..c746674 100644 (file)
@@ -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;