Make SetLocal actually work instead of crashing immediately; due to required longevity of the item to make it from SetLocal to Connect, we need to use a specifc address type.
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@37759 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -589,7 +589,7 @@ reusing local addresses/ports.
|
|||||||
%
|
%
|
||||||
\membersection{wxSocketBase::SetLocal}\label{wxsocketbasesetlocal}
|
\membersection{wxSocketBase::SetLocal}\label{wxsocketbasesetlocal}
|
||||||
|
|
||||||
\func{bool}{SetLocal}{\param{wxSockAddress\&}{ local}}
|
\func{bool}{SetLocal}{\param{wxIPV4address\&}{ local}}
|
||||||
|
|
||||||
This function allows you to set the local address and port,
|
This function allows you to set the local address and port,
|
||||||
useful when an application needs to reuse a particular port. When
|
useful when an application needs to reuse a particular port. When
|
||||||
|
@@ -121,7 +121,7 @@ public:
|
|||||||
// addresses
|
// addresses
|
||||||
virtual bool GetLocal(wxSockAddress& addr_man) const;
|
virtual bool GetLocal(wxSockAddress& addr_man) const;
|
||||||
virtual bool GetPeer(wxSockAddress& addr_man) const;
|
virtual bool GetPeer(wxSockAddress& addr_man) const;
|
||||||
virtual bool SetLocal(wxSockAddress& local);
|
virtual bool SetLocal(wxIPV4address& local);
|
||||||
|
|
||||||
// base IO
|
// base IO
|
||||||
virtual bool Close();
|
virtual bool Close();
|
||||||
@@ -202,6 +202,7 @@ private:
|
|||||||
wxList m_states; // stack of states
|
wxList m_states; // stack of states
|
||||||
bool m_interrupt; // interrupt ongoing wait operations?
|
bool m_interrupt; // interrupt ongoing wait operations?
|
||||||
bool m_beingDeleted; // marked for delayed deletion?
|
bool m_beingDeleted; // marked for delayed deletion?
|
||||||
|
wxIPV4address m_localAddress; // bind to local address?
|
||||||
|
|
||||||
// pushback buffer
|
// pushback buffer
|
||||||
void *m_unread; // pushback buffer
|
void *m_unread; // pushback buffer
|
||||||
|
@@ -1203,13 +1203,14 @@ bool wxSocketBase::SetOption(int level, int optname, const void *optval,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wxSocketBase::SetLocal(wxSockAddress& local)
|
bool wxSocketBase::SetLocal(wxIPV4address& local)
|
||||||
{
|
{
|
||||||
GAddress* la = local.GetAddress();
|
GAddress* la = local.GetAddress();
|
||||||
|
|
||||||
|
// If the address is valid, save it for use when we call Connect
|
||||||
if (la && la->m_addr)
|
if (la && la->m_addr)
|
||||||
{
|
{
|
||||||
m_socket->SetLocal(la);
|
m_localAddress = local;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -1274,6 +1275,12 @@ bool wxSocketClient::DoConnect(wxSockAddress& addr_man, wxSockAddress* local, bo
|
|||||||
m_socket->SetReusable();
|
m_socket->SetReusable();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If no local address was passed and one has been set, use the one that was Set
|
||||||
|
if (!local && m_localAddress.GetAddress())
|
||||||
|
{
|
||||||
|
local = &m_localAddress;
|
||||||
|
}
|
||||||
|
|
||||||
// Bind to the local IP address and port, when provided
|
// Bind to the local IP address and port, when provided
|
||||||
if (local)
|
if (local)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user