aboutsummaryrefslogtreecommitdiff
path: root/lib/connect.c
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2013-04-02 11:22:41 +0200
committerDaniel Stenberg <daniel@haxx.se>2013-04-02 11:31:05 +0200
commit43e045fc3e8430b2d2f3a1fc1354f3ecd54b09ab (patch)
treedac1f7c682423cdc1be5ad9f2a3e4201c874dc73 /lib/connect.c
parent74467f8e7837f8a58ce08725efc391b189f37466 (diff)
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
Diffstat (limited to 'lib/connect.c')
-rw-r--r--lib/connect.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/lib/connect.c b/lib/connect.c
index b277d912e..e2350482c 100644
--- a/lib/connect.c
+++ b/lib/connect.c
@@ -852,13 +852,35 @@ static void nosigpipe(struct connectdata *conn,
Work-around: Make the Socket Send Buffer Size Larger Than the Program Send
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)
{
int val = CURL_MAX_WRITE_SIZE + 32;
int curval = 0;
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(curval > val)
return;