]> git.saurik.com Git - wxWidgets.git/commitdiff
Add SetLocal method; overload Connect to accept a local address and move common Conne...
authorKevin Hock <hockkn@yahoo.com>
Sat, 11 Feb 2006 23:39:25 +0000 (23:39 +0000)
committerKevin Hock <hockkn@yahoo.com>
Sat, 11 Feb 2006 23:39:25 +0000 (23:39 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@37506 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/socket.h
src/common/socket.cpp

index ac1c7d36403f830c8b613c35b9d1bfa376d78dd8..266a24321da99350f6aacb698b125c164c5ed934 100644 (file)
@@ -121,6 +121,7 @@ public:
   // addresses
   virtual bool GetLocal(wxSockAddress& addr_man) const;
   virtual bool GetPeer(wxSockAddress& addr_man) const;
+  virtual bool SetLocal(wxSockAddress& local);
 
   // base IO
   virtual bool  Close();
@@ -217,7 +218,7 @@ private:
   // the initialization count, GSocket is initialized if > 0
   static size_t m_countInit;
 
-    DECLARE_NO_COPY_CLASS(wxSocketBase)
+  DECLARE_NO_COPY_CLASS(wxSocketBase)
 };
 
 
@@ -254,9 +255,13 @@ public:
   virtual ~wxSocketClient();
 
   virtual bool Connect(wxSockAddress& addr, bool wait = true);
+  virtual bool Connect(wxSockAddress& addr, wxSockAddress& local, bool wait = true);
 
   bool WaitOnConnect(long seconds = -1, long milliseconds = 0);
 
+private:
+  virtual bool DoConnect(wxSockAddress& addr, wxSockAddress* local, bool wait = true);
+
   DECLARE_NO_COPY_CLASS(wxSocketClient)
 };
 
index ee1365dbaa585a5bc55189598fe122c13b049ac6..a5b9eff86a8b12630f04bb16152cc682047bebdc 100644 (file)
@@ -1198,6 +1198,20 @@ bool wxSocketBase::SetOption(int level, int optname, const void *optval,
     return true;
 }
 
+bool wxSocketBase::SetLocal(wxSockAddress& local)
+{
+  GAddress* la = local.GetAddress();
+
+  if (la && la->m_addr)
+  {
+    m_socket->SetLocal(la);
+
+    return true;
+  }
+
+  return false;
+}
+
 // ==========================================================================
 // wxSocketClient
 // ==========================================================================
@@ -1219,7 +1233,7 @@ wxSocketClient::~wxSocketClient()
 // Connect
 // --------------------------------------------------------------------------
 
-bool wxSocketClient::Connect(wxSockAddress& addr_man, bool wait)
+bool wxSocketClient::DoConnect(wxSockAddress& addr_man, wxSockAddress* local, bool wait)
 {
   GSocketError err;
 
@@ -1249,6 +1263,21 @@ bool wxSocketClient::Connect(wxSockAddress& addr_man, bool wait)
   if (!wait)
     m_socket->SetNonBlocking(1);
 
+  // Reuse makes sense for clients too, if we are trying to rebind to the same port
+  if (GetFlags() & wxSOCKET_REUSEADDR)
+  {
+    m_socket->SetReusable();
+  }
+
+  // Bind to the local IP address and port, when provided
+  if (local)
+  {
+    GAddress* la = local->GetAddress();
+
+    if (la && la->m_addr)
+      m_socket->SetLocal(la);
+  }
+
   m_socket->SetPeer(addr_man.GetAddress());
   err = m_socket->Connect(GSOCK_STREAMED);
 
@@ -1267,6 +1296,16 @@ bool wxSocketClient::Connect(wxSockAddress& addr_man, bool wait)
   return true;
 }
 
+bool wxSocketClient::Connect(wxSockAddress& addr_man, bool wait)
+{
+  return (DoConnect(addr_man, NULL, wait));
+}
+
+bool wxSocketClient::Connect(wxSockAddress& addr_man, wxSockAddress& local, bool wait)
+{
+  return (DoConnect(addr_man, &local, wait));
+}
+
 bool wxSocketClient::WaitOnConnect(long seconds, long milliseconds)
 {
   if (m_connected)                      // Already connected