X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3c57bda5451d31315de797a285b9547693143316..5b0c31c300bc5cab3346afd38fb444a1c52a53ac:/src/common/socket.cpp diff --git a/src/common/socket.cpp b/src/common/socket.cpp index 65fb93a2b3..e90a3b7cb5 100644 --- a/src/common/socket.cpp +++ b/src/common/socket.cpp @@ -17,25 +17,29 @@ #include "wx/wxprec.h" #ifdef __BORLANDC__ -#pragma hdrstop + #pragma hdrstop #endif #if wxUSE_SOCKETS -#include "wx/app.h" +#include "wx/socket.h" + +#ifndef WX_PRECOMP + #include "wx/object.h" + #include "wx/string.h" + #include "wx/intl.h" + #include "wx/log.h" + #include "wx/event.h" + #include "wx/app.h" + #include "wx/utils.h" + #include "wx/timer.h" + #include "wx/module.h" +#endif + #include "wx/apptrait.h" -#include "wx/object.h" -#include "wx/string.h" -#include "wx/timer.h" -#include "wx/utils.h" -#include "wx/module.h" -#include "wx/log.h" -#include "wx/intl.h" -#include "wx/event.h" #include "wx/sckaddr.h" -#include "wx/socket.h" -#include "wx/datetime.h" +#include "wx/stopwatch.h" // DLL options compatibility check: #include "wx/build.h" @@ -326,11 +330,9 @@ wxUint32 wxSocketBase::_Read(void* buffer, wxUint32 nbytes) // Return now in one of the following cases: // - the socket is invalid, - // - we got all the data, - // - we got *some* data and we are not using wxSOCKET_WAITALL. + // - we got all the data if ( !m_socket || - !nbytes || - ((total != 0) && !(m_flags & wxSOCKET_WAITALL)) ) + !nbytes ) return total; // Possible combinations (they are checked in this order) @@ -678,7 +680,7 @@ bool wxSocketBase::_Wait(long seconds, wxSocketEventFlags flags) { GSocketEventFlags result; - long timeout; + long timeout; // in ms // Set this to true to interrupt ongoing waits m_interrupt = false; @@ -705,12 +707,11 @@ bool wxSocketBase::_Wait(long seconds, // Do this at least once (important if timeout == 0, when // we are just polling). Also, if just polling, do not yield. - wxDateTime current_time = wxDateTime::UNow(); - unsigned int time_limit = (current_time.GetTicks() * 1000) + current_time.GetMillisecond() + timeout; + const wxMilliClock_t time_limit = wxGetLocalTimeMillis() + timeout; bool done = false; bool valid_result = false; - if (!has_event_loop) + if (!has_event_loop) { // This is used to avoid a busy loop on wxBase - having a select // timeout of 50 ms per iteration should be enough. @@ -750,17 +751,16 @@ bool wxSocketBase::_Wait(long seconds, } // Wait more? - current_time = wxDateTime::UNow(); - int time_left = time_limit - ((current_time.GetTicks() * 1000) + current_time.GetMillisecond()); + long time_left = wxMilliClockToLong(time_limit - wxGetLocalTimeMillis()); if ((!timeout) || (time_left <= 0) || (m_interrupt)) done = true; else { - if (has_event_loop) + if (has_event_loop) { PROCESS_EVENTS(); } - else + else { // If there's less than 50 ms left, just call select with that timeout. if (time_left < 50) @@ -1103,6 +1103,12 @@ wxSocketServer::wxSocketServer(const wxSockAddress& addr_man, if (GetFlags() & wxSOCKET_REUSEADDR) { m_socket->SetReusable(); } + if (GetFlags() & wxSOCKET_BROADCAST) { + m_socket->SetBroadcast(); + } + if (GetFlags() & wxSOCKET_NOBIND) { + m_socket->DontDoBind(); + } if (m_socket->SetServer() != GSOCK_NOERROR) { @@ -1193,7 +1199,7 @@ bool wxSocketBase::SetOption(int level, int optname, const void *optval, int optlen) { wxASSERT_MSG( m_socket, _T("Socket not initialised") ); - + if (m_socket->SetSockOpt(level, optname, optval, optlen) != GSOCK_NOERROR) { @@ -1273,6 +1279,14 @@ bool wxSocketClient::DoConnect(wxSockAddress& addr_man, wxSockAddress* local, bo { m_socket->SetReusable(); } + if (GetFlags() & wxSOCKET_BROADCAST) + { + m_socket->SetBroadcast(); + } + if (GetFlags() & wxSOCKET_NOBIND) + { + m_socket->DontDoBind(); + } // If no local address was passed and one has been set, use the one that was Set if (!local && m_localAddress.GetAddress()) @@ -1342,14 +1356,26 @@ wxDatagramSocket::wxDatagramSocket( const wxSockAddress& addr, // Create the socket m_socket = GSocket_new(); - if(!m_socket) + if (!m_socket) { wxFAIL_MSG( _T("datagram socket not new'd") ); return; } // Setup the socket as non connection oriented m_socket->SetLocal(addr.GetAddress()); - if( m_socket->SetNonOriented() != GSOCK_NOERROR ) + if (flags & wxSOCKET_REUSEADDR) + { + m_socket->SetReusable(); + } + if (GetFlags() & wxSOCKET_BROADCAST) + { + m_socket->SetBroadcast(); + } + if (GetFlags() & wxSOCKET_NOBIND) + { + m_socket->DontDoBind(); + } + if ( m_socket->SetNonOriented() != GSOCK_NOERROR ) { delete m_socket; m_socket = NULL; @@ -1379,7 +1405,7 @@ wxDatagramSocket& wxDatagramSocket::SendTo( const wxSockAddress& addr, wxUint32 nBytes ) { wxASSERT_MSG( m_socket, _T("Socket not initialised") ); - + m_socket->SetPeer(addr.GetAddress()); Write(buf, nBytes); return (*this);