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:
@@ -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
|
||||
|
Reference in New Issue
Block a user