diff --git a/configure.ac b/configure.ac index e83f7fe7..ad818034 100644 --- a/configure.ac +++ b/configure.ac @@ -358,7 +358,13 @@ fi AC_SUBST(LIBUSB_LIBS) AC_SUBST(LIBUSB_CFLAGS) -PKG_CHECK_MODULES([LIBCURL], [libcurl >= 7.18.2], ,[AC_MSG_ERROR([Missing required libcurl dev >= 7.18.2])]) +if test "x$have_win32" != xtrue; then + PKG_CHECK_MODULES([LIBCURL], [libcurl >= 7.25.0], [AC_DEFINE([CURL_HAS_KEEPALIVE], [1], [Defined if version of curl supports keepalive.])], + [PKG_CHECK_MODULES([LIBCURL], [libcurl >= 7.18.2], ,[AC_MSG_ERROR([Missing required libcurl dev >= 7.18.2])])]) +else + PKG_CHECK_MODULES([LIBCURL], [libcurl >= 7.25.0], ,[AC_MSG_ERROR([Missing required libcurl dev >= 7.25.0])]) + AC_DEFINE([CURL_HAS_KEEPALIVE], [1]) +fi AC_SUBST(LIBCURL_LIBS) dnl CCAN wants to know a lot of vars. diff --git a/util.c b/util.c index afc1685a..33e83c67 100644 --- a/util.c +++ b/util.c @@ -29,7 +29,6 @@ # include #else # include -# include # include #endif @@ -196,16 +195,30 @@ out: return ptrlen; } -static int keep_sockalive(SOCKETTYPE fd) +#if CURL_HAS_KEEPALIVE +static void keep_curlalive(CURL *curl) { const int tcp_keepidle = 60; const int tcp_keepintvl = 60; - const int keepalive = 1; - int ret = 0; + const long int keepalive = 1; + curl_easy_setopt(curl, CURLOPT_TCP_KEEPALIVE, keepalive); + curl_easy_setopt(curl, CURLOPT_TCP_KEEPIDLE, tcp_keepidle); + curl_easy_setopt(curl, CURLOPT_TCP_KEEPINTVL, tcp_keepintvl); +} -#ifndef WIN32 +static void keep_alive(CURL *curl, __maybe_unused SOCKETTYPE fd) +{ + keep_curlalive(curl); +} +#else +static int keep_sockalive(SOCKETTYPE fd) +{ + const int tcp_keepidle = 60; + const int tcp_keepintvl = 60; + const int keepalive = 1; const int tcp_keepcnt = 5; + int ret = 0; if (unlikely(setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &keepalive, sizeof(keepalive)))) ret = 1; @@ -228,37 +241,22 @@ static int keep_sockalive(SOCKETTYPE fd) # endif /* __APPLE_CC__ */ -#else /* WIN32 */ - - const int zero = 0; - struct tcp_keepalive vals; - vals.onoff = 1; - vals.keepalivetime = tcp_keepidle * 1000; - vals.keepaliveinterval = tcp_keepintvl * 1000; - - DWORD outputBytes; - - if (unlikely(setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, (const char *)&keepalive, sizeof(keepalive)))) - ret = 1; - - if (unlikely(WSAIoctl(fd, SIO_KEEPALIVE_VALS, &vals, sizeof(vals), NULL, 0, &outputBytes, NULL, NULL))) - ret = 1; + return ret; +} - /* Windows happily submits indefinitely to the send buffer blissfully - * unaware nothing is getting there without gracefully failing unless - * we disable the send buffer */ - if (unlikely(setsockopt(fd, SOL_SOCKET, SO_SNDBUF, (const char *)&zero, sizeof(zero)))) - ret = 1; -#endif /* WIN32 */ +static void keep_curlalive(CURL *curl) +{ + SOCKETTYPE sock; - return ret; + curl_easy_getinfo(curl, CURLINFO_LASTSOCKET, (long *)&sock); + keep_sockalive(sock); } -int json_rpc_call_sockopt_cb(void __maybe_unused *userdata, curl_socket_t fd, - curlsocktype __maybe_unused purpose) +static void keep_alive(CURL __maybe_unused *curl, SOCKETTYPE fd) { - return keep_sockalive(fd); + keep_sockalive(fd); } +#endif static void last_nettime(struct timeval *last) { @@ -334,7 +332,7 @@ json_t *json_rpc_call(CURL *curl, const char *url, curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); } if (longpoll) - curl_easy_setopt(curl, CURLOPT_SOCKOPTFUNCTION, json_rpc_call_sockopt_cb); + keep_curlalive(curl); curl_easy_setopt(curl, CURLOPT_POST, 1); if (opt_protocol) @@ -1362,7 +1360,7 @@ bool initiate_stratum(struct pool *pool) goto out; } curl_easy_getinfo(curl, CURLINFO_LASTSOCKET, (long *)&pool->sock); - keep_sockalive(pool->sock); + keep_alive(curl, pool->sock); sprintf(s, "{\"id\": %d, \"method\": \"mining.subscribe\", \"params\": []}", swork_id++); diff --git a/windows-build.txt b/windows-build.txt index 7fcd0afd..9de42803 100644 --- a/windows-build.txt +++ b/windows-build.txt @@ -43,29 +43,6 @@ Make sure to check the option for "Download latest repository catalogs". I just selected all the check boxes (excluding "Fortran Compiler") so that everything was installed. -************************************************************************************** -* Create mstcpip.h * -************************************************************************************** -Open notepad and copy the following into it. Save it as "\MinGW\include\mstcpip.h". -Make sure it does not have the ".txt" extension (If it does then rename it). - -struct tcp_keepalive -{ - u_long onoff; - u_long keepalivetime; - u_long keepaliveinterval; -}; - -#ifndef USE_WS_PREFIX - -#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR, 4) - -#else - -#define WS_SIO_KEEPALIVE_VALS _WSAIOW(WS_IOC_VENDOR, 4) - -#endif - ************************************************************************************** * Run the MSYS shell for the first time to create your user directory * **************************************************************************************