1
0
mirror of https://github.com/moparisthebest/curl synced 2024-12-22 08:08:50 -05:00

SO_SNDBUF: don't set SNDBUF for win32 versions vista or later

The Microsoft knowledge-base article
http://support.microsoft.com/kb/823764 describes how to use SNDBUF to
overcome a performance shortcoming in winsock, but it doesn't apply to
Windows Vista and later versions. If the described SNDBUF magic is
applied when running on those more recent Windows versions, it seems to
instead have the reversed effect in many cases and thus make libcurl
perform less good on those systems.

This fix thus adds a run-time version-check that does the SNDBUF magic
conditionally depending if it is deemed necessary or not.

Bug: http://curl.haxx.se/bug/view.cgi?id=1188
Reported by: Andrew Kurushin
Tested by: Christian Hägele
This commit is contained in:
Daniel Stenberg 2013-04-02 11:22:41 +02:00
parent 74467f8e78
commit 43e045fc3e

View File

@ -852,13 +852,35 @@ static void nosigpipe(struct connectdata *conn,
Work-around: Make the Socket Send Buffer Size Larger Than the Program Send Work-around: Make the Socket Send Buffer Size Larger Than the Program Send
Buffer Size Buffer Size
The problem described in this knowledge-base is applied only to pre-Vista
Windows. Following function trying to detect OS version and skips
SO_SNDBUF adjustment for Windows Vista and above.
*/ */
#define DETECT_OS_NONE 0
#define DETECT_OS_PREVISTA 1
#define DETECT_OS_VISTA_OR_LATER 2
void Curl_sndbufset(curl_socket_t sockfd) void Curl_sndbufset(curl_socket_t sockfd)
{ {
int val = CURL_MAX_WRITE_SIZE + 32; int val = CURL_MAX_WRITE_SIZE + 32;
int curval = 0; int curval = 0;
int curlen = sizeof(curval); int curlen = sizeof(curval);
OSVERSIONINFO osver;
static int detectOsState = DETECT_OS_NONE;
if(detectOsState == DETECT_OS_NONE) {
memset(&osver, 0, sizeof(osver));
osver.dwOSVersionInfoSize = sizeof(osver);
detectOsState = DETECT_OS_PREVISTA;
if(GetVersionEx(&osver)) {
if(osver.dwMajorVersion >= 6)
detectOsState = DETECT_OS_VISTA_OR_LATER;
}
}
if(detectOsState == DETECT_OS_VISTA_OR_LATER)
return;
if(getsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, (char *)&curval, &curlen) == 0) if(getsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, (char *)&curval, &curlen) == 0)
if(curval > val) if(curval > val)
return; return;