]> git.saurik.com Git - wxWidgets.git/commitdiff
added SetInitialSocketBuffers() to allow changing the send/receive buffer sizes ...
authorVadim Zeitlin <vadim@wxwidgets.org>
Sat, 17 Nov 2007 15:21:26 +0000 (15:21 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sat, 17 Nov 2007 15:21:26 +0000 (15:21 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@50028 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/msw/gsockmsw.h
include/wx/socket.h
include/wx/unix/gsockunx.h
src/common/socket.cpp
src/msw/gsocket.cpp
src/unix/gsocket.cpp

index a32589d602dae7c943de2f46149f048b91df9326..f7970f6ffdaaf3770c4ab5226dc94e10456b4d61 100644 (file)
@@ -80,6 +80,13 @@ public:
     void *optval, int *optlen);
   GSocketError SetSockOpt(int level, int optname,
     const void *optval, int optlen);
+
+  void SetInitialSocketBuffers(int recv, int send)
+  {
+      m_initialRecvBufferSize = recv;
+      m_initialSendBufferSize = send;
+  }
+
 protected:
   GSocketError Input_Timeout();
   GSocketError Output_Timeout();
@@ -89,6 +96,8 @@ protected:
   int Send_Stream(const char *buffer, int size);
   int Send_Dgram(const char *buffer, int size);
   bool m_ok;
+  int m_initialRecvBufferSize;
+  int m_initialSendBufferSize;
 
 /* TODO: Make these protected */
 public:
index ea55c060db17bd5eca22d995fe724a03cf5c64c0..5e9e687b3ec3d88c75d96c12ffb5dec7c0fed236 100644 (file)
@@ -263,8 +263,21 @@ public:
 
   bool WaitOnConnect(long seconds = -1, long milliseconds = 0);
 
+  // Sets initial socket buffer sizes using the SO_SNDBUF and SO_RCVBUF options
+  // before calling connect (either one can be -1 to leave it unchanged)
+  void SetInitialSocketBuffers(int recv, int send)
+  {
+      m_initialRecvBufferSize = recv;
+      m_initialSendBufferSize = send;
+  }
+
 private:
-  virtual bool DoConnect(wxSockAddress& addr, wxSockAddress* local, bool wait = true);
+  virtual bool
+      DoConnect(wxSockAddress& addr, wxSockAddress* local, bool wait = true);
+
+  // buffer sizes, -1 if unset and defaults should be used
+  int m_initialRecvBufferSize;
+  int m_initialSendBufferSize;
 
   DECLARE_NO_COPY_CLASS(wxSocketClient)
 };
index a01f6013d2b4e2235ecdde7e19881a8ba06fe0e4..c1a42f2b8ccf4474f0746f929a0b2f24f15b57a5 100644 (file)
@@ -72,6 +72,12 @@ public:
         const void *optval, int optlen);
     virtual void Detected_Read();
     virtual void Detected_Write();
+    void SetInitialSocketBuffers(int recv, int send)
+    {
+        m_initialRecvBufferSize = recv;
+        m_initialSendBufferSize = send;
+    }
+
 protected:
     void Enable(GSocketEvent event);
     void Disable(GSocketEvent event);
@@ -82,6 +88,8 @@ protected:
     int Send_Stream(const char *buffer, int size);
     int Send_Dgram(const char *buffer, int size);
     bool m_ok;
+    int m_initialRecvBufferSize;
+    int m_initialSendBufferSize;
 public:
     /* DFE: We can't protect these data member until the GUI code is updated */
     /* protected: */
index e90a3b7cb57f95bdd4f687691dc49200e70d1128..203d79a063ee15f2f94fd29dfa31f47b820d7c9b 100644 (file)
@@ -1303,6 +1303,10 @@ bool wxSocketClient::DoConnect(wxSockAddress& addr_man, wxSockAddress* local, bo
       m_socket->SetLocal(la);
   }
 
+#if defined(__WXMSW__) || defined(__WXGTK__)
+  m_socket->SetInitialSocketBuffers(m_initialRecvBufferSize, m_initialSendBufferSize);
+#endif
+
   m_socket->SetPeer(addr_man.GetAddress());
   err = m_socket->Connect(GSOCK_STREAMED);
 
index 63da4996692828eb30a996b0f1cdbdfdba2f9936..393d15c29c4dd579d03917dc96d75ce6afa48e63 100644 (file)
@@ -179,7 +179,9 @@ GSocket::GSocket()
   m_reusable        = false;
   m_broadcast          = false;
   m_dobind          = true;
-
+  m_initialRecvBufferSize = -1;
+  m_initialSendBufferSize = -1;
+   
   assert(gs_gui_functions);
   /* Per-socket GUI-specific initialization */
   m_ok = gs_gui_functions->Init_Socket(this);
@@ -630,6 +632,11 @@ GSocketError GSocket::Connect(GSocketStream stream)
      setsockopt(m_fd, SOL_SOCKET, SO_REUSEADDR, (const char*)&arg, sizeof(arg));
   }
 
+  if (m_initialRecvBufferSize >= 0)
+    setsockopt(m_fd, SOL_SOCKET, SO_RCVBUF, (const char*)&m_initialRecvBufferSize, sizeof(m_initialRecvBufferSize));
+  if (m_initialSendBufferSize >= 0)
+    setsockopt(m_fd, SOL_SOCKET, SO_SNDBUF, (const char*)&m_initialSendBufferSize, sizeof(m_initialSendBufferSize));
+
   // If a local address has been set, then we need to bind to it before calling connect
   if (m_local && m_local->m_addr)
   {
index bd71d70be5840198d6cbb2250bd7eb52bb4fced1..0fbdcb3e3571dcf848546734e00867ba21f39127 100644 (file)
@@ -541,6 +541,8 @@ GSocket::GSocket()
   m_timeout             = 10*60*1000;
                                 /* 10 minutes * 60 sec * 1000 millisec */
   m_establishing        = false;
+  m_initialRecvBufferSize = -1;
+  m_initialSendBufferSize = -1;
 
   assert(gs_gui_functions);
   /* Per-socket GUI-specific initialization */
@@ -1019,6 +1021,11 @@ GSocketError GSocket::Connect(GSocketStream stream)
 #endif
   }
 
+  if (m_initialRecvBufferSize >= 0)
+    setsockopt(m_fd, SOL_SOCKET, SO_RCVBUF, (const char*)&m_initialRecvBufferSize, sizeof(m_initialRecvBufferSize));
+  if (m_initialSendBufferSize >= 0)
+    setsockopt(m_fd, SOL_SOCKET, SO_SNDBUF, (const char*)&m_initialSendBufferSize, sizeof(m_initialSendBufferSize));
+
   // If a local address has been set, then we need to bind to it before calling connect
   if (m_local && m_local->m_addr)
   {