1
0
Эх сурвалжийг харах

Dynamically increase TCP send buffer on fast connections.

Source commit: 083f53ecc08259d4a013cfe78c6a41f9968243de
Martin Prikryl 9 жил өмнө
parent
commit
24bf353294

+ 20 - 0
source/core/SecureShell.cpp

@@ -15,6 +15,7 @@
 #ifndef AUTO_WINSOCK
 #include <winsock2.h>
 #endif
+#include <ws2ipdef.h>
 //---------------------------------------------------------------------------
 #pragma package(smart_init)
 //---------------------------------------------------------------------------
@@ -362,6 +363,7 @@ void __fastcall TSecureShell::Open()
 
   FAuthenticating = false;
   FAuthenticated = false;
+  FLastSendBufferUpdate = 0;
 
   // do not use UTF-8 until decided otherwise (see TSCPFileSystem::DetectUtf())
   FUtfStrings = false;
@@ -378,6 +380,7 @@ void __fastcall TSecureShell::Open()
     FreeBackend(); // in case we are reconnecting
     const char * InitError;
     Conf * conf = StoreToConfig(FSessionData, Simple);
+    FSendBuf = FSessionData->SendBuf;
     try
     {
       InitError = FBackend->init(this, &FBackendHandle, conf,
@@ -1943,6 +1946,23 @@ bool __fastcall TSecureShell::EventSelectLoop(unsigned int MSec, bool ReadEventR
         MSec -= Ticks;
       }
     }
+
+    if ((FSendBuf > 0) && (TicksAfter - FLastSendBufferUpdate >= 1000))
+    {
+      DWORD BufferLen = 0;
+      DWORD OutLen = 0;
+      if (WSAIoctl(FSocket, SIO_IDEAL_SEND_BACKLOG_QUERY, NULL, 0, &BufferLen, sizeof(BufferLen), &OutLen, 0, 0) == 0)
+      {
+        DebugAssert(OutLen == sizeof(BufferLen));
+        if (FSendBuf < BufferLen)
+        {
+          LogEvent(FORMAT(L"Increasing send buffer from %d to %d", (FSendBuf, static_cast<int>(BufferLen))));
+          FSendBuf = BufferLen;
+          setsockopt(FSocket, SOL_SOCKET, SO_SNDBUF, reinterpret_cast<const char *>(&BufferLen), sizeof(BufferLen));
+        }
+      }
+      FLastSendBufferUpdate = TicksAfter;
+    }
   }
   while (ReadEventRequired && (MSec > 0) && !Result);
 

+ 2 - 0
source/core/SecureShell.h

@@ -67,6 +67,8 @@ private:
   UnicodeString FLastTunnelError;
   UnicodeString FUserName;
   bool FUtfStrings;
+  DWORD FLastSendBufferUpdate;
+  int FSendBuf;
 
   static TCipher __fastcall FuncToSsh1Cipher(const void * Cipher);
   static TCipher __fastcall FuncToSsh2Cipher(const void * Cipher);

+ 33 - 12
source/filezilla/TransferSocket.cpp

@@ -37,6 +37,7 @@ CTransferSocket::CTransferSocket(CFtpControlSocket *pOwner, int nMode)
   m_transferdata.transferleft = 0;
   m_nNotifyWaiting = 0;
   m_bActivationPending = false;
+  m_LastSendBufferUpdate = 0;
 
   UpdateStatusBar(true);
 
@@ -304,20 +305,19 @@ void CTransferSocket::SetBuffers()
   /* Set internal socket send buffer
    * this should fix the speed problems some users have reported
    */
-  DWORD value = 0;
-  int len = sizeof(value);
-  GetSockOpt(SO_SNDBUF, &value, &len);
-  int sndbuf = GetOptionVal(OPTION_MPEXT_SNDBUF);
-  if (value < sndbuf)
+  m_SendBuf = GetOptionVal(OPTION_MPEXT_SNDBUF);
+  if (m_SendBuf > 0)
   {
-    value = sndbuf;
-    SetSockOpt(SO_SNDBUF, &value, sizeof(value));
-  }
+    DWORD value;
+    int len = sizeof(value);
+    GetSockOpt(SO_SNDBUF, &value, &len);
+    if (value < m_SendBuf)
+    {
+      SetSockOpt(SO_SNDBUF, &m_SendBuf, sizeof(m_SendBuf));
+    }
 
-  // For now we increase receive buffer, whenever send buffer is set.
-  // The size is not configurable. The constant taken from FZ.
-  if (sndbuf > 0)
-  {
+    // For now we increase receive buffer, whenever send buffer is set.
+    // The size is not configurable. The constant taken from FZ.
     value = 0;
     len = sizeof(value);
     GetSockOpt(SO_RCVBUF, &value, &len);
@@ -539,6 +539,27 @@ void CTransferSocket::OnSend(int nErrorCode)
     OnConnect(0);
   }
 
+  if (m_SendBuf > 0)
+  {
+    unsigned int Ticks = GetTickCount();
+    if (Ticks - m_LastSendBufferUpdate >= 1000)
+    {
+      DWORD BufferLen = 0;
+      DWORD OutLen = 0;
+      if (WSAIoctl(m_SocketData.hSocket, SIO_IDEAL_SEND_BACKLOG_QUERY, NULL, 0, &BufferLen, sizeof(BufferLen), &OutLen, 0, 0) == 0)
+      {
+        DebugAssert(OutLen == sizeof(BufferLen));
+        if (m_SendBuf < BufferLen)
+        {
+          LogMessage(FZ_LOG_PROGRESS, L"Increasing send buffer from %d to %d", m_SendBuf, BufferLen);
+          m_SendBuf = BufferLen;
+          SetSockOpt(SO_SNDBUF, &m_SendBuf, sizeof(m_SendBuf));
+        }
+      }
+      m_LastSendBufferUpdate = Ticks;
+    }
+  }
+
 #ifndef MPEXT_NO_ZLIB
   if (m_useZlib)
   {

+ 2 - 0
source/filezilla/TransferSocket.h

@@ -86,6 +86,8 @@ protected:
   void SetBuffers();
 
   LARGE_INTEGER m_LastUpdateTime;
+  unsigned int m_LastSendBufferUpdate;
+  DWORD m_SendBuf;
 
 #ifndef MPEXT_NO_ZLIB
   z_stream m_zlibStream;