1 ///////////////////////////////////////////////////////////////////////////// 
   2 // Name:       src/common/socket.cpp 
   3 // Purpose:    Socket handler classes 
   4 // Authors:    Guilhem Lavaux, Guillermo Rodriguez Garcia 
   6 // Copyright:  (C) 1999-1997, Guilhem Lavaux 
   7 //             (C) 1999-2000, Guillermo Rodriguez Garcia 
   8 //             (C) 2008 Vadim Zeitlin 
  10 // License:    wxWindows licence 
  11 ///////////////////////////////////////////////////////////////////////////// 
  13 // ========================================================================== 
  15 // ========================================================================== 
  17 // For compilers that support precompilation, includes "wx.h". 
  18 #include "wx/wxprec.h" 
  26 #include "wx/socket.h" 
  29     #include "wx/object.h" 
  30     #include "wx/string.h" 
  37     #include "wx/module.h" 
  40 #include "wx/apptrait.h" 
  41 #include "wx/sckaddr.h" 
  42 #include "wx/stopwatch.h" 
  43 #include "wx/thread.h" 
  44 #include "wx/evtloop.h" 
  47 #include "wx/private/fd.h" 
  48 #include "wx/private/socket.h" 
  54 // we use MSG_NOSIGNAL to avoid getting SIGPIPE when sending data to a remote 
  55 // host which closed the connection if it is available, otherwise we rely on 
  56 // SO_NOSIGPIPE existency 
  58 // this should cover all the current Unix systems (Windows never sends any 
  59 // signals anyhow) but if we find one that has neither we should explicitly 
  60 // ignore SIGPIPE for it 
  61 // OpenVMS has neither MSG_NOSIGNAL nor SO_NOSIGPIPE. However the socket sample 
  62 // seems to work. Not sure if problems will show up on OpenVMS using sockets. 
  64     #define wxSOCKET_MSG_NOSIGNAL MSG_NOSIGNAL 
  65 #else // MSG_NOSIGNAL not available (BSD including OS X) 
  66     // next best possibility is to use SO_NOSIGPIPE socket option, this covers 
  67     // BSD systems (including OS X) -- but if we don't have it neither (AIX and 
  68     // old HP-UX do not), we have to fall back to the old way of simply 
  69     // disabling SIGPIPE temporarily, so define a class to do it in a safe way 
  70     #if defined(__UNIX__) && !defined(SO_NOSIGPIPE) 
  71     extern "C" { typedef void (*wxSigHandler_t
)(int); } 
  77             // ctor disables the given signal 
  79                 : m_handler(signal(sig
, SIG_IGN
)), 
  84             // dtor restores the old handler 
  87                 signal(m_sig
, m_handler
); 
  91             const wxSigHandler_t m_handler
; 
  94             wxDECLARE_NO_COPY_CLASS(IgnoreSignal
); 
  96     } // anonymous namespace 
  98     #define wxNEEDS_IGNORE_SIGPIPE 
  99     #endif // Unix without SO_NOSIGPIPE 
 101     #define wxSOCKET_MSG_NOSIGNAL 0 
 104 // DLL options compatibility check: 
 105 #include "wx/build.h" 
 106 WX_CHECK_BUILD_OPTIONS("wxNet") 
 108 // -------------------------------------------------------------------------- 
 109 // macros and constants 
 110 // -------------------------------------------------------------------------- 
 113 wxDEFINE_EVENT(wxEVT_SOCKET
, wxSocketEvent
); 
 116 #define MAX_DISCARD_SIZE (10 * 1024) 
 118 #define wxTRACE_Socket _T("wxSocket") 
 120 // -------------------------------------------------------------------------- 
 122 // -------------------------------------------------------------------------- 
 124 IMPLEMENT_CLASS(wxSocketBase
, wxObject
) 
 125 IMPLEMENT_CLASS(wxSocketServer
, wxSocketBase
) 
 126 IMPLEMENT_CLASS(wxSocketClient
, wxSocketBase
) 
 127 IMPLEMENT_CLASS(wxDatagramSocket
, wxSocketBase
) 
 128 IMPLEMENT_DYNAMIC_CLASS(wxSocketEvent
, wxEvent
) 
 130 // ---------------------------------------------------------------------------- 
 132 // ---------------------------------------------------------------------------- 
 137 void SetTimeValFromMS(timeval
& tv
, unsigned long ms
) 
 139     tv
.tv_sec  
= (ms 
/ 1000); 
 140     tv
.tv_usec 
= (ms 
% 1000) * 1000; 
 143 } // anonymous namespace 
 145 // -------------------------------------------------------------------------- 
 147 // -------------------------------------------------------------------------- 
 149 class wxSocketState 
: public wxObject
 
 152     wxSocketFlags            m_flags
; 
 153     wxSocketEventFlags       m_eventmask
