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 wxT("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, wxT("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()
823 wxLogError("Cannot initialize wxSocketBase");
828 wxSocketBase::wxSocketBase()
833 wxSocketBase::wxSocketBase(wxSocketFlags flags
, wxSocketType type
)
842 wxSocketBase::~wxSocketBase()
844 // Shutdown and close the socket
848 // Destroy the implementation object
851 // Free the pushback buffer
855 bool wxSocketBase::Destroy()
857 // Delayed destruction: the socket will be deleted during the next idle
858 // loop iteration. This ensures that all pending events have been
860 m_beingDeleted
= true;
862 // Shutdown and close the socket
865 // Suppress events from now on
868 // Schedule this object for deletion instead of destroying it right now if
869 // possible as we may have other events pending for it
872 wxTheApp
->ScheduleForDestruction(this);
876 // in wxBase we might have no app object at all, don't leak memory
883 // ----------------------------------------------------------------------------
885 // ----------------------------------------------------------------------------
887 void wxSocketBase::SetError(wxSocketError error
)
889 m_impl
->m_error
= error
;
892 wxSocketError
wxSocketBase::LastError() const
894 return m_impl
->GetError();
897 // --------------------------------------------------------------------------
899 // --------------------------------------------------------------------------
901 // The following IO operations update m_lcount:
902 // {Read, Write, ReadMsg, WriteMsg, Peek, Unread, Discard}
903 bool wxSocketBase::Close()
905 // Interrupt pending waits
911 m_establishing
= false;
915 void wxSocketBase::ShutdownOutput()
921 wxSocketBase
& wxSocketBase::Read(void* buffer
, wxUint32 nbytes
)
923 wxSocketReadGuard
read(this);
925 m_lcount
= DoRead(buffer
, nbytes
);
930 wxUint32
wxSocketBase::DoRead(void* buffer_
, wxUint32 nbytes
)
932 wxCHECK_MSG( m_impl
, 0, "socket must be valid" );
934 // We use pointer arithmetic here which doesn't work with void pointers.
935 char *buffer
= static_cast<char *>(buffer_
);
936 wxCHECK_MSG( buffer
, 0, "NULL buffer" );
938 // Try the push back buffer first, even before checking whether the socket
939 // is valid to allow reading previously pushed back data from an already
941 wxUint32 total
= GetPushback(buffer
, nbytes
, false);
947 // our socket is non-blocking so Read() will return immediately if
948 // there is nothing to read yet and it's more efficient to try it first
949 // before entering DoWait() which is going to start dispatching GUI
950 // events and, even more importantly, we must do this under Windows
951 // where we're not going to get notifications about socket being ready
952 // for reading before we read all the existing data from it
953 const int ret
= !m_impl
->m_stream
|| m_connected
954 ? m_impl
->Read(buffer
, nbytes
)
958 if ( m_impl
->GetLastError() == wxSOCKET_WOULDBLOCK
)
960 // if we don't want to wait, just return immediately
961 if ( m_flags
& wxSOCKET_NOWAIT
)
964 // otherwise wait until the socket becomes ready for reading or
965 // an error occurs on it
966 if ( !DoWaitWithTimeout(wxSOCKET_INPUT_FLAG
) )
968 // and exit if the timeout elapsed before it did
969 SetError(wxSOCKET_TIMEDOUT
);
978 SetError(wxSOCKET_IOERR
);
984 // for connection-oriented (e.g. TCP) sockets we can only read
985 // 0 bytes if the other end has been closed, and for connectionless
986 // ones (UDP) this flag doesn't make sense anyhow so we can set it
987 // to true too without doing any harm
990 // we're not going to read anything else and so if we haven't read
991 // anything (or not everything in wxSOCKET_WAITALL case) already,
993 if ( (m_flags
& wxSOCKET_WAITALL
) || !total
)
994 SetError(wxSOCKET_IOERR
);
1000 // if we are happy to read something and not the entire nbytes bytes,
1002 if ( !(m_flags
& wxSOCKET_WAITALL
) )
1012 wxSocketBase
& wxSocketBase::ReadMsg(void* buffer
, wxUint32 nbytes
)
1016 unsigned char sig
[4];
1017 unsigned char len
[4];
1020 wxSocketReadGuard
read(this);
1022 wxSocketWaitModeChanger
changeFlags(this, wxSOCKET_WAITALL
);
1025 if ( DoRead(&msg
, sizeof(msg
)) == sizeof(msg
) )
1027 wxUint32 sig
= (wxUint32
)msg
.sig
[0];
1028 sig
|= (wxUint32
)(msg
.sig
[1] << 8);
1029 sig
|= (wxUint32
)(msg
.sig
[2] << 16);
1030 sig
|= (wxUint32
)(msg
.sig
[3] << 24);
1032 if ( sig
== 0xfeeddead )
1034 wxUint32 len
= (wxUint32
)msg
.len
[0];
1035 len
|= (wxUint32
)(msg
.len
[1] << 8);
1036 len
|= (wxUint32
)(msg
.len
[2] << 16);
1037 len
|= (wxUint32
)(msg
.len
[3] << 24);
1042 len2
= len
- nbytes
;
1048 // Don't attempt to read if the msg was zero bytes long.
1049 m_lcount
= len
? DoRead(buffer
, len
) : 0;
1053 char discard_buffer
[MAX_DISCARD_SIZE
];
1056 // NOTE: discarded bytes don't add to m_lcount.
1059 discard_len
= len2
> MAX_DISCARD_SIZE
1062 discard_len
= DoRead(discard_buffer
, (wxUint32
)discard_len
);
1063 len2
-= (wxUint32
)discard_len
;
1065 while ((discard_len
> 0) && len2
);
1068 if ( !len2
&& DoRead(&msg
, sizeof(msg
)) == sizeof(msg
) )
1070 sig
= (wxUint32
)msg
.sig
[0];
1071 sig
|= (wxUint32
)(msg
.sig
[1] << 8);
1072 sig
|= (wxUint32
)(msg
.sig
[2] << 16);
1073 sig
|= (wxUint32
)(msg
.sig
[3] << 24);
1075 if ( sig
== 0xdeadfeed )
1082 SetError(wxSOCKET_IOERR
);
1087 wxSocketBase
& wxSocketBase::Peek(void* buffer
, wxUint32 nbytes
)
1089 wxSocketReadGuard
read(this);
1091 m_lcount
= DoRead(buffer
, nbytes
);
1093 Pushback(buffer
, m_lcount
);
1098 wxSocketBase
& wxSocketBase::Write(const void *buffer
, wxUint32 nbytes
)
1100 wxSocketWriteGuard
write(this);
1102 m_lcount
= DoWrite(buffer
, nbytes
);
1107 // This function is a mirror image of DoRead() except that it doesn't use the
1108 // push back buffer and doesn't treat 0 return value specially (normally this
1109 // shouldn't happen at all here), so please see comments there for explanations
1110 wxUint32
wxSocketBase::DoWrite(const void *buffer_
, wxUint32 nbytes
)
1112 wxCHECK_MSG( m_impl
, 0, "socket must be valid" );
1114 const char *buffer
= static_cast<const char *>(buffer_
);
1115 wxCHECK_MSG( buffer
, 0, "NULL buffer" );
1120 if ( m_impl
->m_stream
&& !m_connected
)
1122 if ( (m_flags
& wxSOCKET_WAITALL
) || !total
)
1123 SetError(wxSOCKET_IOERR
);
1127 const int ret
= m_impl
->Write(buffer
, nbytes
);
1130 if ( m_impl
->GetLastError() == wxSOCKET_WOULDBLOCK
)
1132 if ( m_flags
& wxSOCKET_NOWAIT
)
1135 if ( !DoWaitWithTimeout(wxSOCKET_OUTPUT_FLAG
) )
1137 SetError(wxSOCKET_TIMEDOUT
);
1143 else // "real" error
1145 SetError(wxSOCKET_IOERR
);
1152 if ( !(m_flags
& wxSOCKET_WAITALL
) )
1162 wxSocketBase
& wxSocketBase::WriteMsg(const void *buffer
, wxUint32 nbytes
)
1166 unsigned char sig
[4];
1167 unsigned char len
[4];
1170 wxSocketWriteGuard
write(this);
1172 wxSocketWaitModeChanger
changeFlags(this, wxSOCKET_WAITALL
);
1174 msg
.sig
[0] = (unsigned char) 0xad;
1175 msg
.sig
[1] = (unsigned char) 0xde;
1176 msg
.sig
[2] = (unsigned char) 0xed;
1177 msg
.sig
[3] = (unsigned char) 0xfe;
1179 msg
.len
[0] = (unsigned char) (nbytes
& 0xff);
1180 msg
.len
[1] = (unsigned char) ((nbytes
>> 8) & 0xff);
1181 msg
.len
[2] = (unsigned char) ((nbytes
>> 16) & 0xff);
1182 msg
.len
[3] = (unsigned char) ((nbytes
>> 24) & 0xff);
1185 if ( DoWrite(&msg
, sizeof(msg
)) == sizeof(msg
) )
1187 m_lcount
= DoWrite(buffer
, nbytes
);
1188 if ( m_lcount
== nbytes
)
1190 msg
.sig
[0] = (unsigned char) 0xed;
1191 msg
.sig
[1] = (unsigned char) 0xfe;
1192 msg
.sig
[2] = (unsigned char) 0xad;
1193 msg
.sig
[3] = (unsigned char) 0xde;
1197 msg
.len
[3] = (char) 0;
1199 if ( DoWrite(&msg
, sizeof(msg
)) == sizeof(msg
))
1205 SetError(wxSOCKET_IOERR
);
1210 wxSocketBase
& wxSocketBase::Unread(const void *buffer
, wxUint32 nbytes
)
1213 Pushback(buffer
, nbytes
);
1215 SetError(wxSOCKET_NOERROR
);
1221 wxSocketBase
& wxSocketBase::Discard()
1223 char *buffer
= new char[MAX_DISCARD_SIZE
];
1227 wxSocketReadGuard
read(this);
1229 wxSocketWaitModeChanger
changeFlags(this, wxSOCKET_NOWAIT
);
1233 ret
= DoRead(buffer
, MAX_DISCARD_SIZE
);
1236 while (ret
== MAX_DISCARD_SIZE
);
1240 SetError(wxSOCKET_NOERROR
);
1245 // --------------------------------------------------------------------------
1247 // --------------------------------------------------------------------------
1250 This function will check for the events specified in the flags parameter,
1251 and it will return a mask indicating which operations can be performed.
1253 wxSocketEventFlags
wxSocketImpl::Select(wxSocketEventFlags flags
,
1254 const timeval
*timeout
)
1256 if ( m_fd
== INVALID_SOCKET
)
1257 return (wxSOCKET_LOST_FLAG
& flags
);
1263 tv
.tv_sec
= tv
.tv_usec
= 0;
1265 // prepare the FD sets, passing NULL for the one(s) we don't use
1267 readfds
, *preadfds
= NULL
,
1268 writefds
, *pwritefds
= NULL
,
1269 exceptfds
; // always want to know about errors
1271 if ( flags
& wxSOCKET_INPUT_FLAG
)
1273 preadfds
= &readfds
;
1274 wxFD_ZERO(preadfds
);
1275 wxFD_SET(m_fd
, preadfds
);
1278 // when using non-blocking connect() the socket becomes connected
1279 // (successfully or not) when it becomes writable
1280 if ( flags
& (wxSOCKET_OUTPUT_FLAG
| wxSOCKET_CONNECTION_FLAG
) )
1282 pwritefds
= &writefds
;
1283 wxFD_ZERO(pwritefds
);
1284 wxFD_SET(m_fd
, pwritefds
);
1287 wxFD_ZERO(&exceptfds
);
1288 wxFD_SET(m_fd
, &exceptfds
);
1290 const int rc
= select(m_fd
+ 1, preadfds
, pwritefds
, &exceptfds
, &tv
);
1292 // check for errors first
1293 if ( rc
== -1 || wxFD_ISSET(m_fd
, &exceptfds
) )
1295 m_establishing
= false;
1297 return wxSOCKET_LOST_FLAG
& flags
;
1303 wxASSERT_MSG( rc
== 1, "unexpected select() return value" );
1305 wxSocketEventFlags detected
= 0;
1306 if ( preadfds
&& wxFD_ISSET(m_fd
, preadfds
) )
1307 detected
|= wxSOCKET_INPUT_FLAG
;
1309 if ( pwritefds
&& wxFD_ISSET(m_fd
, pwritefds
) )
1311 // check for the case of non-blocking connect()
1312 if ( m_establishing
&& !m_server
)
1315 SOCKOPTLEN_T len
= sizeof(error
);
1316 m_establishing
= false;
1317 getsockopt(m_fd
, SOL_SOCKET
, SO_ERROR
, (char*)&error
, &len
);
1320 detected
= wxSOCKET_LOST_FLAG
;
1322 detected
|= wxSOCKET_CONNECTION_FLAG
;
1324 else // not called to get non-blocking connect() status
1326 detected
|= wxSOCKET_OUTPUT_FLAG
;
1330 return detected
& flags
;
1334 wxSocketBase::DoWait(long seconds
, long milliseconds
, wxSocketEventFlags flags
)
1336 // Use either the provided timeout or the default timeout value associated
1337 // with this socket.
1339 // TODO: allow waiting forever, see #9443
1340 const long timeout
= seconds
== -1 ? m_timeout
* 1000
1341 : seconds
* 1000 + milliseconds
;
1343 return DoWait(timeout
, flags
);
1347 wxSocketBase::DoWait(long timeout
, wxSocketEventFlags flags
)
1349 wxCHECK_MSG( m_impl
, -1, "can't wait on invalid socket" );
1351 // we're never going to become ready if we're not connected (any more)
1352 if ( !m_connected
&& !m_establishing
)
1355 // This can be set to true from Interrupt() to exit this function a.s.a.p.
1356 m_interrupt
= false;
1359 const wxMilliClock_t timeEnd
= wxGetLocalTimeMillis() + timeout
;
1361 // Get the active event loop which we'll use for the message dispatching
1362 // when running in the main thread unless this was explicitly disabled by
1363 // setting wxSOCKET_BLOCK flag
1364 wxEventLoopBase
*eventLoop
;
1365 if ( !(m_flags
& wxSOCKET_BLOCK
) && wxIsMainThread() )
1367 eventLoop
= wxEventLoop::GetActive();
1369 else // in worker thread
1371 // We never dispatch messages from threads other than the main one.
1375 // Make sure the events we're interested in are enabled before waiting for
1376 // them: this is really necessary here as otherwise this could happen:
1377 // 1. DoRead(wxSOCKET_WAITALL) is called
1378 // 2. There is nothing to read so DoWait(wxSOCKET_INPUT_FLAG) is called
1379 // 3. Some, but not all data appears, wxSocketImplUnix::OnReadWaiting()
1380 // is called and wxSOCKET_INPUT_FLAG events are disabled in it
1381 // 4. Because of wxSOCKET_WAITALL we call DoWait() again but the events
1382 // are still disabled and we block forever
1384 // More elegant solution would be nice but for now simply re-enabling the
1385 // events here will do
1386 m_impl
->ReenableEvents(flags
& (wxSOCKET_INPUT_FLAG
| wxSOCKET_OUTPUT_FLAG
));
1389 // Wait until we receive the event we're waiting for or the timeout expires
1390 // (but note that we always execute the loop at least once, even if timeout
1391 // is 0 as this is used for polling)
1393 for ( bool firstTime
= true; !m_interrupt
; firstTime
= false )
1395 long timeLeft
= wxMilliClockToLong(timeEnd
- wxGetLocalTimeMillis());
1404 wxSocketEventFlags events
;
1407 // reset them before starting to wait
1410 eventLoop
->DispatchTimeout(timeLeft
);
1412 events
= m_eventsgot
;
1414 else // no event loop or waiting in another thread
1416 // as explained below, we should always check for wxSOCKET_LOST_FLAG
1418 SetTimeValFromMS(tv
, timeLeft
);
1419 events
= m_impl
->Select(flags
| wxSOCKET_LOST_FLAG
, &tv
);
1422 // always check for wxSOCKET_LOST_FLAG, even if flags doesn't include
1423 // it, as continuing to wait for anything else after getting it is
1425 if ( events
& wxSOCKET_LOST_FLAG
)
1427 m_connected
= false;
1428 m_establishing
= false;
1433 // otherwise mask out the bits we're not interested in
1436 // Incoming connection (server) or connection established (client)?
1437 if ( events
& wxSOCKET_CONNECTION_FLAG
)
1440 m_establishing
= false;
1445 // Data available or output buffer ready?
1446 if ( (events
& wxSOCKET_INPUT_FLAG
) || (events
& wxSOCKET_OUTPUT_FLAG
) )
1456 bool wxSocketBase::Wait(long seconds
, long milliseconds
)
1458 return DoWait(seconds
, milliseconds
,
1459 wxSOCKET_INPUT_FLAG
|
1460 wxSOCKET_OUTPUT_FLAG
|
1461 wxSOCKET_CONNECTION_FLAG
) != 0;
1464 bool wxSocketBase::WaitForRead(long seconds
, long milliseconds
)
1466 // Check pushback buffer before entering DoWait
1470 // Check if the socket is not already ready for input, if it is, there is
1471 // no need to start waiting for it (worse, we'll actually never get a
1472 // notification about the socket becoming ready if it is already under
1474 if ( m_impl
->Select(wxSOCKET_INPUT_FLAG
) )
1477 return DoWait(seconds
, milliseconds
, wxSOCKET_INPUT_FLAG
) != 0;
1481 bool wxSocketBase::WaitForWrite(long seconds
, long milliseconds
)
1483 if ( m_impl
->Select(wxSOCKET_OUTPUT_FLAG
) )
1486 return DoWait(seconds
, milliseconds
, wxSOCKET_OUTPUT_FLAG
) != 0;
1489 bool wxSocketBase::WaitForLost(long seconds
, long milliseconds
)
1491 return DoWait(seconds
, milliseconds
, wxSOCKET_LOST_FLAG
) == -1;
1494 // --------------------------------------------------------------------------
1496 // --------------------------------------------------------------------------
1499 // Get local or peer address
1502 bool wxSocketBase::GetPeer(wxSockAddress
& addr
) const
1504 wxCHECK_MSG( m_impl
, false, "invalid socket" );
1506 const wxSockAddressImpl
& peer
= m_impl
->GetPeer();
1510 addr
.SetAddress(peer
);
1515 bool wxSocketBase::GetLocal(wxSockAddress
& addr
) const
1517 wxCHECK_MSG( m_impl
, false, "invalid socket" );
1519 const wxSockAddressImpl
& local
= m_impl
->GetLocal();
1520 if ( !local
.IsOk() )
1523 addr
.SetAddress(local
);
1529 // Save and restore socket state
1532 void wxSocketBase::SaveState()
1534 wxSocketState
*state
;
1536 state
= new wxSocketState();
1538 state
->m_flags
= m_flags
;
1539 state
->m_notify
= m_notify
;
1540 state
->m_eventmask
= m_eventmask
;
1541 state
->m_clientData
= m_clientData
;
1543 m_states
.Append(state
);
1546 void wxSocketBase::RestoreState()
1548 wxList::compatibility_iterator node
;
1549 wxSocketState
*state
;
1551 node
= m_states
.GetLast();
1555 state
= (wxSocketState
*)node
->GetData();
1557 m_flags
= state
->m_flags
;
1558 m_notify
= state
->m_notify
;
1559 m_eventmask
= state
->m_eventmask
;
1560 m_clientData
= state
->m_clientData
;
1562 m_states
.Erase(node
);
1567 // Timeout and flags
1570 void wxSocketBase::SetTimeout(long seconds
)
1572 m_timeout
= seconds
;
1575 m_impl
->SetTimeout(m_timeout
* 1000);
1578 void wxSocketBase::SetFlags(wxSocketFlags flags
)
1580 // Do some sanity checking on the flags used: not all values can be used
1582 wxASSERT_MSG( !(flags
& wxSOCKET_NOWAIT
) ||
1583 !(flags
& (wxSOCKET_WAITALL
| wxSOCKET_BLOCK
)),
1584 "Using wxSOCKET_WAITALL or wxSOCKET_BLOCK with "
1585 "wxSOCKET_NOWAIT doesn't make sense" );
1591 // --------------------------------------------------------------------------
1593 // --------------------------------------------------------------------------
1595 void wxSocketBase::OnRequest(wxSocketNotify notification
)
1597 wxSocketEventFlags flag
= 0;
1598 switch ( notification
)
1600 case wxSOCKET_INPUT
:
1601 flag
= wxSOCKET_INPUT_FLAG
;
1604 case wxSOCKET_OUTPUT
:
1605 flag
= wxSOCKET_OUTPUT_FLAG
;
1608 case wxSOCKET_CONNECTION
:
1609 flag
= wxSOCKET_CONNECTION_FLAG
;
1611 // we're now successfully connected
1613 m_establishing
= false;
1615 // error was previously set to wxSOCKET_WOULDBLOCK, but this is not
1616 // the case any longer
1617 SetError(wxSOCKET_NOERROR
);
1621 flag
= wxSOCKET_LOST_FLAG
;
1623 // if we lost the connection the socket is now closed and not
1624 // connected any more
1625 m_connected
= false;
1630 wxFAIL_MSG( "unknown wxSocket notification" );
1633 // remember the events which were generated for this socket, we're going to
1634 // use this in DoWait()
1635 m_eventsgot
|= flag
;
1637 // send the wx event if enabled and we're interested in it
1638 if ( m_notify
&& (m_eventmask
& flag
) && m_handler
)
1640 // don't generate the events when we're inside DoWait() called from our
1641 // own code as we are going to consume the data that has just become
1642 // available ourselves and the user code won't see it at all
1643 if ( (notification
== wxSOCKET_INPUT
&& m_reading
) ||
1644 (notification
== wxSOCKET_OUTPUT
&& m_writing
) )
1649 wxSocketEvent
event(m_id
);
1650 event
.m_event
= notification
;
1651 event
.m_clientData
= m_clientData
;
1652 event
.SetEventObject(this);
1654 m_handler
->AddPendingEvent(event
);
1658 void wxSocketBase::Notify(bool notify
)
1663 void wxSocketBase::SetNotify(wxSocketEventFlags flags
)
1665 m_eventmask
= flags
;
1668 void wxSocketBase::SetEventHandler(wxEvtHandler
& handler
, int id
)
1670 m_handler
= &handler
;
1674 // --------------------------------------------------------------------------
1676 // --------------------------------------------------------------------------
1678 void wxSocketBase::Pushback(const void *buffer
, wxUint32 size
)
1682 if (m_unread
== NULL
)
1683 m_unread
= malloc(size
);
1688 tmp
= malloc(m_unrd_size
+ size
);
1689 memcpy((char *)tmp
+ size
, m_unread
, m_unrd_size
);
1695 m_unrd_size
+= size
;
1697 memcpy(m_unread
, buffer
, size
);
1700 wxUint32
wxSocketBase::GetPushback(void *buffer
, wxUint32 size
, bool peek
)
1702 wxCHECK_MSG( buffer
, 0, "NULL buffer" );
1707 if (size
> (m_unrd_size
-m_unrd_cur
))
1708 size
= m_unrd_size
-m_unrd_cur
;
1710 memcpy(buffer
, (char *)m_unread
+ m_unrd_cur
, size
);
1715 if (m_unrd_size
== m_unrd_cur
)
1728 // ==========================================================================
1730 // ==========================================================================
1732 // --------------------------------------------------------------------------
1734 // --------------------------------------------------------------------------
1736 wxSocketServer::wxSocketServer(const wxSockAddress
& addr
,
1737 wxSocketFlags flags
)
1738 : wxSocketBase(flags
, wxSOCKET_SERVER
)
1740 wxLogTrace( wxTRACE_Socket
, wxT("Opening wxSocketServer") );
1742 m_impl
= wxSocketImpl::Create(*this);
1746 wxLogTrace( wxTRACE_Socket
, wxT("*** Failed to create m_impl") );
1750 // Setup the socket as server
1751 m_impl
->SetLocal(addr
.GetAddress());
1753 if (GetFlags() & wxSOCKET_REUSEADDR
) {
1754 m_impl
->SetReusable();
1756 if (GetFlags() & wxSOCKET_BROADCAST
) {
1757 m_impl
->SetBroadcast();
1759 if (GetFlags() & wxSOCKET_NOBIND
) {
1760 m_impl
->DontDoBind();
1763 if (m_impl
->CreateServer() != wxSOCKET_NOERROR
)
1768 wxLogTrace( wxTRACE_Socket
, wxT("*** CreateServer() failed") );
1772 wxLogTrace( wxTRACE_Socket
, wxT("wxSocketServer on fd %d"), m_impl
->m_fd
);
1775 // --------------------------------------------------------------------------
1777 // --------------------------------------------------------------------------
1779 bool wxSocketServer::AcceptWith(wxSocketBase
& sock
, bool wait
)
1781 if ( !m_impl
|| (m_impl
->m_fd
== INVALID_SOCKET
) || !m_impl
->IsServer() )
1783 wxFAIL_MSG( "can only be called for a valid server socket" );
1785 SetError(wxSOCKET_INVSOCK
);
1792 // wait until we get a connection
1793 if ( !m_impl
->SelectWithTimeout(wxSOCKET_INPUT_FLAG
) )
1795 SetError(wxSOCKET_TIMEDOUT
);
1801 sock
.m_impl
= m_impl
->Accept(sock
);
1805 SetError(m_impl
->GetLastError());
1810 sock
.m_type
= wxSOCKET_BASE
;
1811 sock
.m_connected
= true;
1816 wxSocketBase
*wxSocketServer::Accept(bool wait
)
1818 wxSocketBase
* sock
= new wxSocketBase();
1820 sock
->SetFlags(m_flags
);
1822 if (!AcceptWith(*sock
, wait
))
1831 bool wxSocketServer::WaitForAccept(long seconds
, long milliseconds
)
1833 return DoWait(seconds
, milliseconds
, wxSOCKET_CONNECTION_FLAG
) == 1;
1836 bool wxSocketBase::GetOption(int level
, int optname
, void *optval
, int *optlen
)
1838 wxASSERT_MSG( m_impl
, wxT("Socket not initialised") );
1840 SOCKOPTLEN_T lenreal
= *optlen
;
1841 if ( getsockopt(m_impl
->m_fd
, level
, optname
,
1842 static_cast<char *>(optval
), &lenreal
) != 0 )
1851 wxSocketBase::SetOption(int level
, int optname
, const void *optval
, int optlen
)
1853 wxASSERT_MSG( m_impl
, wxT("Socket not initialised") );
1855 return setsockopt(m_impl
->m_fd
, level
, optname
,
1856 static_cast<const char *>(optval
), optlen
) == 0;
1859 bool wxSocketBase::SetLocal(const wxIPV4address
& local
)
1861 m_localAddress
= local
;
1866 // ==========================================================================
1868 // ==========================================================================
1870 // --------------------------------------------------------------------------
1872 // --------------------------------------------------------------------------
1874 wxSocketClient::wxSocketClient(wxSocketFlags flags
)
1875 : wxSocketBase(flags
, wxSOCKET_CLIENT
)
1877 m_initialRecvBufferSize
=
1878 m_initialSendBufferSize
= -1;
1881 // --------------------------------------------------------------------------
1883 // --------------------------------------------------------------------------
1885 bool wxSocketClient::DoConnect(const wxSockAddress
& remote
,
1886 const wxSockAddress
* local
,
1891 // Shutdown and destroy the old socket
1896 m_connected
= false;
1897 m_establishing
= false;
1899 // Create and set up the new one
1900 m_impl
= wxSocketImpl::Create(*this);
1904 // Reuse makes sense for clients too, if we are trying to rebind to the same port
1905 if (GetFlags() & wxSOCKET_REUSEADDR
)
1906 m_impl
->SetReusable();
1907 if (GetFlags() & wxSOCKET_BROADCAST
)
1908 m_impl
->SetBroadcast();
1909 if (GetFlags() & wxSOCKET_NOBIND
)
1910 m_impl
->DontDoBind();
1912 // Bind to the local IP address and port, when provided or if one had been
1914 if ( !local
&& m_localAddress
.GetAddress().IsOk() )
1915 local
= &m_localAddress
;
1918 m_impl
->SetLocal(local
->GetAddress());
1920 m_impl
->SetInitialSocketBuffers(m_initialRecvBufferSize
, m_initialSendBufferSize
);
1922 m_impl
->SetPeer(remote
.GetAddress());
1924 // Finally do create the socket and connect to the peer
1925 const wxSocketError err
= m_impl
->CreateClient(wait
);
1927 if ( err
!= wxSOCKET_NOERROR
)
1929 if ( err
== wxSOCKET_WOULDBLOCK
)
1931 wxASSERT_MSG( !wait
, "shouldn't get this for blocking connect" );
1933 m_establishing
= true;
1943 bool wxSocketClient::Connect(const wxSockAddress
& remote
, bool wait
)
1945 return DoConnect(remote
, NULL
, wait
);
1948 bool wxSocketClient::Connect(const wxSockAddress
& remote
,
1949 const wxSockAddress
& local
,
1952 return DoConnect(remote
, &local
, wait
);
1955 bool wxSocketClient::WaitOnConnect(long seconds
, long milliseconds
)
1959 // this happens if the initial attempt to connect succeeded without
1964 wxCHECK_MSG( m_establishing
&& m_impl
, false,
1965 "No connection establishment attempt in progress" );
1967 // notice that we return true even if DoWait() returned -1, i.e. if an
1968 // error occurred and connection was lost: this is intentional as we should
1969 // return false only if timeout expired without anything happening
1970 return DoWait(seconds
, milliseconds
, wxSOCKET_CONNECTION_FLAG
) != 0;
1973 // ==========================================================================
1975 // ==========================================================================
1977 wxDatagramSocket::wxDatagramSocket( const wxSockAddress
& addr
,
1978 wxSocketFlags flags
)
1979 : wxSocketBase( flags
, wxSOCKET_DATAGRAM
)
1981 // Create the socket
1982 m_impl
= wxSocketImpl::Create(*this);
1987 // Setup the socket as non connection oriented
1988 m_impl
->SetLocal(addr
.GetAddress());
1989 if (flags
& wxSOCKET_REUSEADDR
)
1991 m_impl
->SetReusable();
1993 if (GetFlags() & wxSOCKET_BROADCAST
)
1995 m_impl
->SetBroadcast();
1997 if (GetFlags() & wxSOCKET_NOBIND
)
1999 m_impl
->DontDoBind();
2002 if ( m_impl
->CreateUDP() != wxSOCKET_NOERROR
)
2009 // Initialize all stuff
2010 m_connected
= false;
2011 m_establishing
= false;
2014 wxDatagramSocket
& wxDatagramSocket::RecvFrom( wxSockAddress
& addr
,
2023 wxDatagramSocket
& wxDatagramSocket::SendTo( const wxSockAddress
& addr
,
2027 wxASSERT_MSG( m_impl
, wxT("Socket not initialised") );
2029 m_impl
->SetPeer(addr
.GetAddress());
2034 // ==========================================================================
2036 // ==========================================================================
2038 class wxSocketModule
: public wxModule
2041 virtual bool OnInit()
2043 // wxSocketBase will call Initialize() itself only if sockets are
2044 // really used, don't do it from here
2048 virtual void OnExit()
2050 if ( wxSocketBase::IsInitialized() )
2051 wxSocketBase::Shutdown();
2055 DECLARE_DYNAMIC_CLASS(wxSocketModule
)
2058 IMPLEMENT_DYNAMIC_CLASS(wxSocketModule
, wxModule
)
2060 #if defined(wxUSE_SELECT_DISPATCHER) && wxUSE_SELECT_DISPATCHER
2061 // NOTE: we need to force linking against socketiohandler.cpp otherwise in
2062 // static builds of wxWidgets the ManagerSetter::ManagerSetter ctor
2063 // contained there wouldn't be ever called
2064 wxFORCE_LINK_MODULE( socketiohandler
)
2067 #endif // wxUSE_SOCKETS