Add SetLocal method; overload Connect to accept a local address and move common Connect code into DoConnect; DoConnect handles wxSOCKET_REUSEADDR flag and setting local address [ Heavily modified and expanded patch 1415505 ]

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@37506 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Kevin Hock
2006-02-11 23:39:25 +00:00
parent 080b9cbc7f
commit 33d925b0d9
2 changed files with 46 additions and 2 deletions

View 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