; 
 158     wxSocketState() : wxObject() {} 
 160     wxDECLARE_NO_COPY_CLASS(wxSocketState
); 
 163 // wxSocketWaitModeChanger: temporarily change the socket flags affecting its 
 165 class wxSocketWaitModeChanger
 
 168     // temporarily set the flags to include the flag value which may be either 
 169     // wxSOCKET_NOWAIT or wxSOCKET_WAITALL 
 170     wxSocketWaitModeChanger(wxSocketBase 
*socket
, int flag
) 
 172           m_oldflags(socket
->GetFlags()) 
 175         wxASSERT_MSG( flag 
== wxSOCKET_WAITALL 
|| flag 
== wxSOCKET_NOWAIT
, 
 178         // preserve wxSOCKET_BLOCK value when switching to wxSOCKET_WAITALL 
 179         // mode but not when switching to wxSOCKET_NOWAIT as the latter is 
 180         // incompatible with wxSOCKET_BLOCK 
 181         if ( flag 
!= wxSOCKET_NOWAIT 
) 
 182             flag 
|= m_oldflags 
& wxSOCKET_BLOCK
; 
 184         socket
->SetFlags(flag
); 
 187     ~wxSocketWaitModeChanger() 
 189         m_socket
->SetFlags(m_oldflags
); 
 193     wxSocketBase 
* const m_socket
; 
 194     const int m_oldflags
; 
 196     wxDECLARE_NO_COPY_CLASS(wxSocketWaitModeChanger
); 
 199 // wxSocketRead/WriteGuard are instantiated before starting reading 
 200 // from/writing to the socket 
 201 class wxSocketReadGuard
 
 204     wxSocketReadGuard(wxSocketBase 
*socket
) 
 207         wxASSERT_MSG( !m_socket
->m_reading
, "read reentrancy?" ); 
 209         m_socket
->m_reading 
= true; 
 214         m_socket
->m_reading 
= false; 
 216         // connection could have been lost while reading, in this case calling 
 217         // ReenableEvents() would assert and is not necessary anyhow 
 218         wxSocketImpl 
* const impl 
= m_socket
->m_impl
; 
 219         if ( impl 
&& impl
->m_fd 
!= INVALID_SOCKET 
) 
 220             impl
->ReenableEvents(wxSOCKET_INPUT_FLAG
); 
 224     wxSocketBase 
* const m_socket
; 
 226     wxDECLARE_NO_COPY_CLASS(wxSocketReadGuard
); 
 229 class wxSocketWriteGuard
 
 232     wxSocketWriteGuard(wxSocketBase 
*socket
) 
 235         wxASSERT_MSG( !m_socket
->m_writing
, "write reentrancy?" ); 
 237         m_socket
->m_writing 
= true; 
 240     ~wxSocketWriteGuard() 
 242         m_socket
->m_writing 
= false; 
 244         wxSocketImpl 
* const impl 
= m_socket
->m_impl
; 
 245         if ( impl 
&& impl
->m_fd 
!= INVALID_SOCKET 
) 
 246             impl
->ReenableEvents(wxSOCKET_OUTPUT_FLAG
); 
 250     wxSocketBase 
* const m_socket
; 
 252     wxDECLARE_NO_COPY_CLASS(wxSocketWriteGuard
); 
 255 // ============================================================================ 
 257 // ============================================================================ 
 259 wxSocketManager 
*wxSocketManager::ms_manager 
= NULL
; 
 262 void wxSocketManager::Set(wxSocketManager 
*manager
) 
 264     wxASSERT_MSG( !ms_manager
, "too late to set manager now" ); 
 266     ms_manager 
= manager
; 
 270 void wxSocketManager::Init() 
 272     wxASSERT_MSG( !ms_manager
, "shouldn't be initialized twice" ); 
 275         Details: Initialize() creates a hidden window as a sink for socket 
 276         events, such as 'read completed'. wxMSW has only one message loop 
 277         for the main thread. If Initialize is called in a secondary thread, 
 278         the socket window will be created for the secondary thread, but 
 279         since there is no message loop on this thread, it will never 
 280         receive events and all socket operations will time out. 
 281         BTW, the main thread must not be stopped using sleep or block 
 282         on a semaphore (a bad idea in any case) or socket operations 
 285         On the Mac side, Initialize() stores a pointer to the CFRunLoop for 
 286         the main thread. Because secondary threads do not have run loops, 
 287         adding event notifications to the "Current" loop would have no 
 288         effect at all, events would never fire. 
 290     wxASSERT_MSG( wxIsMainThread(), 
 291                     "sockets must be initialized from the main thread" ); 
 293     wxAppConsole 
* const app 
= wxAppConsole::GetInstance(); 
 294     wxCHECK_RET( app
, "sockets can't be initialized without wxApp" ); 
 296     ms_manager 
= app
->GetTraits()->GetSocketManager(); 
 299 // ========================================================================== 
 301 // ========================================================================== 
 303 wxSocketImpl::wxSocketImpl(wxSocketBase
& wxsocket
) 
 304     : m_wxsocket(&wxsocket
) 
 306     m_fd              
= INVALID_SOCKET
; 
 307     m_error           
= wxSOCKET_NOERROR
; 
 311     SetTimeout(wxsocket
.GetTimeout() * 1000); 
 313     m_establishing    
= false; 
 317     m_initialRecvBufferSize 
= -1; 
 318     m_initialSendBufferSize 
= -1; 
 321 wxSocketImpl::~wxSocketImpl() 
 323     if ( m_fd 
!= INVALID_SOCKET 
) 
 327 bool wxSocketImpl::PreCreateCheck(const wxSockAddressImpl
& addr
) 
 329     if ( m_fd 
!= INVALID_SOCKET 
) 
 331         m_error 
= wxSOCKET_INVSOCK
; 
 337         m_error 
= wxSOCKET_INVADDR
; 
 344 void wxSocketImpl::PostCreation() 
 346     // FreeBSD variants can't use MSG_NOSIGNAL, and instead use a socket option 
 348     EnableSocketOption(SO_NOSIGPIPE
); 
 352         EnableSocketOption(SO_REUSEADDR
); 
 356         wxASSERT_MSG( !m_stream
, "broadcasting is for datagram sockets only" ); 
 358         EnableSocketOption(SO_BROADCAST
); 
 361     if ( m_initialRecvBufferSize 
>= 0 ) 
 362         SetSocketOption(SO_RCVBUF
, m_initialRecvBufferSize
); 
 363     if ( m_initialSendBufferSize 
>= 0 ) 
 364         SetSocketOption(SO_SNDBUF
, m_initialSendBufferSize
); 
 366     // we always put our sockets in unblocked mode and handle blocking 
 367     // ourselves in DoRead/Write() if wxSOCKET_WAITALL is specified 
 368     UnblockAndRegisterWithEventLoop(); 
 371 wxSocketError 
wxSocketImpl::UpdateLocalAddress() 
 373     if ( !m_local
.IsOk() ) 
 375         // ensure that we have a valid object using the correct family: correct 
 376         // being the same one as our peer uses as we have no other way to 
 378         m_local
.Create(m_peer
.GetFamily()); 
 381     WX_SOCKLEN_T lenAddr 
= m_local
.GetLen(); 
 382     if ( getsockname(m_fd
, m_local
.GetWritableAddr(), &lenAddr
) != 0 ) 
 385         m_error 
= wxSOCKET_IOERR
; 
 389     return wxSOCKET_NOERROR
; 
 392 wxSocketError 
wxSocketImpl::CreateServer() 
 394     if ( !PreCreateCheck(m_local
) ) 
 400     // do create the socket 
 401     m_fd 
= socket(m_local
.GetFamily(), SOCK_STREAM
, 0); 
 403     if ( m_fd 
== INVALID_SOCKET 
) 
 405         m_error 
= wxSOCKET_IOERR
; 
 406         return wxSOCKET_IOERR
; 
 411     // and then bind to and listen on it 
 413     // FIXME: should we test for m_dobind here? 
 414     if ( bind(m_fd
, m_local
.GetAddr(), m_local
.GetLen()) != 0 ) 
 415         m_error 
= wxSOCKET_IOERR
; 
 419         if ( listen(m_fd
, 5) != 0 ) 
 420             m_error 
= wxSOCKET_IOERR
; 
 429     // finally retrieve the address we effectively bound to 
 430     return UpdateLocalAddress(); 
 433 wxSocketError 
wxSocketImpl::CreateClient(bool wait
) 
 435     if ( !PreCreateCheck(m_peer
) ) 
 438     m_fd 
= socket(m_peer
.GetFamily(), SOCK_STREAM
, 0); 
 440     if ( m_fd 
== INVALID_SOCKET 
) 
 442         m_error 
= wxSOCKET_IOERR
; 
 443         return wxSOCKET_IOERR
; 
 448     // If a local address has been set, then bind to it before calling connect 
 449     if ( m_local
.IsOk() ) 
 451         if ( bind(m_fd
, m_local
.GetAddr(), m_local
.GetLen()) != 0 ) 
 454             m_error 
= wxSOCKET_IOERR
; 
 460     int rc 
= connect(m_fd
, m_peer
.GetAddr(), m_peer
.GetLen()); 
 461     if ( rc 
== SOCKET_ERROR 
) 
 463         wxSocketError err 
= GetLastError(); 
 464         if ( err 
== wxSOCKET_WOULDBLOCK 
) 
 466             m_establishing 
= true; 
 468             // block waiting for connection if we should (otherwise just return 
 469             // wxSOCKET_WOULDBLOCK to the caller) 
 472                 err 
= SelectWithTimeout(wxSOCKET_CONNECTION_FLAG
) 
 475                 m_establishing 
= false; 
 483         m_error 
= wxSOCKET_NOERROR
; 
 490 wxSocketError 
wxSocketImpl::CreateUDP() 
 492     if ( !PreCreateCheck(m_local
) ) 
 498     m_fd 
= socket(m_local
.GetFamily(), SOCK_DGRAM
, 0); 
 500     if ( m_fd 
== INVALID_SOCKET 
) 
 502         m_error 
= wxSOCKET_IOERR
; 
 503         return wxSOCKET_IOERR
; 
 510         if ( bind(m_fd
, m_local
.GetAddr(), m_local
.GetLen()) != 0 ) 
 513             m_error 
= wxSOCKET_IOERR
; 
 517         return UpdateLocalAddress(); 
 520     return wxSOCKET_NOERROR
; 
 523 wxSocketImpl 
*wxSocketImpl::Accept(wxSocketBase
& wxsocket
) 
 525     wxSockAddressStorage from
; 
 526     WX_SOCKLEN_T fromlen 
= sizeof(from
); 
 527     const SOCKET fd 
= accept(m_fd
, &from
.addr
, &fromlen
); 
 529     // accepting is similar to reading in the sense that it resets "ready for 
 530     // read" flag on the socket 
 531     ReenableEvents(wxSOCKET_INPUT_FLAG
); 
 533     if ( fd 
== INVALID_SOCKET 
) 
 536     wxSocketImpl 
* const sock 
= Create(wxsocket
); 
 538     sock
->m_peer 
= wxSockAddressImpl(from
.addr
, fromlen
); 
 540     sock
->UnblockAndRegisterWithEventLoop(); 
 546 void wxSocketImpl::Close() 
 548     if ( m_fd 
!= INVALID_SOCKET 
) 
 551         m_fd 
= INVALID_SOCKET
; 
 555 void wxSocketImpl::Shutdown() 
 557     if ( m_fd 
!= INVALID_SOCKET 
) 
 559         shutdown(m_fd
, 1 /* SD_SEND */); 
 565  *  Sets the timeout for blocking calls. Time is expressed in 
 568 void wxSocketImpl::SetTimeout(unsigned long millis
) 
 570     SetTimeValFromMS(m_timeout
, millis
); 
 573 void wxSocketImpl::NotifyOnStateChange(wxSocketNotify event
) 
 575     m_wxsocket
->OnRequest(event
); 
 578 /* Address handling */ 
 579 wxSocketError 
wxSocketImpl::SetLocal(const wxSockAddressImpl
& local
) 
 581     /* the socket must be initialized, or it must be a server */ 
 582     if (m_fd 
!= INVALID_SOCKET 
&& !m_server
) 
 584         m_error 
= wxSOCKET_INVSOCK
; 
 585         return wxSOCKET_INVSOCK
; 
 590         m_error 
= wxSOCKET_INVADDR
; 
 591         return wxSOCKET_INVADDR
; 
 596     return wxSOCKET_NOERROR
; 
 599 wxSocketError 
wxSocketImpl::SetPeer(const wxSockAddressImpl
& peer
) 
 603         m_error 
= wxSOCKET_INVADDR
; 
 604         return wxSOCKET_INVADDR
; 
 609     return wxSOCKET_NOERROR
; 
 612 const wxSockAddressImpl
& wxSocketImpl::GetLocal() 
 614     if ( !m_local
.IsOk() ) 
 615         UpdateLocalAddress(); 
 620 // ---------------------------------------------------------------------------- 
 622 // ---------------------------------------------------------------------------- 
 624 // this macro wraps the given expression (normally a syscall) in a loop which 
 625 // ignores any interruptions, i.e. reevaluates it again if it failed and errno 
 628     #define DO_WHILE_EINTR( rc, syscall ) \ 
 632         while ( rc == -1 && errno == EINTR ) 
 634     #define DO_WHILE_EINTR( rc, syscall ) rc = (syscall) 
 637 int wxSocketImpl::RecvStream(void *buffer
, int size
) 
 640     DO_WHILE_EINTR( ret
, recv(m_fd
, static_cast<char *>(buffer
), size
, 0) ); 
 644         // receiving 0 bytes for a TCP socket indicates that the connection was 
 645         // closed by peer so shut down our end as well (for UDP sockets empty 
 646         // datagrams are also possible) 
 647         m_establishing 
= false; 
 648         NotifyOnStateChange(wxSOCKET_LOST
); 
 652         // do not return an error in this case however 
 658 int wxSocketImpl::SendStream(const void *buffer
, int size
) 
 660 #ifdef wxNEEDS_IGNORE_SIGPIPE 
 661     IgnoreSignal 
ignore(SIGPIPE
); 
 665     DO_WHILE_EINTR( ret
, send(m_fd
, static_cast<const char *>(buffer
), size
, 
 666                               wxSOCKET_MSG_NOSIGNAL
) ); 
 671 int wxSocketImpl::RecvDgram(void *buffer
, int size
) 
 673     wxSockAddressStorage from
; 
 674     WX_SOCKLEN_T fromlen 
= sizeof(from
); 
 677     DO_WHILE_EINTR( ret
, recvfrom(m_fd
, static_cast<char *>(buffer
), size
, 
 678                                   0, &from
.addr
, &fromlen
) ); 
 680     if ( ret 
== SOCKET_ERROR 
) 
 683     m_peer 
= wxSockAddressImpl(from
.addr
, fromlen
); 
 684     if ( !m_peer
.IsOk() ) 
 690 int wxSocketImpl::SendDgram(const void *buffer
, int size
) 
 692     if ( !m_peer
.IsOk() ) 
 694         m_error 
= wxSOCKET_INVADDR
; 
 699     DO_WHILE_EINTR( ret
, sendto(m_fd
, static_cast<const char *>(buffer
), size
, 
 700                                 0, m_peer
.GetAddr(), m_peer
.GetLen()) ); 
 705 int wxSocketImpl::Read(void *buffer
, int size
) 
 707     // server sockets can't be used for IO, only to accept new connections 
 708     if ( m_fd 
== INVALID_SOCKET 
|| m_server 
) 
 710         m_error 
= wxSOCKET_INVSOCK
; 
 714     int ret 
= m_stream 
? RecvStream(buffer
, size
) 
 715                        : RecvDgram(buffer
, size
); 
 717     m_error 
= ret 
== SOCKET_ERROR 
? GetLastError() : wxSOCKET_NOERROR
; 
 722 int wxSocketImpl::Write(const void *buffer
, int size
) 
 724     if ( m_fd 
== INVALID_SOCKET 
|| m_server 
) 
 726         m_error 
= wxSOCKET_INVSOCK
; 
 730     int ret 
= m_stream 
? SendStream(buffer
, size
) 
 731                        : SendDgram(buffer
, size
); 
 733     m_error 
= ret 
== SOCKET_ERROR 
? GetLastError() : wxSOCKET_NOERROR
; 
 738 // ========================================================================== 
 740 // ========================================================================== 
 742 // -------------------------------------------------------------------------- 
 743 // Initialization and shutdown 
 744 // -------------------------------------------------------------------------- 
 746 // FIXME-MT: all this is MT-unsafe, of course, we should protect all accesses 
 747 //           to m_countInit with a crit section 
 748 size_t wxSocketBase::m_countInit 
= 0; 
 750 bool wxSocketBase::IsInitialized() 
 752     return m_countInit 
> 0; 
 755 bool wxSocketBase::Initialize() 
 757     if ( !m_countInit
++ ) 
 759         wxSocketManager 
* const manager 
= wxSocketManager::Get(); 
 760         if ( !manager 
|| !manager
->OnInit() ) 
 771 void wxSocketBase::Shutdown() 
 773     // we should be initialized 
 774     wxASSERT_MSG( m_countInit 
> 0, _T("extra call to Shutdown()") ); 
 775     if ( --m_countInit 
== 0 ) 
 777         wxSocketManager 
* const manager 
= wxSocketManager::Get(); 
 778         wxCHECK_RET( manager
, "should have a socket manager" ); 
 784 // -------------------------------------------------------------------------- 
 786 // -------------------------------------------------------------------------- 
 788 void wxSocketBase::Init() 
 791     m_type         
= wxSOCKET_UNINIT
; 
 802     m_beingDeleted 
= false; 
 817     if ( !IsInitialized() ) 
 819         // this Initialize() will be undone by wxSocketModule::OnExit(), all 
 820         // the other calls to it should be matched by a call to Shutdown() 
 822             wxLogError("Cannot initialize wxSocketBase"); 
 826 wxSocketBase::wxSocketBase() 
 831 wxSocketBase::wxSocketBase(wxSocketFlags flags
, wxSocketType type
) 
 840 wxSocketBase::~wxSocketBase() 
 842     // Just in case the app called Destroy() *and* then deleted the socket 
 843     // immediately: don't leave dangling pointers. 
 844     wxAppTraits 
*traits 
= wxTheApp 
? wxTheApp
->GetTraits() : NULL
; 
 846         traits
->RemoveFromPendingDelete(this); 
 848     // Shutdown and close the socket 
 852     // Destroy the implementation object 
 855     // Free the pushback buffer 
 860 bool wxSocketBase::Destroy() 
 862     // Delayed destruction: the socket will be deleted during the next idle 
 863     // loop iteration. This ensures that all pending events have been 
 865     m_beingDeleted 
= true; 
 867     // Shutdown and close the socket 
 870     // Suppress events from now on 
 873     // schedule this object for deletion 
 874     wxAppTraits 
*traits 
= wxTheApp 
? wxTheApp
->GetTraits() : NULL
; 
 877         // let the traits object decide what to do with us 
 878         traits
->ScheduleForDestroy(this); 
 880     else // no app or no traits 
 882         // in wxBase we might have no app object at all, don't leak memory 
 889 // ---------------------------------------------------------------------------- 
 891 // ---------------------------------------------------------------------------- 
 893 void wxSocketBase::SetError(wxSocketError error
) 
 895     m_impl
->m_error 
= error
; 
 898 wxSocketError 
wxSocketBase::LastError() const 
 900     return m_impl
->GetError(); 
 903 // -------------------------------------------------------------------------- 
 905 // -------------------------------------------------------------------------- 
 907 // The following IO operations update m_lcount: 
 908 // {Read, Write, ReadMsg, WriteMsg, Peek, Unread, Discard} 
 909 bool wxSocketBase::Close() 
 911     // Interrupt pending waits 
 917     m_establishing 
= false; 
 921 void wxSocketBase::ShutdownOutput() 
 927 wxSocketBase
& wxSocketBase::Read(void* buffer
, wxUint32 nbytes
) 
 929     wxSocketReadGuard 
read(this); 
 931     m_lcount 
= DoRead(buffer
, nbytes
); 
 936 wxUint32 
wxSocketBase::DoRead(void* buffer_
, wxUint32 nbytes
) 
 938     wxCHECK_MSG( m_impl
, 0, "socket must be valid" ); 
 940     // We use pointer arithmetic here which doesn't work with void pointers. 
 941     char *buffer 
= static_cast<char *>(buffer_
); 
 942     wxCHECK_MSG( buffer
, 0, "NULL buffer" ); 
 944     // Try the push back buffer first, even before checking whether the socket 
 945     // is valid to allow reading previously pushed back data from an already 
 947     wxUint32 total 
= GetPushback(buffer
, nbytes
, false); 
 953         // our socket is non-blocking so Read() will return immediately if 
 954         // there is nothing to read yet and it's more efficient to try it first 
 955         // before entering DoWait() which is going to start dispatching GUI 
 956         // events and, even more importantly, we must do this under Windows 
 957         // where we're not going to get notifications about socket being ready 
 958         // for reading before we read all the existing data from it 
 959         const int ret 
= !m_impl
->m_stream 
|| m_connected
 
 960                             ? m_impl
->Read(buffer
, nbytes
) 
 964             if ( m_impl
->GetLastError() == wxSOCKET_WOULDBLOCK 
) 
 966                 // if we don't want to wait, just return immediately 
 967                 if ( m_flags 
& wxSOCKET_NOWAIT 
) 
 970                 // otherwise wait until the socket becomes ready for reading or 
 971                 // an error occurs on it 
 972                 if ( !DoWaitWithTimeout(wxSOCKET_INPUT_FLAG
) ) 
 974                     // and exit if the timeout elapsed before it did 
 975                     SetError(wxSOCKET_TIMEDOUT
); 
 984                 SetError(wxSOCKET_IOERR
); 
 990             // for connection-oriented (e.g. TCP) sockets we can only read 
 991             // 0 bytes if the other end has been closed, and for connectionless 
 992             // ones (UDP) this flag doesn't make sense anyhow so we can set it 
 993             // to true too without doing any harm 
 996             // we're not going to read anything else and so if we haven't read 
 997             // anything (or not everything in wxSOCKET_WAITALL case) already, 
 999             if ( (m_flags 
& wxSOCKET_WAITALL
) || !total 
) 
1000                 SetError(wxSOCKET_IOERR
); 
1006         // if we are happy to read something and not the entire nbytes bytes, 
1008         if ( !(m_flags 
& wxSOCKET_WAITALL
) ) 
1018 wxSocketBase
& wxSocketBase::ReadMsg(void* buffer
, wxUint32 nbytes
) 
1022         unsigned char sig
[4]; 
1023         unsigned char len
[4]; 
1026     wxSocketReadGuard 
read(this); 
1028     wxSocketWaitModeChanger 
changeFlags(this, wxSOCKET_WAITALL
); 
1031     if ( DoRead(&msg
, sizeof(msg
)) == sizeof(msg
) ) 
1033         wxUint32 sig 
= (wxUint32
)msg
.sig
[0]; 
1034         sig 
|= (wxUint32
)(msg
.sig
[1] << 8); 
1035         sig 
|= (wxUint32
)(msg
.sig
[2] << 16); 
1036         sig 
|= (wxUint32
)(msg
.sig
[3] << 24); 
1038         if ( sig 
== 0xfeeddead ) 
1040             wxUint32 len 
= (wxUint32
)msg
.len
[0]; 
1041             len 
|= (wxUint32
)(msg
.len
[1] << 8); 
1042             len 
|= (wxUint32
)(msg
.len
[2] << 16); 
1043             len 
|= (wxUint32
)(msg
.len
[3] << 24); 
1048                 len2 
= len 
- nbytes
; 
1054             // Don't attempt to read if the msg was zero bytes long. 
1055             m_lcount 
= len 
? DoRead(buffer
, len
) : 0; 
1059                 char discard_buffer
[MAX_DISCARD_SIZE
]; 
1062                 // NOTE: discarded bytes don't add to m_lcount. 
1065                     discard_len 
= len2 
> MAX_DISCARD_SIZE
 
1068                     discard_len 
= DoRead(discard_buffer
, (wxUint32
)discard_len
); 
1069                     len2 
-= (wxUint32
)discard_len
; 
1071                 while ((discard_len 
> 0) && len2
); 
1074             if ( !len2 
&& DoRead(&msg
, sizeof(msg
)) == sizeof(msg
) ) 
1076                 sig 
= (wxUint32
)msg
.sig
[0]; 
1077                 sig 
|= (wxUint32
)(msg
.sig
[1] << 8); 
1078                 sig 
|= (wxUint32
)(msg
.sig
[2] << 16); 
1079                 sig 
|= (wxUint32
)(msg
.sig
[3] << 24); 
1081                 if ( sig 
== 0xdeadfeed ) 
1088         SetError(wxSOCKET_IOERR
); 
1093 wxSocketBase
& wxSocketBase::Peek(void* buffer
, wxUint32 nbytes
) 
1095     wxSocketReadGuard 
read(this); 
1097     m_lcount 
= DoRead(buffer
, nbytes
); 
1099     Pushback(buffer
, m_lcount
); 
1104 wxSocketBase
& wxSocketBase::Write(const void *buffer
, wxUint32 nbytes
) 
1106     wxSocketWriteGuard 
write(this); 
1108     m_lcount 
= DoWrite(buffer
, nbytes
); 
1113 // This function is a mirror image of DoRead() except that it doesn't use the 
1114 // push back buffer and doesn't treat 0 return value specially (normally this 
1115 // shouldn't happen at all here), so please see comments there for explanations 
1116 wxUint32 
wxSocketBase::DoWrite(const void *buffer_
, wxUint32 nbytes
) 
1118     wxCHECK_MSG( m_impl
, 0, "socket must be valid" ); 
1120     const char *buffer 
= static_cast<const char *>(buffer_
); 
1121     wxCHECK_MSG( buffer
, 0, "NULL buffer" ); 
1126         if ( m_impl
->m_stream 
&& !m_connected 
) 
1128             if ( (m_flags 
& wxSOCKET_WAITALL
) || !total 
) 
1129                 SetError(wxSOCKET_IOERR
); 
1133         const int ret 
= m_impl
->Write(buffer
, nbytes
); 
1136             if ( m_impl
->GetLastError() == wxSOCKET_WOULDBLOCK 
) 
1138                 if ( m_flags 
& wxSOCKET_NOWAIT 
) 
1141                 if ( !DoWaitWithTimeout(wxSOCKET_OUTPUT_FLAG
) ) 
1143                     SetError(wxSOCKET_TIMEDOUT
); 
1149             else // "real" error 
1151                 SetError(wxSOCKET_IOERR
); 
1158         if ( !(m_flags 
& wxSOCKET_WAITALL
) ) 
1168 wxSocketBase
& wxSocketBase::WriteMsg(const void *buffer
, wxUint32 nbytes
) 
1172         unsigned char sig
[4]; 
1173         unsigned char len
[4]; 
1176     wxSocketWriteGuard 
write(this); 
1178     wxSocketWaitModeChanger 
changeFlags(this, wxSOCKET_WAITALL
); 
1180     msg
.sig
[0] = (unsigned char) 0xad; 
1181     msg
.sig
[1] = (unsigned char) 0xde; 
1182     msg
.sig
[2] = (unsigned char) 0xed; 
1183     msg
.sig
[3] = (unsigned char) 0xfe; 
1185     msg
.len
[0] = (unsigned char) (nbytes 
& 0xff); 
1186     msg
.len
[1] = (unsigned char) ((nbytes 
>> 8) & 0xff); 
1187     msg
.len
[2] = (unsigned char) ((nbytes 
>> 16) & 0xff); 
1188     msg
.len
[3] = (unsigned char) ((nbytes 
>> 24) & 0xff); 
1191     if ( DoWrite(&msg
, sizeof(msg
)) == sizeof(msg
) ) 
1193         m_lcount 
= DoWrite(buffer
, nbytes
); 
1194         if ( m_lcount 
== nbytes 
) 
1196             msg
.sig
[0] = (unsigned char) 0xed; 
1197             msg
.sig
[1] = (unsigned char) 0xfe; 
1198             msg
.sig
[2] = (unsigned char) 0xad; 
1199             msg
.sig
[3] = (unsigned char) 0xde; 
1203             msg
.len
[3] = (char) 0; 
1205             if ( DoWrite(&msg
, sizeof(msg
)) == sizeof(msg
)) 
1211         SetError(wxSOCKET_IOERR
); 
1216 wxSocketBase
& wxSocketBase::Unread(const void *buffer
, wxUint32 nbytes
) 
1219         Pushback(buffer
, nbytes
); 
1221     SetError(wxSOCKET_NOERROR
); 
1227 wxSocketBase
& wxSocketBase::Discard() 
1229     char *buffer 
= new char[MAX_DISCARD_SIZE
]; 
1233     wxSocketReadGuard 
read(this); 
1235     wxSocketWaitModeChanger 
changeFlags(this, wxSOCKET_NOWAIT
); 
1239         ret 
= DoRead(buffer
, MAX_DISCARD_SIZE
); 
1242     while (ret 
== MAX_DISCARD_SIZE
); 
1246     SetError(wxSOCKET_NOERROR
); 
1251 // -------------------------------------------------------------------------- 
1253 // -------------------------------------------------------------------------- 
1256     This function will check for the events specified in the flags parameter, 
1257     and it will return a mask indicating which operations can be performed. 
1259 wxSocketEventFlags 
wxSocketImpl::Select(wxSocketEventFlags flags
, 
1260                                         const timeval 
*timeout
) 
1262     if ( m_fd 
== INVALID_SOCKET 
) 
1263         return (wxSOCKET_LOST_FLAG 
& flags
); 
1269         tv
.tv_sec 
= tv
.tv_usec 
= 0; 
1271     // prepare the FD sets, passing NULL for the one(s) we don't use 
1273         readfds
, *preadfds 
= NULL
, 
1274         writefds
, *pwritefds 
= NULL
, 
1275         exceptfds
;                      // always want to know about errors 
1277     if ( flags 
& wxSOCKET_INPUT_FLAG 
) 
1279         preadfds 
= &readfds
; 
1280         wxFD_ZERO(preadfds
); 
1281         wxFD_SET(m_fd
, preadfds
); 
1284     // when using non-blocking connect() the socket becomes connected 
1285     // (successfully or not) when it becomes writable 
1286     if ( flags 
& (wxSOCKET_OUTPUT_FLAG 
| wxSOCKET_CONNECTION_FLAG
) ) 
1288         pwritefds 
= &writefds
; 
1289         wxFD_ZERO(pwritefds
); 
1290         wxFD_SET(m_fd
, pwritefds
); 
1293     wxFD_ZERO(&exceptfds
); 
1294     wxFD_SET(m_fd
, &exceptfds
); 
1296     const int rc 
= select(m_fd 
+ 1, preadfds
, pwritefds
, &exceptfds
, &tv
); 
1298     // check for errors first 
1299     if ( rc 
== -1 || wxFD_ISSET(m_fd
, &exceptfds
) ) 
1301         m_establishing 
= false; 
1303         return wxSOCKET_LOST_FLAG 
& flags
; 
1309     wxASSERT_MSG( rc 
== 1, "unexpected select() return value" ); 
1311     wxSocketEventFlags detected 
= 0; 
1312     if ( preadfds 
&& wxFD_ISSET(m_fd
, preadfds
) ) 
1313         detected 
|= wxSOCKET_INPUT_FLAG
; 
1315     if ( pwritefds 
&& wxFD_ISSET(m_fd
, pwritefds
) ) 
1317         // check for the case of non-blocking connect() 
1318         if ( m_establishing 
&& !m_server 
) 
1321             SOCKOPTLEN_T len 
= sizeof(error
); 
1322             m_establishing 
= false; 
1323             getsockopt(m_fd
, SOL_SOCKET
, SO_ERROR
, (char*)&error
, &len
); 
1326                 detected 
= wxSOCKET_LOST_FLAG
; 
1328                 detected 
|= wxSOCKET_CONNECTION_FLAG
; 
1330         else // not called to get non-blocking connect() status 
1332             detected 
|= wxSOCKET_OUTPUT_FLAG
; 
1336     return detected 
& flags
; 
1340 wxSocketBase::DoWait(long seconds
, long milliseconds
, wxSocketEventFlags flags
) 
1342     // Use either the provided timeout or the default timeout value associated 
1343     // with this socket. 
1345     // TODO: allow waiting forever, see #9443 
1346     const long timeout 
= seconds 
== -1 ? m_timeout 
* 1000 
1347                                        : seconds 
* 1000 + milliseconds
; 
1349     return DoWait(timeout
, flags
); 
1353 wxSocketBase::DoWait(long timeout
, wxSocketEventFlags flags
) 
1355     wxCHECK_MSG( m_impl
, -1, "can't wait on invalid socket" ); 
1357     // we're never going to become ready if we're not connected (any more) 
1358     if ( !m_connected 
&& !m_establishing 
) 
1361     // This can be set to true from Interrupt() to exit this function a.s.a.p. 
1362     m_interrupt 
= false; 
1365     const wxMilliClock_t timeEnd 
= wxGetLocalTimeMillis() + timeout
; 
1367     // Get the active event loop which we'll use for the message dispatching 
1368     // when running in the main thread unless this was explicitly disabled by 
1369     // setting wxSOCKET_BLOCK flag 
1370     wxEventLoopBase 
*eventLoop
; 
1371     if ( !(m_flags 
& wxSOCKET_BLOCK
) && wxIsMainThread() ) 
1373         eventLoop 
= wxEventLoop::GetActive(); 
1375     else // in worker thread 
1377         // We never dispatch messages from threads other than the main one. 
1381     // Make sure the events we're interested in are enabled before waiting for 
1382     // them: this is really necessary here as otherwise this could happen: 
1383     //  1. DoRead(wxSOCKET_WAITALL) is called 
1384     //  2. There is nothing to read so DoWait(wxSOCKET_INPUT_FLAG) is called 
1385     //  3. Some, but not all data appears, wxSocketImplUnix::OnReadWaiting() 
1386     //     is called and wxSOCKET_INPUT_FLAG events are disabled in it 
1387     //  4. Because of wxSOCKET_WAITALL we call DoWait() again but the events 
1388     //     are still disabled and we block forever 
1390     // More elegant solution would be nice but for now simply re-enabling the 
1391     // events here will do 
1392     m_impl
->ReenableEvents(flags 
& (wxSOCKET_INPUT_FLAG 
| wxSOCKET_OUTPUT_FLAG
)); 
1395     // Wait until we receive the event we're waiting for or the timeout expires 
1396     // (but note that we always execute the loop at least once, even if timeout 
1397     // is 0 as this is used for polling) 
1399     for ( bool firstTime 
= true; !m_interrupt
; firstTime 
= false ) 
1401         long timeLeft 
= wxMilliClockToLong(timeEnd 
- wxGetLocalTimeMillis()); 
1410         wxSocketEventFlags events
; 
1413             // reset them before starting to wait 
1416             eventLoop
->DispatchTimeout(timeLeft
); 
1418             events 
= m_eventsgot
; 
1420         else // no event loop or waiting in another thread 
1422             // as explained below, we should always check for wxSOCKET_LOST_FLAG 
1424             SetTimeValFromMS(tv
, timeLeft
); 
1425             events 
= m_impl
->Select(flags 
| wxSOCKET_LOST_FLAG
, &tv
); 
1428         // always check for wxSOCKET_LOST_FLAG, even if flags doesn't include 
1429         // it, as continuing to wait for anything else after getting it is 
1431         if ( events 
& wxSOCKET_LOST_FLAG 
) 
1433             m_connected 
= false; 
1434             m_establishing 
= false; 
1439         // otherwise mask out the bits we're not interested in 
1442         // Incoming connection (server) or connection established (client)? 
1443         if ( events 
& wxSOCKET_CONNECTION_FLAG 
) 
1446             m_establishing 
= false; 
1451         // Data available or output buffer ready? 
1452         if ( (events 
& wxSOCKET_INPUT_FLAG
) || (events 
& wxSOCKET_OUTPUT_FLAG
) ) 
1462 bool wxSocketBase::Wait(long seconds
, long milliseconds
) 
1464     return DoWait(seconds
, milliseconds
, 
1465                   wxSOCKET_INPUT_FLAG 
| 
1466                   wxSOCKET_OUTPUT_FLAG 
| 
1467                   wxSOCKET_CONNECTION_FLAG
) != 0; 
1470 bool wxSocketBase::WaitForRead(long seconds
, long milliseconds
) 
1472     // Check pushback buffer before entering DoWait 
1476     // Check if the socket is not already ready for input, if it is, there is 
1477     // no need to start waiting for it (worse, we'll actually never get a 
1478     // notification about the socket becoming ready if it is already under 
1480     if ( m_impl
->Select(wxSOCKET_INPUT_FLAG
) ) 
1483     return DoWait(seconds
, milliseconds
, wxSOCKET_INPUT_FLAG
) != 0; 
1487 bool wxSocketBase::WaitForWrite(long seconds
, long milliseconds
) 
1489     if ( m_impl
->Select(wxSOCKET_OUTPUT_FLAG
) ) 
1492     return DoWait(seconds
, milliseconds
, wxSOCKET_OUTPUT_FLAG
) != 0; 
1495 bool wxSocketBase::WaitForLost(long seconds
, long milliseconds
) 
1497     return DoWait(seconds
, milliseconds
, wxSOCKET_LOST_FLAG
) == -1; 
1500 // -------------------------------------------------------------------------- 
1502 // -------------------------------------------------------------------------- 
1505 // Get local or peer address 
1508 bool wxSocketBase::GetPeer(wxSockAddress
& addr
) const 
1510     wxCHECK_MSG( m_impl
, false, "invalid socket" ); 
1512     const wxSockAddressImpl
& peer 
= m_impl
->GetPeer(); 
1516     addr
.SetAddress(peer
); 
1521 bool wxSocketBase::GetLocal(wxSockAddress
& addr
) const 
1523     wxCHECK_MSG( m_impl
, false, "invalid socket" ); 
1525     const wxSockAddressImpl
& local 
= m_impl
->GetLocal(); 
1526     if ( !local
.IsOk() ) 
1529     addr
.SetAddress(local
); 
1535 // Save and restore socket state 
1538 void wxSocketBase::SaveState() 
1540     wxSocketState 
*state
; 
1542     state 
= new wxSocketState(); 
1544     state
->m_flags      
= m_flags
; 
1545     state
->m_notify     
= m_notify
; 
1546     state
->m_eventmask  
= m_eventmask
; 
1547     state
->m_clientData 
= m_clientData
; 
1549     m_states
.Append(state
); 
1552 void wxSocketBase::RestoreState() 
1554     wxList::compatibility_iterator node
; 
1555     wxSocketState 
*state
; 
1557     node 
= m_states
.GetLast(); 
1561     state 
= (wxSocketState 
*)node
->GetData(); 
1563     m_flags      
= state
->m_flags
; 
1564     m_notify     
= state
->m_notify
; 
1565     m_eventmask  
= state
->m_eventmask
; 
1566     m_clientData 
= state
->m_clientData
; 
1568     m_states
.Erase(node
); 
1573 // Timeout and flags 
1576 void wxSocketBase::SetTimeout(long seconds
) 
1578     m_timeout 
= seconds
; 
1581         m_impl
->SetTimeout(m_timeout 
* 1000); 
1584 void wxSocketBase::SetFlags(wxSocketFlags flags
) 
1586     // Do some sanity checking on the flags used: not all values can be used 
1588     wxASSERT_MSG( !(flags 
& wxSOCKET_NOWAIT
) || 
1589                   !(flags 
& (wxSOCKET_WAITALL 
| wxSOCKET_BLOCK
)), 
1590                   "Using wxSOCKET_WAITALL or wxSOCKET_BLOCK with " 
1591                   "wxSOCKET_NOWAIT doesn't make sense" ); 
1597 // -------------------------------------------------------------------------- 
1599 // -------------------------------------------------------------------------- 
1601 void wxSocketBase::OnRequest(wxSocketNotify notification
) 
1603     wxSocketEventFlags flag 
= 0; 
1604     switch ( notification 
) 
1606         case wxSOCKET_INPUT
: 
1607             flag 
= wxSOCKET_INPUT_FLAG
; 
1610         case wxSOCKET_OUTPUT
: 
1611             flag 
= wxSOCKET_OUTPUT_FLAG
; 
1614         case wxSOCKET_CONNECTION
: 
1615             flag 
= wxSOCKET_CONNECTION_FLAG
; 
1617             // we're now successfully connected 
1619             m_establishing 
= false; 
1621             // error was previously set to wxSOCKET_WOULDBLOCK, but this is not 
1622             // the case any longer 
1623             SetError(wxSOCKET_NOERROR
); 
1627             flag 
= wxSOCKET_LOST_FLAG
; 
1629             // if we lost the connection the socket is now closed 
1634             wxFAIL_MSG( "unknown wxSocket notification" ); 
1637     // remember the events which were generated for this socket, we're going to 
1638     // use this in DoWait() 
1639     m_eventsgot 
|= flag
; 
1641     // send the wx event if enabled and we're interested in it 
1642     if ( m_notify 
&& (m_eventmask 
& flag
) && m_handler 
) 
1644         // don't generate the events when we're inside DoWait() called from our 
1645         // own code as we are going to consume the data that has just become 
1646         // available ourselves and the user code won't see it at all 
1647         if ( (notification 
== wxSOCKET_INPUT 
&& m_reading
) || 
1648                 (notification 
== wxSOCKET_OUTPUT 
&& m_writing
) ) 
1653         wxSocketEvent 
event(m_id
); 
1654         event
.m_event      
= notification
; 
1655         event
.m_clientData 
= m_clientData
; 
1656         event
.SetEventObject(this); 
1658         m_handler
->AddPendingEvent(event
); 
1662 void wxSocketBase::Notify(bool notify
) 
1667 void wxSocketBase::SetNotify(wxSocketEventFlags flags
) 
1669     m_eventmask 
= flags
; 
1672 void wxSocketBase::SetEventHandler(wxEvtHandler
& handler
, int id
) 
1674     m_handler 
= &handler
; 
1678 // -------------------------------------------------------------------------- 
1680 // -------------------------------------------------------------------------- 
1682 void wxSocketBase::Pushback(const void *buffer
, wxUint32 size
) 
1686     if (m_unread 
== NULL
) 
1687         m_unread 
= malloc(size
); 
1692         tmp 
= malloc(m_unrd_size 
+ size
); 
1693         memcpy((char *)tmp 
+ size
, m_unread
, m_unrd_size
); 
1699     m_unrd_size 
+= size
; 
1701     memcpy(m_unread
, buffer
, size
); 
1704 wxUint32 
wxSocketBase::GetPushback(void *buffer
, wxUint32 size
, bool peek
) 
1706     wxCHECK_MSG( buffer
, 0, "NULL buffer" ); 
1711     if (size 
> (m_unrd_size
-m_unrd_cur
)) 
1712         size 
= m_unrd_size
-m_unrd_cur
; 
1714     memcpy(buffer
, (char *)m_unread 
+ m_unrd_cur
, size
); 
1719         if (m_unrd_size 
== m_unrd_cur
) 
1732 // ========================================================================== 
1734 // ========================================================================== 
1736 // -------------------------------------------------------------------------- 
1738 // -------------------------------------------------------------------------- 
1740 wxSocketServer::wxSocketServer(const wxSockAddress
& addr
, 
1741                                wxSocketFlags flags
) 
1742               : wxSocketBase(flags
, wxSOCKET_SERVER
) 
1744     wxLogTrace( wxTRACE_Socket
, _T("Opening wxSocketServer") ); 
1746     m_impl 
= wxSocketImpl::Create(*this); 
1750         wxLogTrace( wxTRACE_Socket
, _T("*** Failed to create m_impl") ); 
1754     // Setup the socket as server 
1755     m_impl
->SetLocal(addr
.GetAddress()); 
1757     if (GetFlags() & wxSOCKET_REUSEADDR
) { 
1758         m_impl
->SetReusable(); 
1760     if (GetFlags() & wxSOCKET_BROADCAST
) { 
1761         m_impl
->SetBroadcast(); 
1763     if (GetFlags() & wxSOCKET_NOBIND
) { 
1764         m_impl
->DontDoBind(); 
1767     if (m_impl
->CreateServer() != wxSOCKET_NOERROR
) 
1772         wxLogTrace( wxTRACE_Socket
, _T("*** CreateServer() failed") ); 
1776     wxLogTrace( wxTRACE_Socket
, _T("wxSocketServer on fd %d"), m_impl
->m_fd 
); 
1779 // -------------------------------------------------------------------------- 
1781 // -------------------------------------------------------------------------- 
1783 bool wxSocketServer::AcceptWith(wxSocketBase
& sock
, bool wait
) 
1785     if ( !m_impl 
|| (m_impl
->m_fd 
== INVALID_SOCKET
) || !m_impl
->IsServer() ) 
1787         wxFAIL_MSG( "can only be called for a valid server socket" ); 
1789         SetError(wxSOCKET_INVSOCK
); 
1796         // wait until we get a connection 
1797         if ( !m_impl
->SelectWithTimeout(wxSOCKET_INPUT_FLAG
) ) 
1799             SetError(wxSOCKET_TIMEDOUT
); 
1805     sock
.m_impl 
= m_impl
->Accept(sock
); 
1809         SetError(m_impl
->GetLastError()); 
1814     sock
.m_type 
= wxSOCKET_BASE
; 
1815     sock
.m_connected 
= true; 
1820 wxSocketBase 
*wxSocketServer::Accept(bool wait
) 
1822     wxSocketBase
* sock 
= new wxSocketBase(); 
1824     sock
->SetFlags(m_flags
); 
1826     if (!AcceptWith(*sock
, wait
)) 
1835 bool wxSocketServer::WaitForAccept(long seconds
, long milliseconds
) 
1837     return DoWait(seconds
, milliseconds
, wxSOCKET_CONNECTION_FLAG
) == 1; 
1840 bool wxSocketBase::GetOption(int level
, int optname
, void *optval
, int *optlen
) 
1842     wxASSERT_MSG( m_impl
, _T("Socket not initialised") ); 
1844     SOCKOPTLEN_T lenreal 
= *optlen
; 
1845     if ( getsockopt(m_impl
->m_fd
, level
, optname
, 
1846                     static_cast<char *>(optval
), &lenreal
) != 0 ) 
1855 wxSocketBase::SetOption(int level
, int optname
, const void *optval
, int optlen
) 
1857     wxASSERT_MSG( m_impl
, _T("Socket not initialised") ); 
1859     return setsockopt(m_impl
->m_fd
, level
, optname
, 
1860                       static_cast<const char *>(optval
), optlen
) == 0; 
1863 bool wxSocketBase::SetLocal(const wxIPV4address
& local
) 
1865     m_localAddress 
= local
; 
1870 // ========================================================================== 
1872 // ========================================================================== 
1874 // -------------------------------------------------------------------------- 
1876 // -------------------------------------------------------------------------- 
1878 wxSocketClient::wxSocketClient(wxSocketFlags flags
) 
1879               : wxSocketBase(flags
, wxSOCKET_CLIENT
) 
1881     m_initialRecvBufferSize 
= 
1882     m_initialSendBufferSize 
= -1; 
1885 // -------------------------------------------------------------------------- 
1887 // -------------------------------------------------------------------------- 
1889 bool wxSocketClient::DoConnect(const wxSockAddress
& remote
, 
1890                                const wxSockAddress
* local
, 
1895         // Shutdown and destroy the old socket 
1900     m_connected 
= false; 
1901     m_establishing 
= false; 
1903     // Create and set up the new one 
1904     m_impl 
= wxSocketImpl::Create(*this); 
1908     // Reuse makes sense for clients too, if we are trying to rebind to the same port 
1909     if (GetFlags() & wxSOCKET_REUSEADDR
) 
1910         m_impl
->SetReusable(); 
1911     if (GetFlags() & wxSOCKET_BROADCAST
) 
1912         m_impl
->SetBroadcast(); 
1913     if (GetFlags() & wxSOCKET_NOBIND
) 
1914         m_impl
->DontDoBind(); 
1916     // Bind to the local IP address and port, when provided or if one had been 
1918     if ( !local 
&& m_localAddress
.GetAddress().IsOk() ) 
1919         local 
= &m_localAddress
; 
1922         m_impl
->SetLocal(local
->GetAddress()); 
1924     m_impl
->SetInitialSocketBuffers(m_initialRecvBufferSize
, m_initialSendBufferSize
); 
1926     m_impl
->SetPeer(remote
.GetAddress()); 
1928     // Finally do create the socket and connect to the peer 
1929     const wxSocketError err 
= m_impl
->CreateClient(wait
); 
1931     if ( err 
!= wxSOCKET_NOERROR 
) 
1933         if ( err 
== wxSOCKET_WOULDBLOCK 
) 
1935             wxASSERT_MSG( !wait
, "shouldn't get this for blocking connect" ); 
1937             m_establishing 
= true; 
1947 bool wxSocketClient::Connect(const wxSockAddress
& remote
, bool wait
) 
1949     return DoConnect(remote
, NULL
, wait
); 
1952 bool wxSocketClient::Connect(const wxSockAddress
& remote
, 
1953                              const wxSockAddress
& local
, 
1956     return DoConnect(remote
, &local
, wait
); 
1959 bool wxSocketClient::WaitOnConnect(long seconds
, long milliseconds
) 
1963         // this happens if the initial attempt to connect succeeded without 
1968     wxCHECK_MSG( m_establishing 
&& m_impl
, false, 
1969                  "No connection establishment attempt in progress" ); 
1971     // notice that we return true even if DoWait() returned -1, i.e. if an 
1972     // error occurred and connection was lost: this is intentional as we should 
1973     // return false only if timeout expired without anything happening 
1974     return DoWait(seconds
, milliseconds
, wxSOCKET_CONNECTION_FLAG
) != 0; 
1977 // ========================================================================== 
1979 // ========================================================================== 
1981 wxDatagramSocket::wxDatagramSocket( const wxSockAddress
& addr
, 
1982                                     wxSocketFlags flags 
) 
1983                 : wxSocketBase( flags
, wxSOCKET_DATAGRAM 
) 
1985     // Create the socket 
1986     m_impl 
= wxSocketImpl::Create(*this); 
1991     // Setup the socket as non connection oriented 
1992     m_impl
->SetLocal(addr
.GetAddress()); 
1993     if (flags 
& wxSOCKET_REUSEADDR
) 
1995         m_impl
->SetReusable(); 
1997     if (GetFlags() & wxSOCKET_BROADCAST
) 
1999         m_impl
->SetBroadcast(); 
2001     if (GetFlags() & wxSOCKET_NOBIND
) 
2003         m_impl
->DontDoBind(); 
2006     if ( m_impl
->CreateUDP() != wxSOCKET_NOERROR 
) 
2013     // Initialize all stuff 
2014     m_connected 
= false; 
2015     m_establishing 
= false; 
2018 wxDatagramSocket
& wxDatagramSocket::RecvFrom( wxSockAddress
& addr
, 
2027 wxDatagramSocket
& wxDatagramSocket::SendTo( const wxSockAddress
& addr
, 
2031     wxASSERT_MSG( m_impl
, _T("Socket not initialised") ); 
2033     m_impl
->SetPeer(addr
.GetAddress()); 
2038 // ========================================================================== 
2040 // ========================================================================== 
2042 class wxSocketModule 
: public wxModule
 
2045     virtual bool OnInit() 
2047         // wxSocketBase will call Initialize() itself only if sockets are 
2048         // really used, don't do it from here 
2052     virtual void OnExit() 
2054         if ( wxSocketBase::IsInitialized() ) 
2055             wxSocketBase::Shutdown(); 
2059     DECLARE_DYNAMIC_CLASS(wxSocketModule
) 
2062 IMPLEMENT_DYNAMIC_CLASS(wxSocketModule
, wxModule
) 
2064 #if defined(wxUSE_SELECT_DISPATCHER) && wxUSE_SELECT_DISPATCHER 
2065 // NOTE: we need to force linking against socketiohandler.cpp otherwise in 
2066 //       static builds of wxWidgets the ManagerSetter::ManagerSetter ctor 
2067 //       contained there wouldn't be ever called 
2068 wxFORCE_LINK_MODULE( socketiohandler 
) 
2071 #endif // wxUSE_SOCKETS