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 m_socket
->m_impl
->ReenableEvents(wxSOCKET_INPUT_FLAG
);
220 wxSocketBase
* const m_socket
;
222 wxDECLARE_NO_COPY_CLASS(wxSocketReadGuard
);
225 class wxSocketWriteGuard
228 wxSocketWriteGuard(wxSocketBase
*socket
)
231 wxASSERT_MSG( !m_socket
->m_writing
, "write reentrancy?" );
233 m_socket
->m_writing
= true;
235 m_socket
->m_impl
->ReenableEvents(wxSOCKET_OUTPUT_FLAG
);
238 ~wxSocketWriteGuard()
240 m_socket
->m_writing
= false;
244 wxSocketBase
* const m_socket
;
246 wxDECLARE_NO_COPY_CLASS(wxSocketWriteGuard
);
249 // ============================================================================
251 // ============================================================================
253 wxSocketManager
*wxSocketManager::ms_manager
= NULL
;
256 void wxSocketManager::Set(wxSocketManager
*manager
)
258 wxASSERT_MSG( !ms_manager
, "too late to set manager now" );
260 ms_manager
= manager
;
264 void wxSocketManager::Init()
266 wxASSERT_MSG( !ms_manager
, "shouldn't be initialized twice" );
269 Details: Initialize() creates a hidden window as a sink for socket
270 events, such as 'read completed'. wxMSW has only one message loop
271 for the main thread. If Initialize is called in a secondary thread,
272 the socket window will be created for the secondary thread, but
273 since there is no message loop on this thread, it will never
274 receive events and all socket operations will time out.
275 BTW, the main thread must not be stopped using sleep or block
276 on a semaphore (a bad idea in any case) or socket operations
279 On the Mac side, Initialize() stores a pointer to the CFRunLoop for
280 the main thread. Because secondary threads do not have run loops,
281 adding event notifications to the "Current" loop would have no
282 effect at all, events would never fire.
284 wxASSERT_MSG( wxIsMainThread(),
285 "sockets must be initialized from the main thread" );
287 wxAppConsole
* const app
= wxAppConsole::GetInstance();
288 wxCHECK_RET( app
, "sockets can't be initialized without wxApp" );
290 ms_manager
= app
->GetTraits()->GetSocketManager();
293 // ==========================================================================
295 // ==========================================================================
297 wxSocketImpl::wxSocketImpl(wxSocketBase
& wxsocket
)
298 : m_wxsocket(&wxsocket
)
300 m_fd
= INVALID_SOCKET
;
301 m_error
= wxSOCKET_NOERROR
;
305 SetTimeout(wxsocket
.GetTimeout() * 1000);
307 m_establishing
= false;
311 m_initialRecvBufferSize
= -1;
312 m_initialSendBufferSize
= -1;
315 wxSocketImpl::~wxSocketImpl()
317 if ( m_fd
!= INVALID_SOCKET
)
321 bool wxSocketImpl::PreCreateCheck(const wxSockAddressImpl
& addr
)
323 if ( m_fd
!= INVALID_SOCKET
)
325 m_error
= wxSOCKET_INVSOCK
;
331 m_error
= wxSOCKET_INVADDR
;
338 void wxSocketImpl::PostCreation()
340 // FreeBSD variants can't use MSG_NOSIGNAL, and instead use a socket option
342 EnableSocketOption(SO_NOSIGPIPE
);
346 EnableSocketOption(SO_REUSEADDR
);
350 wxASSERT_MSG( !m_stream
, "broadcasting is for datagram sockets only" );
352 EnableSocketOption(SO_BROADCAST
);
355 if ( m_initialRecvBufferSize
>= 0 )
356 SetSocketOption(SO_RCVBUF
, m_initialRecvBufferSize
);
357 if ( m_initialSendBufferSize
>= 0 )
358 SetSocketOption(SO_SNDBUF
, m_initialSendBufferSize
);
360 // we always put our sockets in unblocked mode and handle blocking
361 // ourselves in DoRead/Write() if wxSOCKET_WAITALL is specified
362 UnblockAndRegisterWithEventLoop();
365 wxSocketError
wxSocketImpl::UpdateLocalAddress()
367 WX_SOCKLEN_T lenAddr
= m_local
.GetLen();
368 if ( getsockname(m_fd
, m_local
.GetWritableAddr(), &lenAddr
) != 0 )
371 m_error
= wxSOCKET_IOERR
;
375 return wxSOCKET_NOERROR
;
378 wxSocketError
wxSocketImpl::CreateServer()
380 if ( !PreCreateCheck(m_local
) )
386 // do create the socket
387 m_fd
= socket(m_local
.GetFamily(), SOCK_STREAM
, 0);
389 if ( m_fd
== INVALID_SOCKET
)
391 m_error
= wxSOCKET_IOERR
;
392 return wxSOCKET_IOERR
;
397 // and then bind to and listen on it
399 // FIXME: should we test for m_dobind here?
400 if ( bind(m_fd
, m_local
.GetAddr(), m_local
.GetLen()) != 0 )
401 m_error
= wxSOCKET_IOERR
;
405 if ( listen(m_fd
, 5) != 0 )
406 m_error
= wxSOCKET_IOERR
;
415 // finally retrieve the address we effectively bound to
416 return UpdateLocalAddress();
419 wxSocketError
wxSocketImpl::CreateClient(bool wait
)
421 if ( !PreCreateCheck(m_peer
) )
424 m_fd
= socket(m_peer
.GetFamily(), SOCK_STREAM
, 0);
426 if ( m_fd
== INVALID_SOCKET
)
428 m_error
= wxSOCKET_IOERR
;
429 return wxSOCKET_IOERR
;
434 // If a local address has been set, then bind to it before calling connect
435 if ( m_local
.IsOk() )
437 if ( bind(m_fd
, m_local
.GetAddr(), m_local
.GetLen()) != 0 )
440 m_error
= wxSOCKET_IOERR
;
446 int rc
= connect(m_fd
, m_peer
.GetAddr(), m_peer
.GetLen());
447 if ( rc
== SOCKET_ERROR
)
449 wxSocketError err
= GetLastError();
450 if ( err
== wxSOCKET_WOULDBLOCK
)
452 m_establishing
= true;
454 // block waiting for connection if we should (otherwise just return
455 // wxSOCKET_WOULDBLOCK to the caller)
458 err
= SelectWithTimeout(wxSOCKET_CONNECTION_FLAG
)
461 m_establishing
= false;
469 m_error
= wxSOCKET_NOERROR
;
476 wxSocketError
wxSocketImpl::CreateUDP()
478 if ( !PreCreateCheck(m_local
) )
484 m_fd
= socket(m_local
.GetFamily(), SOCK_DGRAM
, 0);
486 if ( m_fd
== INVALID_SOCKET
)
488 m_error
= wxSOCKET_IOERR
;
489 return wxSOCKET_IOERR
;
496 if ( bind(m_fd
, m_local
.GetAddr(), m_local
.GetLen()) != 0 )
499 m_error
= wxSOCKET_IOERR
;
503 return UpdateLocalAddress();
506 return wxSOCKET_NOERROR
;
509 wxSocketImpl
*wxSocketImpl::Accept(wxSocketBase
& wxsocket
)
511 wxSockAddressStorage from
;
512 WX_SOCKLEN_T fromlen
= sizeof(from
);
513 const SOCKET fd
= accept(m_fd
, &from
.addr
, &fromlen
);
515 // accepting is similar to reading in the sense that it resets "ready for
516 // read" flag on the socket
517 ReenableEvents(wxSOCKET_INPUT_FLAG
);
519 if ( fd
== INVALID_SOCKET
)
522 wxSocketImpl
* const sock
= Create(wxsocket
);
524 sock
->m_peer
= wxSockAddressImpl(from
.addr
, fromlen
);
526 sock
->UnblockAndRegisterWithEventLoop();
532 void wxSocketImpl::Close()
534 if ( m_fd
!= INVALID_SOCKET
)
537 m_fd
= INVALID_SOCKET
;
541 void wxSocketImpl::Shutdown()
543 if ( m_fd
!= INVALID_SOCKET
)
545 shutdown(m_fd
, 1 /* SD_SEND */);
551 * Sets the timeout for blocking calls. Time is expressed in
554 void wxSocketImpl::SetTimeout(unsigned long millis
)
556 SetTimeValFromMS(m_timeout
, millis
);
559 void wxSocketImpl::NotifyOnStateChange(wxSocketNotify event
)
561 m_wxsocket
->OnRequest(event
);
564 /* Address handling */
565 wxSocketError
wxSocketImpl::SetLocal(const wxSockAddressImpl
& local
)
567 /* the socket must be initialized, or it must be a server */
568 if (m_fd
!= INVALID_SOCKET
&& !m_server
)
570 m_error
= wxSOCKET_INVSOCK
;
571 return wxSOCKET_INVSOCK
;
576 m_error
= wxSOCKET_INVADDR
;
577 return wxSOCKET_INVADDR
;
582 return wxSOCKET_NOERROR
;
585 wxSocketError
wxSocketImpl::SetPeer(const wxSockAddressImpl
& peer
)
589 m_error
= wxSOCKET_INVADDR
;
590 return wxSOCKET_INVADDR
;
595 return wxSOCKET_NOERROR
;
598 const wxSockAddressImpl
& wxSocketImpl::GetLocal()
600 if ( !m_local
.IsOk() )
601 UpdateLocalAddress();
606 // ----------------------------------------------------------------------------
608 // ----------------------------------------------------------------------------
610 // this macro wraps the given expression (normally a syscall) in a loop which
611 // ignores any interruptions, i.e. reevaluates it again if it failed and errno
614 #define DO_WHILE_EINTR( rc, syscall ) \
618 while ( rc == -1 && errno == EINTR )
620 #define DO_WHILE_EINTR( rc, syscall ) rc = (syscall)
623 int wxSocketImpl::RecvStream(void *buffer
, int size
)
626 DO_WHILE_EINTR( ret
, recv(m_fd
, static_cast<char *>(buffer
), size
, 0) );
630 // receiving 0 bytes for a TCP socket indicates that the connection was
631 // closed by peer so shut down our end as well (for UDP sockets empty
632 // datagrams are also possible)
633 m_establishing
= false;
634 NotifyOnStateChange(wxSOCKET_LOST
);
638 // do not return an error in this case however
644 int wxSocketImpl::SendStream(const void *buffer
, int size
)
646 #ifdef wxNEEDS_IGNORE_SIGPIPE
647 IgnoreSignal
ignore(SIGPIPE
);
651 DO_WHILE_EINTR( ret
, send(m_fd
, static_cast<const char *>(buffer
), size
,
652 wxSOCKET_MSG_NOSIGNAL
) );
657 int wxSocketImpl::RecvDgram(void *buffer
, int size
)
659 wxSockAddressStorage from
;
660 WX_SOCKLEN_T fromlen
= sizeof(from
);
663 DO_WHILE_EINTR( ret
, recvfrom(m_fd
, static_cast<char *>(buffer
), size
,
664 0, &from
.addr
, &fromlen
) );
666 if ( ret
== SOCKET_ERROR
)
669 m_peer
= wxSockAddressImpl(from
.addr
, fromlen
);
670 if ( !m_peer
.IsOk() )
676 int wxSocketImpl::SendDgram(const void *buffer
, int size
)
678 if ( !m_peer
.IsOk() )
680 m_error
= wxSOCKET_INVADDR
;
685 DO_WHILE_EINTR( ret
, sendto(m_fd
, static_cast<const char *>(buffer
), size
,
686 0, m_peer
.GetAddr(), m_peer
.GetLen()) );
691 int wxSocketImpl::Read(void *buffer
, int size
)
693 // server sockets can't be used for IO, only to accept new connections
694 if ( m_fd
== INVALID_SOCKET
|| m_server
)
696 m_error
= wxSOCKET_INVSOCK
;
700 int ret
= m_stream
? RecvStream(buffer
, size
)
701 : RecvDgram(buffer
, size
);
703 m_error
= ret
== SOCKET_ERROR
? GetLastError() : wxSOCKET_NOERROR
;
708 int wxSocketImpl::Write(const void *buffer
, int size
)
710 if ( m_fd
== INVALID_SOCKET
|| m_server
)
712 m_error
= wxSOCKET_INVSOCK
;
716 int ret
= m_stream
? SendStream(buffer
, size
)
717 : SendDgram(buffer
, size
);
719 m_error
= ret
== SOCKET_ERROR
? GetLastError() : wxSOCKET_NOERROR
;
724 // ==========================================================================
726 // ==========================================================================
728 // --------------------------------------------------------------------------
729 // Initialization and shutdown
730 // --------------------------------------------------------------------------
732 // FIXME-MT: all this is MT-unsafe, of course, we should protect all accesses
733 // to m_countInit with a crit section
734 size_t wxSocketBase::m_countInit
= 0;
736 bool wxSocketBase::IsInitialized()
738 return m_countInit
> 0;
741 bool wxSocketBase::Initialize()
743 if ( !m_countInit
++ )
745 wxSocketManager
* const manager
= wxSocketManager::Get();
746 if ( !manager
|| !manager
->OnInit() )
757 void wxSocketBase::Shutdown()
759 // we should be initialized
760 wxASSERT_MSG( m_countInit
> 0, _T("extra call to Shutdown()") );
761 if ( --m_countInit
== 0 )
763 wxSocketManager
* const manager
= wxSocketManager::Get();
764 wxCHECK_RET( manager
, "should have a socket manager" );
770 // --------------------------------------------------------------------------
772 // --------------------------------------------------------------------------
774 void wxSocketBase::Init()
777 m_type
= wxSOCKET_UNINIT
;
788 m_beingDeleted
= false;
803 if ( !IsInitialized() )
805 // this Initialize() will be undone by wxSocketModule::OnExit(), all
806 // the other calls to it should be matched by a call to Shutdown()
808 wxLogError("Cannot initialize wxSocketBase");
812 wxSocketBase::wxSocketBase()
817 wxSocketBase::wxSocketBase(wxSocketFlags flags
, wxSocketType type
)
826 wxSocketBase::~wxSocketBase()
828 // Just in case the app called Destroy() *and* then deleted the socket
829 // immediately: don't leave dangling pointers.
830 wxAppTraits
*traits
= wxTheApp
? wxTheApp
->GetTraits() : NULL
;
832 traits
->RemoveFromPendingDelete(this);
834 // Shutdown and close the socket
838 // Destroy the implementation object
841 // Free the pushback buffer
846 bool wxSocketBase::Destroy()
848 // Delayed destruction: the socket will be deleted during the next idle
849 // loop iteration. This ensures that all pending events have been
851 m_beingDeleted
= true;
853 // Shutdown and close the socket
856 // Suppress events from now on
859 // schedule this object for deletion
860 wxAppTraits
*traits
= wxTheApp
? wxTheApp
->GetTraits() : NULL
;
863 // let the traits object decide what to do with us
864 traits
->ScheduleForDestroy(this);
866 else // no app or no traits
868 // in wxBase we might have no app object at all, don't leak memory
875 // ----------------------------------------------------------------------------
877 // ----------------------------------------------------------------------------
879 void wxSocketBase::SetError(wxSocketError error
)
881 m_impl
->m_error
= error
;
884 wxSocketError
wxSocketBase::LastError() const
886 return m_impl
->GetError();
889 // --------------------------------------------------------------------------
891 // --------------------------------------------------------------------------
893 // The following IO operations update m_lcount:
894 // {Read, Write, ReadMsg, WriteMsg, Peek, Unread, Discard}
895 bool wxSocketBase::Close()
897 // Interrupt pending waits
903 m_establishing
= false;
907 void wxSocketBase::ShutdownOutput()
913 wxSocketBase
& wxSocketBase::Read(void* buffer
, wxUint32 nbytes
)
915 wxSocketReadGuard
read(this);
917 m_lcount
= DoRead(buffer
, nbytes
);
922 wxUint32
wxSocketBase::DoRead(void* buffer_
, wxUint32 nbytes
)
924 wxCHECK_MSG( m_impl
, 0, "socket must be valid" );
926 // We use pointer arithmetic here which doesn't work with void pointers.
927 char *buffer
= static_cast<char *>(buffer_
);
928 wxCHECK_MSG( buffer
, 0, "NULL buffer" );
930 // Try the push back buffer first, even before checking whether the socket
931 // is valid to allow reading previously pushed back data from an already
933 wxUint32 total
= GetPushback(buffer
, nbytes
, false);
939 // our socket is non-blocking so Read() will return immediately if
940 // there is nothing to read yet and it's more efficient to try it first
941 // before entering DoWait() which is going to start dispatching GUI
942 // events and, even more importantly, we must do this under Windows
943 // where we're not going to get notifications about socket being ready
944 // for reading before we read all the existing data from it
945 const int ret
= m_connected
? m_impl
->Read(buffer
, nbytes
) : 0;
948 if ( m_impl
->GetLastError() == wxSOCKET_WOULDBLOCK
)
950 // if we don't want to wait, just return immediately
951 if ( m_flags
& wxSOCKET_NOWAIT
)
954 // otherwise wait until the socket becomes ready for reading or
955 // an error occurs on it
956 if ( !DoWaitWithTimeout(wxSOCKET_INPUT_FLAG
) )
958 // and exit if the timeout elapsed before it did
959 SetError(wxSOCKET_TIMEDOUT
);
968 SetError(wxSOCKET_IOERR
);
974 // for connection-oriented (e.g. TCP) sockets we can only read
975 // 0 bytes if the other end has been closed, and for connectionless
976 // ones (UDP) this flag doesn't make sense anyhow so we can set it
977 // to true too without doing any harm
980 // we're not going to read anything else and so if we haven't read
981 // anything (or not everything in wxSOCKET_WAITALL case) already,
983 if ( (m_flags
& wxSOCKET_WAITALL
) || !total
)
984 SetError(wxSOCKET_IOERR
);
990 // if we are happy to read something and not the entire nbytes bytes,
992 if ( !(m_flags
& wxSOCKET_WAITALL
) )
1002 wxSocketBase
& wxSocketBase::ReadMsg(void* buffer
, wxUint32 nbytes
)
1006 unsigned char sig
[4];
1007 unsigned char len
[4];
1010 wxSocketReadGuard
read(this);
1012 wxSocketWaitModeChanger
changeFlags(this, wxSOCKET_WAITALL
);
1015 if ( DoRead(&msg
, sizeof(msg
)) == sizeof(msg
) )
1017 wxUint32 sig
= (wxUint32
)msg
.sig
[0];
1018 sig
|= (wxUint32
)(msg
.sig
[1] << 8);
1019 sig
|= (wxUint32
)(msg
.sig
[2] << 16);
1020 sig
|= (wxUint32
)(msg
.sig
[3] << 24);
1022 if ( sig
== 0xfeeddead )
1024 wxUint32 len
= (wxUint32
)msg
.len
[0];
1025 len
|= (wxUint32
)(msg
.len
[1] << 8);
1026 len
|= (wxUint32
)(msg
.len
[2] << 16);
1027 len
|= (wxUint32
)(msg
.len
[3] << 24);
1032 len2
= len
- nbytes
;
1038 // Don't attempt to read if the msg was zero bytes long.
1039 m_lcount
= len
? DoRead(buffer
, len
) : 0;
1043 char discard_buffer
[MAX_DISCARD_SIZE
];
1046 // NOTE: discarded bytes don't add to m_lcount.
1049 discard_len
= len2
> MAX_DISCARD_SIZE
1052 discard_len
= DoRead(discard_buffer
, (wxUint32
)discard_len
);
1053 len2
-= (wxUint32
)discard_len
;
1055 while ((discard_len
> 0) && len2
);
1058 if ( !len2
&& DoRead(&msg
, sizeof(msg
)) == sizeof(msg
) )
1060 sig
= (wxUint32
)msg
.sig
[0];
1061 sig
|= (wxUint32
)(msg
.sig
[1] << 8);
1062 sig
|= (wxUint32
)(msg
.sig
[2] << 16);
1063 sig
|= (wxUint32
)(msg
.sig
[3] << 24);
1065 if ( sig
== 0xdeadfeed )
1072 SetError(wxSOCKET_IOERR
);
1077 wxSocketBase
& wxSocketBase::Peek(void* buffer
, wxUint32 nbytes
)
1079 wxSocketReadGuard
read(this);
1081 m_lcount
= DoRead(buffer
, nbytes
);
1083 Pushback(buffer
, m_lcount
);
1088 wxSocketBase
& wxSocketBase::Write(const void *buffer
, wxUint32 nbytes
)
1090 wxSocketWriteGuard
write(this);
1092 m_lcount
= DoWrite(buffer
, nbytes
);
1097 // This function is a mirror image of DoRead() except that it doesn't use the
1098 // push back buffer and doesn't treat 0 return value specially (normally this
1099 // shouldn't happen at all here), so please see comments there for explanations
1100 wxUint32
wxSocketBase::DoWrite(const void *buffer_
, wxUint32 nbytes
)
1102 wxCHECK_MSG( m_impl
, 0, "socket must be valid" );
1104 const char *buffer
= static_cast<const char *>(buffer_
);
1105 wxCHECK_MSG( buffer
, 0, "NULL buffer" );
1112 if ( (m_flags
& wxSOCKET_WAITALL
) || !total
)
1113 SetError(wxSOCKET_IOERR
);
1117 const int ret
= m_impl
->Write(buffer
, nbytes
);
1120 if ( m_impl
->GetLastError() == wxSOCKET_WOULDBLOCK
)
1122 if ( m_flags
& wxSOCKET_NOWAIT
)
1125 if ( !DoWaitWithTimeout(wxSOCKET_OUTPUT_FLAG
) )
1127 SetError(wxSOCKET_TIMEDOUT
);
1133 else // "real" error
1135 SetError(wxSOCKET_IOERR
);
1142 if ( !(m_flags
& wxSOCKET_WAITALL
) )
1152 wxSocketBase
& wxSocketBase::WriteMsg(const void *buffer
, wxUint32 nbytes
)
1156 unsigned char sig
[4];
1157 unsigned char len
[4];
1160 wxSocketWriteGuard
write(this);
1162 wxSocketWaitModeChanger
changeFlags(this, wxSOCKET_WAITALL
);
1164 msg
.sig
[0] = (unsigned char) 0xad;
1165 msg
.sig
[1] = (unsigned char) 0xde;
1166 msg
.sig
[2] = (unsigned char) 0xed;
1167 msg
.sig
[3] = (unsigned char) 0xfe;
1169 msg
.len
[0] = (unsigned char) (nbytes
& 0xff);
1170 msg
.len
[1] = (unsigned char) ((nbytes
>> 8) & 0xff);
1171 msg
.len
[2] = (unsigned char) ((nbytes
>> 16) & 0xff);
1172 msg
.len
[3] = (unsigned char) ((nbytes
>> 24) & 0xff);
1175 if ( DoWrite(&msg
, sizeof(msg
)) == sizeof(msg
) )
1177 m_lcount
= DoWrite(buffer
, nbytes
);
1178 if ( m_lcount
== nbytes
)
1180 msg
.sig
[0] = (unsigned char) 0xed;
1181 msg
.sig
[1] = (unsigned char) 0xfe;
1182 msg
.sig
[2] = (unsigned char) 0xad;
1183 msg
.sig
[3] = (unsigned char) 0xde;
1187 msg
.len
[3] = (char) 0;
1189 if ( DoWrite(&msg
, sizeof(msg
)) == sizeof(msg
))
1195 SetError(wxSOCKET_IOERR
);
1200 wxSocketBase
& wxSocketBase::Unread(const void *buffer
, wxUint32 nbytes
)
1203 Pushback(buffer
, nbytes
);
1205 SetError(wxSOCKET_NOERROR
);
1211 wxSocketBase
& wxSocketBase::Discard()
1213 char *buffer
= new char[MAX_DISCARD_SIZE
];
1217 wxSocketReadGuard
read(this);
1219 wxSocketWaitModeChanger
changeFlags(this, wxSOCKET_NOWAIT
);
1223 ret
= DoRead(buffer
, MAX_DISCARD_SIZE
);
1226 while (ret
== MAX_DISCARD_SIZE
);
1230 SetError(wxSOCKET_NOERROR
);
1235 // --------------------------------------------------------------------------
1237 // --------------------------------------------------------------------------
1240 This function will check for the events specified in the flags parameter,
1241 and it will return a mask indicating which operations can be performed.
1243 wxSocketEventFlags
wxSocketImpl::Select(wxSocketEventFlags flags
,
1244 const timeval
*timeout
)
1246 if ( m_fd
== INVALID_SOCKET
)
1247 return (wxSOCKET_LOST_FLAG
& flags
);
1253 tv
.tv_sec
= tv
.tv_usec
= 0;
1255 // prepare the FD sets, passing NULL for the one(s) we don't use
1257 readfds
, *preadfds
= NULL
,
1258 writefds
, *pwritefds
= NULL
,
1259 exceptfds
; // always want to know about errors
1261 if ( flags
& wxSOCKET_INPUT_FLAG
)
1263 preadfds
= &readfds
;
1264 wxFD_ZERO(preadfds
);
1265 wxFD_SET(m_fd
, preadfds
);
1268 // when using non-blocking connect() the socket becomes connected
1269 // (successfully or not) when it becomes writable
1270 if ( flags
& (wxSOCKET_OUTPUT_FLAG
| wxSOCKET_CONNECTION_FLAG
) )
1272 pwritefds
= &writefds
;
1273 wxFD_ZERO(pwritefds
);
1274 wxFD_SET(m_fd
, pwritefds
);
1277 wxFD_ZERO(&exceptfds
);
1278 wxFD_SET(m_fd
, &exceptfds
);
1280 const int rc
= select(m_fd
+ 1, preadfds
, pwritefds
, &exceptfds
, &tv
);
1282 // check for errors first
1283 if ( rc
== -1 || wxFD_ISSET(m_fd
, &exceptfds
) )
1285 m_establishing
= false;
1287 return wxSOCKET_LOST_FLAG
& flags
;
1293 wxASSERT_MSG( rc
== 1, "unexpected select() return value" );
1295 wxSocketEventFlags detected
= 0;
1296 if ( preadfds
&& wxFD_ISSET(m_fd
, preadfds
) )
1297 detected
|= wxSOCKET_INPUT_FLAG
;
1299 if ( pwritefds
&& wxFD_ISSET(m_fd
, pwritefds
) )
1301 // check for the case of non-blocking connect()
1302 if ( m_establishing
&& !m_server
)
1305 SOCKOPTLEN_T len
= sizeof(error
);
1306 m_establishing
= false;
1307 getsockopt(m_fd
, SOL_SOCKET
, SO_ERROR
, (char*)&error
, &len
);
1310 detected
= wxSOCKET_LOST_FLAG
;
1312 detected
|= wxSOCKET_CONNECTION_FLAG
;
1314 else // not called to get non-blocking connect() status
1316 detected
|= wxSOCKET_OUTPUT_FLAG
;
1320 return detected
& flags
;
1324 wxSocketBase::DoWait(long seconds
, long milliseconds
, wxSocketEventFlags flags
)
1326 // Use either the provided timeout or the default timeout value associated
1327 // with this socket.
1329 // TODO: allow waiting forever, see #9443
1330 const long timeout
= seconds
== -1 ? m_timeout
* 1000
1331 : seconds
* 1000 + milliseconds
;
1333 return DoWait(timeout
, flags
);
1337 wxSocketBase::DoWait(long timeout
, wxSocketEventFlags flags
)
1339 wxCHECK_MSG( m_impl
, -1, "can't wait on invalid socket" );
1341 // we're never going to become ready if we're not connected (any more)
1342 if ( !m_connected
&& !m_establishing
)
1345 // This can be set to true from Interrupt() to exit this function a.s.a.p.
1346 m_interrupt
= false;
1349 const wxMilliClock_t timeEnd
= wxGetLocalTimeMillis() + timeout
;
1351 // Get the active event loop which we'll use for the message dispatching
1352 // when running in the main thread unless this was explicitly disabled by
1353 // setting wxSOCKET_BLOCK flag
1354 wxEventLoopBase
*eventLoop
;
1355 if ( !(m_flags
& wxSOCKET_BLOCK
) && wxIsMainThread() )
1357 eventLoop
= wxEventLoop::GetActive();
1359 else // in worker thread
1361 // We never dispatch messages from threads other than the main one.
1365 // Make sure the events we're interested in are enabled before waiting for
1366 // them: this is really necessary here as otherwise this could happen:
1367 // 1. DoRead(wxSOCKET_WAITALL) is called
1368 // 2. There is nothing to read so DoWait(wxSOCKET_INPUT_FLAG) is called
1369 // 3. Some, but not all data appears, wxSocketImplUnix::OnReadWaiting()
1370 // is called and wxSOCKET_INPUT_FLAG events are disabled in it
1371 // 4. Because of wxSOCKET_WAITALL we call DoWait() again but the events
1372 // are still disabled and we block forever
1374 // More elegant solution would be nice but for now simply re-enabling the
1375 // events here will do
1376 m_impl
->ReenableEvents(flags
& (wxSOCKET_INPUT_FLAG
| wxSOCKET_OUTPUT_FLAG
));
1379 // Wait until we receive the event we're waiting for or the timeout expires
1380 // (but note that we always execute the loop at least once, even if timeout
1381 // is 0 as this is used for polling)
1383 for ( bool firstTime
= true; !m_interrupt
; firstTime
= false )
1385 long timeLeft
= wxMilliClockToLong(timeEnd
- wxGetLocalTimeMillis());
1394 wxSocketEventFlags events
;
1397 // reset them before starting to wait
1400 eventLoop
->DispatchTimeout(timeLeft
);
1402 events
= m_eventsgot
;
1404 else // no event loop or waiting in another thread
1406 // as explained below, we should always check for wxSOCKET_LOST_FLAG
1408 SetTimeValFromMS(tv
, timeLeft
);
1409 events
= m_impl
->Select(flags
| wxSOCKET_LOST_FLAG
, &tv
);
1412 // always check for wxSOCKET_LOST_FLAG, even if flags doesn't include
1413 // it, as continuing to wait for anything else after getting it is
1415 if ( events
& wxSOCKET_LOST_FLAG
)
1417 m_connected
= false;
1418 m_establishing
= false;
1423 // otherwise mask out the bits we're not interested in
1426 // Incoming connection (server) or connection established (client)?
1427 if ( events
& wxSOCKET_CONNECTION_FLAG
)
1430 m_establishing
= false;
1435 // Data available or output buffer ready?
1436 if ( (events
& wxSOCKET_INPUT_FLAG
) || (events
& wxSOCKET_OUTPUT_FLAG
) )
1446 bool wxSocketBase::Wait(long seconds
, long milliseconds
)
1448 return DoWait(seconds
, milliseconds
,
1449 wxSOCKET_INPUT_FLAG
|
1450 wxSOCKET_OUTPUT_FLAG
|
1451 wxSOCKET_CONNECTION_FLAG
) != 0;
1454 bool wxSocketBase::WaitForRead(long seconds
, long milliseconds
)
1456 // Check pushback buffer before entering DoWait
1460 // Check if the socket is not already ready for input, if it is, there is
1461 // no need to start waiting for it (worse, we'll actually never get a
1462 // notification about the socket becoming ready if it is already under
1464 if ( m_impl
->Select(wxSOCKET_INPUT_FLAG
) )
1467 return DoWait(seconds
, milliseconds
, wxSOCKET_INPUT_FLAG
) != 0;
1471 bool wxSocketBase::WaitForWrite(long seconds
, long milliseconds
)
1473 if ( m_impl
->Select(wxSOCKET_OUTPUT_FLAG
) )
1476 return DoWait(seconds
, milliseconds
, wxSOCKET_OUTPUT_FLAG
) != 0;
1479 bool wxSocketBase::WaitForLost(long seconds
, long milliseconds
)
1481 return DoWait(seconds
, milliseconds
, wxSOCKET_LOST_FLAG
) == -1;
1484 // --------------------------------------------------------------------------
1486 // --------------------------------------------------------------------------
1489 // Get local or peer address
1492 bool wxSocketBase::GetPeer(wxSockAddress
& addr
) const
1494 wxCHECK_MSG( m_impl
, false, "invalid socket" );
1496 const wxSockAddressImpl
& peer
= m_impl
->GetPeer();
1500 addr
.SetAddress(peer
);
1505 bool wxSocketBase::GetLocal(wxSockAddress
& addr
) const
1507 wxCHECK_MSG( m_impl
, false, "invalid socket" );
1509 const wxSockAddressImpl
& local
= m_impl
->GetLocal();
1510 if ( !local
.IsOk() )
1513 addr
.SetAddress(local
);
1519 // Save and restore socket state
1522 void wxSocketBase::SaveState()
1524 wxSocketState
*state
;
1526 state
= new wxSocketState();
1528 state
->m_flags
= m_flags
;
1529 state
->m_notify
= m_notify
;
1530 state
->m_eventmask
= m_eventmask
;
1531 state
->m_clientData
= m_clientData
;
1533 m_states
.Append(state
);
1536 void wxSocketBase::RestoreState()
1538 wxList::compatibility_iterator node
;
1539 wxSocketState
*state
;
1541 node
= m_states
.GetLast();
1545 state
= (wxSocketState
*)node
->GetData();
1547 m_flags
= state
->m_flags
;
1548 m_notify
= state
->m_notify
;
1549 m_eventmask
= state
->m_eventmask
;
1550 m_clientData
= state
->m_clientData
;
1552 m_states
.Erase(node
);
1557 // Timeout and flags
1560 void wxSocketBase::SetTimeout(long seconds
)
1562 m_timeout
= seconds
;
1565 m_impl
->SetTimeout(m_timeout
* 1000);
1568 void wxSocketBase::SetFlags(wxSocketFlags flags
)
1570 // Do some sanity checking on the flags used: not all values can be used
1572 wxASSERT_MSG( !(flags
& wxSOCKET_NOWAIT
) ||
1573 !(flags
& (wxSOCKET_WAITALL
| wxSOCKET_BLOCK
)),
1574 "Using wxSOCKET_WAITALL or wxSOCKET_BLOCK with "
1575 "wxSOCKET_NOWAIT doesn't make sense" );
1581 // --------------------------------------------------------------------------
1583 // --------------------------------------------------------------------------
1585 void wxSocketBase::OnRequest(wxSocketNotify notification
)
1587 wxSocketEventFlags flag
= 0;
1588 switch ( notification
)
1590 case wxSOCKET_INPUT
:
1591 flag
= wxSOCKET_INPUT_FLAG
;
1594 case wxSOCKET_OUTPUT
:
1595 flag
= wxSOCKET_OUTPUT_FLAG
;
1598 case wxSOCKET_CONNECTION
:
1599 flag
= wxSOCKET_CONNECTION_FLAG
;
1603 flag
= wxSOCKET_LOST_FLAG
;
1607 wxFAIL_MSG( "unknown wxSocket notification" );
1610 // if we lost the connection the socket is now closed
1611 if ( notification
== wxSOCKET_LOST
)
1614 // remember the events which were generated for this socket, we're going to
1615 // use this in DoWait()
1616 m_eventsgot
|= flag
;
1618 // send the wx event if enabled and we're interested in it
1619 if ( m_notify
&& (m_eventmask
& flag
) && m_handler
)
1621 // don't generate the events when we're inside DoWait() called from our
1622 // own code as we are going to consume the data that has just become
1623 // available ourselves and the user code won't see it at all
1624 if ( (notification
== wxSOCKET_INPUT
&& m_reading
) ||
1625 (notification
== wxSOCKET_OUTPUT
&& m_writing
) )
1630 wxSocketEvent
event(m_id
);
1631 event
.m_event
= notification
;
1632 event
.m_clientData
= m_clientData
;
1633 event
.SetEventObject(this);
1635 m_handler
->AddPendingEvent(event
);
1639 void wxSocketBase::Notify(bool notify
)
1644 void wxSocketBase::SetNotify(wxSocketEventFlags flags
)
1646 m_eventmask
= flags
;
1649 void wxSocketBase::SetEventHandler(wxEvtHandler
& handler
, int id
)
1651 m_handler
= &handler
;
1655 // --------------------------------------------------------------------------
1657 // --------------------------------------------------------------------------
1659 void wxSocketBase::Pushback(const void *buffer
, wxUint32 size
)
1663 if (m_unread
== NULL
)
1664 m_unread
= malloc(size
);
1669 tmp
= malloc(m_unrd_size
+ size
);
1670 memcpy((char *)tmp
+ size
, m_unread
, m_unrd_size
);
1676 m_unrd_size
+= size
;
1678 memcpy(m_unread
, buffer
, size
);
1681 wxUint32
wxSocketBase::GetPushback(void *buffer
, wxUint32 size
, bool peek
)
1683 wxCHECK_MSG( buffer
, 0, "NULL buffer" );
1688 if (size
> (m_unrd_size
-m_unrd_cur
))
1689 size
= m_unrd_size
-m_unrd_cur
;
1691 memcpy(buffer
, (char *)m_unread
+ m_unrd_cur
, size
);
1696 if (m_unrd_size
== m_unrd_cur
)
1709 // ==========================================================================
1711 // ==========================================================================
1713 // --------------------------------------------------------------------------
1715 // --------------------------------------------------------------------------
1717 wxSocketServer::wxSocketServer(const wxSockAddress
& addr
,
1718 wxSocketFlags flags
)
1719 : wxSocketBase(flags
, wxSOCKET_SERVER
)
1721 wxLogTrace( wxTRACE_Socket
, _T("Opening wxSocketServer") );
1723 m_impl
= wxSocketImpl::Create(*this);
1727 wxLogTrace( wxTRACE_Socket
, _T("*** Failed to create m_impl") );
1731 // Setup the socket as server
1732 m_impl
->SetLocal(addr
.GetAddress());
1734 if (GetFlags() & wxSOCKET_REUSEADDR
) {
1735 m_impl
->SetReusable();
1737 if (GetFlags() & wxSOCKET_BROADCAST
) {
1738 m_impl
->SetBroadcast();
1740 if (GetFlags() & wxSOCKET_NOBIND
) {
1741 m_impl
->DontDoBind();
1744 if (m_impl
->CreateServer() != wxSOCKET_NOERROR
)
1749 wxLogTrace( wxTRACE_Socket
, _T("*** CreateServer() failed") );
1753 wxLogTrace( wxTRACE_Socket
, _T("wxSocketServer on fd %d"), m_impl
->m_fd
);
1756 // --------------------------------------------------------------------------
1758 // --------------------------------------------------------------------------
1760 bool wxSocketServer::AcceptWith(wxSocketBase
& sock
, bool wait
)
1762 if ( !m_impl
|| (m_impl
->m_fd
== INVALID_SOCKET
) || !m_impl
->IsServer() )
1764 wxFAIL_MSG( "can only be called for a valid server socket" );
1766 SetError(wxSOCKET_INVSOCK
);
1773 // wait until we get a connection
1774 if ( !m_impl
->SelectWithTimeout(wxSOCKET_INPUT_FLAG
) )
1776 SetError(wxSOCKET_TIMEDOUT
);
1782 sock
.m_impl
= m_impl
->Accept(sock
);
1786 SetError(m_impl
->GetLastError());
1791 sock
.m_type
= wxSOCKET_BASE
;
1792 sock
.m_connected
= true;
1797 wxSocketBase
*wxSocketServer::Accept(bool wait
)
1799 wxSocketBase
* sock
= new wxSocketBase();
1801 sock
->SetFlags(m_flags
);
1803 if (!AcceptWith(*sock
, wait
))
1812 bool wxSocketServer::WaitForAccept(long seconds
, long milliseconds
)
1814 return DoWait(seconds
, milliseconds
, wxSOCKET_CONNECTION_FLAG
) == 1;
1817 bool wxSocketBase::GetOption(int level
, int optname
, void *optval
, int *optlen
)
1819 wxASSERT_MSG( m_impl
, _T("Socket not initialised") );
1821 SOCKOPTLEN_T lenreal
= *optlen
;
1822 if ( getsockopt(m_impl
->m_fd
, level
, optname
,
1823 static_cast<char *>(optval
), &lenreal
) != 0 )
1832 wxSocketBase::SetOption(int level
, int optname
, const void *optval
, int optlen
)
1834 wxASSERT_MSG( m_impl
, _T("Socket not initialised") );
1836 return setsockopt(m_impl
->m_fd
, level
, optname
,
1837 static_cast<const char *>(optval
), optlen
) == 0;
1840 bool wxSocketBase::SetLocal(const wxIPV4address
& local
)
1842 m_localAddress
= local
;
1847 // ==========================================================================
1849 // ==========================================================================
1851 // --------------------------------------------------------------------------
1853 // --------------------------------------------------------------------------
1855 wxSocketClient::wxSocketClient(wxSocketFlags flags
)
1856 : wxSocketBase(flags
, wxSOCKET_CLIENT
)
1858 m_initialRecvBufferSize
=
1859 m_initialSendBufferSize
= -1;
1862 // --------------------------------------------------------------------------
1864 // --------------------------------------------------------------------------
1866 bool wxSocketClient::DoConnect(const wxSockAddress
& remote
,
1867 const wxSockAddress
* local
,
1872 // Shutdown and destroy the old socket
1877 m_connected
= false;
1878 m_establishing
= false;
1880 // Create and set up the new one
1881 m_impl
= wxSocketImpl::Create(*this);
1885 // Reuse makes sense for clients too, if we are trying to rebind to the same port
1886 if (GetFlags() & wxSOCKET_REUSEADDR
)
1887 m_impl
->SetReusable();
1888 if (GetFlags() & wxSOCKET_BROADCAST
)
1889 m_impl
->SetBroadcast();
1890 if (GetFlags() & wxSOCKET_NOBIND
)
1891 m_impl
->DontDoBind();
1893 // Bind to the local IP address and port, when provided or if one had been
1895 if ( !local
&& m_localAddress
.GetAddress().IsOk() )
1896 local
= &m_localAddress
;
1899 m_impl
->SetLocal(local
->GetAddress());
1901 m_impl
->SetInitialSocketBuffers(m_initialRecvBufferSize
, m_initialSendBufferSize
);
1903 m_impl
->SetPeer(remote
.GetAddress());
1905 // Finally do create the socket and connect to the peer
1906 const wxSocketError err
= m_impl
->CreateClient(wait
);
1908 if ( err
!= wxSOCKET_NOERROR
)
1910 if ( err
== wxSOCKET_WOULDBLOCK
)
1912 wxASSERT_MSG( !wait
, "shouldn't get this for blocking connect" );
1914 m_establishing
= true;
1924 bool wxSocketClient::Connect(const wxSockAddress
& remote
, bool wait
)
1926 return DoConnect(remote
, NULL
, wait
);
1929 bool wxSocketClient::Connect(const wxSockAddress
& remote
,
1930 const wxSockAddress
& local
,
1933 return DoConnect(remote
, &local
, wait
);
1936 bool wxSocketClient::WaitOnConnect(long seconds
, long milliseconds
)
1940 // this happens if the initial attempt to connect succeeded without
1945 wxCHECK_MSG( m_establishing
&& m_impl
, false,
1946 "No connection establishment attempt in progress" );
1948 // notice that we return true even if DoWait() returned -1, i.e. if an
1949 // error occurred and connection was lost: this is intentional as we should
1950 // return false only if timeout expired without anything happening
1951 return DoWait(seconds
, milliseconds
, wxSOCKET_CONNECTION_FLAG
) != 0;
1954 // ==========================================================================
1956 // ==========================================================================
1958 wxDatagramSocket::wxDatagramSocket( const wxSockAddress
& addr
,
1959 wxSocketFlags flags
)
1960 : wxSocketBase( flags
, wxSOCKET_DATAGRAM
)
1962 // Create the socket
1963 m_impl
= wxSocketImpl::Create(*this);
1968 // Setup the socket as non connection oriented
1969 m_impl
->SetLocal(addr
.GetAddress());
1970 if (flags
& wxSOCKET_REUSEADDR
)
1972 m_impl
->SetReusable();
1974 if (GetFlags() & wxSOCKET_BROADCAST
)
1976 m_impl
->SetBroadcast();
1978 if (GetFlags() & wxSOCKET_NOBIND
)
1980 m_impl
->DontDoBind();
1983 if ( m_impl
->CreateUDP() != wxSOCKET_NOERROR
)
1990 // Initialize all stuff
1991 m_connected
= false;
1992 m_establishing
= false;
1995 wxDatagramSocket
& wxDatagramSocket::RecvFrom( wxSockAddress
& addr
,
2004 wxDatagramSocket
& wxDatagramSocket::SendTo( const wxSockAddress
& addr
,
2008 wxASSERT_MSG( m_impl
, _T("Socket not initialised") );
2010 m_impl
->SetPeer(addr
.GetAddress());
2015 // ==========================================================================
2017 // ==========================================================================
2019 class wxSocketModule
: public wxModule
2022 virtual bool OnInit()
2024 // wxSocketBase will call Initialize() itself only if sockets are
2025 // really used, don't do it from here
2029 virtual void OnExit()
2031 if ( wxSocketBase::IsInitialized() )
2032 wxSocketBase::Shutdown();
2036 DECLARE_DYNAMIC_CLASS(wxSocketModule
)
2039 IMPLEMENT_DYNAMIC_CLASS(wxSocketModule
, wxModule
)
2041 #if defined(wxUSE_SELECT_DISPATCHER) && wxUSE_SELECT_DISPATCHER
2042 // NOTE: we need to force linking against socketiohandler.cpp otherwise in
2043 // static builds of wxWidgets the ManagerSetter::ManagerSetter ctor
2044 // contained there wouldn't be ever called
2045 wxFORCE_LINK_MODULE( socketiohandler
)
2048 #endif // wxUSE_SOCKETS