X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/74b1f0b45e0f0bc7e25c5f32bb495e3e4bcd3392..b404a8f3b072129c107c6d9a5e0f6f53cd34807b:/src/common/socket.cpp diff --git a/src/common/socket.cpp b/src/common/socket.cpp index 44b408c49c..36a9dc1090 100644 --- a/src/common/socket.cpp +++ b/src/common/socket.cpp @@ -7,7 +7,7 @@ // (C) 1999-2000, Guillermo Rodriguez Garcia // (C) 2008 Vadim Zeitlin // RCS_ID: $Id$ -// License: wxWindows licence +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// // ========================================================================== @@ -980,7 +980,11 @@ wxUint32 wxSocketBase::DoRead(void* buffer_, wxUint32 nbytes) { // if we don't want to wait, just return immediately if ( m_flags & wxSOCKET_NOWAIT ) + { + // this shouldn't be counted as an error in this case + SetError(wxSOCKET_NOERROR); break; + } // otherwise wait until the socket becomes ready for reading or // an error occurs on it @@ -1109,6 +1113,9 @@ wxSocketBase& wxSocketBase::Peek(void* buffer, wxUint32 nbytes) { wxSocketReadGuard read(this); + // Peek() should never block + wxSocketWaitModeChanger changeFlags(this, wxSOCKET_NOWAIT); + m_lcount = DoRead(buffer, nbytes); Pushback(buffer, m_lcount); @@ -1290,17 +1297,31 @@ wxSocketEventFlags wxSocketImpl::Select(wxSocketEventFlags flags, exceptfds; // always want to know about errors if ( flags & wxSOCKET_INPUT_FLAG ) - { preadfds = &readfds; + + if ( flags & wxSOCKET_OUTPUT_FLAG ) + pwritefds = &writefds; + + // When using non-blocking connect() the client socket becomes connected + // (successfully or not) when it becomes writable but when using + // non-blocking accept() the server socket becomes connected when it + // becomes readable. + if ( flags & wxSOCKET_CONNECTION_FLAG ) + { + if ( m_server ) + preadfds = &readfds; + else + pwritefds = &writefds; + } + + if ( preadfds ) + { wxFD_ZERO(preadfds); wxFD_SET(m_fd, preadfds); } - // when using non-blocking connect() the socket becomes connected - // (successfully or not) when it becomes writable - if ( flags & (wxSOCKET_OUTPUT_FLAG | wxSOCKET_CONNECTION_FLAG) ) + if ( pwritefds ) { - pwritefds = &writefds; wxFD_ZERO(pwritefds); wxFD_SET(m_fd, pwritefds); } @@ -1369,10 +1390,11 @@ wxSocketBase::DoWait(long timeout, wxSocketEventFlags flags) { wxCHECK_MSG( m_impl, -1, "can't wait on invalid socket" ); - // we're never going to become ready in a client if we're not connected any - // more (OTOH a server can call this to precisely wait for a connection so - // do wait for it in this case) - if ( !m_impl->IsServer() && !m_connected && !m_establishing ) + // we're never going to become ready in a TCP client if we're not connected + // any more (OTOH a server can call this to precisely wait for a connection + // so do wait for it in this case and UDP client is never "connected") + if ( !m_impl->IsServer() && + m_impl->m_stream && !m_connected && !m_establishing ) return -1; // This can be set to true from Interrupt() to exit this function a.s.a.p. @@ -1786,8 +1808,7 @@ wxSocketServer::wxSocketServer(const wxSockAddress& addr, if (m_impl->CreateServer() != wxSOCKET_NOERROR) { - delete m_impl; - m_impl = NULL; + wxDELETE(m_impl); wxLogTrace( wxTRACE_Socket, wxT("*** CreateServer() failed") ); return; @@ -2027,8 +2048,7 @@ wxDatagramSocket::wxDatagramSocket( const wxSockAddress& addr, if ( m_impl->CreateUDP() != wxSOCKET_NOERROR ) { - delete m_impl; - m_impl = NULL; + wxDELETE(m_impl); return; }