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 wxSocketManager
* const manager
= wxSocketManager::Get();
540 wxSocketImpl
* const sock
= manager
->CreateSocket(wxsocket
);
545 sock
->m_peer
= wxSockAddressImpl(from
.addr
, fromlen
);
547 sock
->UnblockAndRegisterWithEventLoop();
553 void wxSocketImpl::Close()
555 if ( m_fd
!= INVALID_SOCKET
)
558 m_fd
= INVALID_SOCKET
;
562 void wxSocketImpl::Shutdown()
564 if ( m_fd
!= INVALID_SOCKET
)
566 shutdown(m_fd
, 1 /* SD_SEND */);
572 * Sets the timeout for blocking calls. Time is expressed in
575 void wxSocketImpl::SetTimeout(unsigned long millis
)
577 SetTimeValFromMS(m_timeout
, millis
);
580 void wxSocketImpl::NotifyOnStateChange(wxSocketNotify event
)
582 m_wxsocket
->OnRequest(event
);
585 /* Address handling */
586 wxSocketError
wxSocketImpl::SetLocal(const wxSockAddressImpl
& local
)
588 /* the socket must be initialized, or it must be a server */
589 if (m_fd
!= INVALID_SOCKET
&& !m_server
)
591 m_error
= wxSOCKET_INVSOCK
;
592 return wxSOCKET_INVSOCK
;
597 m_error
= wxSOCKET_INVADDR
;
598 return wxSOCKET_INVADDR
;
603 return wxSOCKET_NOERROR
;
606 wxSocketError
wxSocketImpl::SetPeer(const wxSockAddressImpl
& peer
)
610 m_error
= wxSOCKET_INVADDR
;
611 return wxSOCKET_INVADDR
;
616 return wxSOCKET_NOERROR
;
619 const wxSockAddressImpl
& wxSocketImpl::GetLocal()
621 if ( !m_local
.IsOk() )
622 UpdateLocalAddress();
627 // ----------------------------------------------------------------------------
629 // ----------------------------------------------------------------------------
631 // this macro wraps the given expression (normally a syscall) in a loop which
632 // ignores any interruptions, i.e. reevaluates it again if it failed and errno
635 #define DO_WHILE_EINTR( rc, syscall ) \
639 while ( rc == -1 && errno == EINTR )
641 #define DO_WHILE_EINTR( rc, syscall ) rc = (syscall)
644 int wxSocketImpl::RecvStream(void *buffer
, int size
)
647 DO_WHILE_EINTR( ret
, recv(m_fd
, static_cast<char *>(buffer
), size
, 0) );
651 // receiving 0 bytes for a TCP socket indicates that the connection was
652 // closed by peer so shut down our end as well (for UDP sockets empty
653 // datagrams are also possible)
654 m_establishing
= false;
655 NotifyOnStateChange(wxSOCKET_LOST
);
659 // do not return an error in this case however
665 int wxSocketImpl::SendStream(const void *buffer
, int size
)
667 #ifdef wxNEEDS_IGNORE_SIGPIPE
668 IgnoreSignal
ignore(SIGPIPE
);
672 DO_WHILE_EINTR( ret
, send(m_fd
, static_cast<const char *>(buffer
), size
,
673 wxSOCKET_MSG_NOSIGNAL
) );
678 int wxSocketImpl::RecvDgram(void *buffer
, int size
)
680 wxSockAddressStorage from
;
681 WX_SOCKLEN_T fromlen
= sizeof(from
);
684 DO_WHILE_EINTR( ret
, recvfrom(m_fd
, static_cast<char *>(buffer
), size
,
685 0, &from
.addr
, &fromlen
) );
687 if ( ret
== SOCKET_ERROR
)
690 m_peer
= wxSockAddressImpl(from
.addr
, fromlen
);
691 if ( !m_peer
.IsOk() )
697 int wxSocketImpl::SendDgram(const void *buffer
, int size
)
699 if ( !m_peer
.IsOk() )
701 m_error
= wxSOCKET_INVADDR
;
706 DO_WHILE_EINTR( ret
, sendto(m_fd
, static_cast<const char *>(buffer
), size
,
707 0, m_peer
.GetAddr(), m_peer
.GetLen()) );
712 int wxSocketImpl::Read(void *buffer
, int size
)
714 // server sockets can't be used for IO, only to accept new connections
715 if ( m_fd
== INVALID_SOCKET
|| m_server
)
717 m_error
= wxSOCKET_INVSOCK
;
721 int ret
= m_stream
? RecvStream(buffer
, size
)
722 : RecvDgram(buffer
, size
);
724 m_error
= ret
== SOCKET_ERROR
? GetLastError() : wxSOCKET_NOERROR
;
729 int wxSocketImpl::Write(const void *buffer
, int size
)
731 if ( m_fd
== INVALID_SOCKET
|| m_server
)
733 m_error
= wxSOCKET_INVSOCK
;
737 int ret
= m_stream
? SendStream(buffer
, size
)
738 : SendDgram(buffer
, size
);
740 m_error
= ret
== SOCKET_ERROR
? GetLastError() : wxSOCKET_NOERROR
;
745 // ==========================================================================
747 // ==========================================================================
749 // --------------------------------------------------------------------------
750 // Initialization and shutdown
751 // --------------------------------------------------------------------------
753 // FIXME-MT: all this is MT-unsafe, of course, we should protect all accesses
754 // to m_countInit with a crit section
755 size_t wxSocketBase::m_countInit
= 0;
757 bool wxSocketBase::IsInitialized()
759 return m_countInit
> 0;
762 bool wxSocketBase::Initialize()
764 if ( !m_countInit
++ )
766 wxSocketManager
* const manager
= wxSocketManager::Get();
767 if ( !manager
|| !manager
->OnInit() )
778 void wxSocketBase::Shutdown()
780 // we should be initialized
781 wxASSERT_MSG( m_countInit
> 0, wxT("extra call to Shutdown()") );
782 if ( --m_countInit
== 0 )
784 wxSocketManager
* const manager
= wxSocketManager::Get();
785 wxCHECK_RET( manager
, "should have a socket manager" );
791 // --------------------------------------------------------------------------
793 // --------------------------------------------------------------------------
795 void wxSocketBase::Init()
798 m_type
= wxSOCKET_UNINIT
;
809 m_beingDeleted
= false;
824 if ( !IsInitialized() )
826 // this Initialize() will be undone by wxSocketModule::OnExit(), all
827 // the other calls to it should be matched by a call to Shutdown()
830 wxLogError("Cannot initialize wxSocketBase");
835 wxSocketBase::wxSocketBase()
840 wxSocketBase::wxSocketBase(wxSocketFlags flags
, wxSocketType type
)
849 wxSocketBase::~wxSocketBase()
851 // Shutdown and close the socket
855 // Destroy the implementation object
858 // Free the pushback buffer
862 bool wxSocketBase::Destroy()
864 // Delayed destruction: the socket will be deleted during the next idle
865 // loop iteration. This ensures that all pending events have been
867 m_beingDeleted
= true;
869 // Shutdown and close the socket
872 // Suppress events from now on
875 // Schedule this object for deletion instead of destroying it right now if
876 // possible as we may have other events pending for it
879 wxTheApp
->ScheduleForDestruction(this);
883 // in wxBase we might have no app object at all, don't leak memory
890 // ----------------------------------------------------------------------------
892 // ----------------------------------------------------------------------------
894 void wxSocketBase::SetError(wxSocketError error
)
896 m_impl
->m_error
= error
;
899 wxSocketError
wxSocketBase::LastError() const
901 return m_impl
->GetError();
904 // --------------------------------------------------------------------------
906 // --------------------------------------------------------------------------
908 // The following IO operations update m_lcount:
909 // {Read, Write, ReadMsg, WriteMsg, Peek, Unread, Discard}
910 bool wxSocketBase::Close()
912 // Interrupt pending waits
918 m_establishing
= false;
922 void wxSocketBase::ShutdownOutput()
928 wxSocketBase
& wxSocketBase::Read(void* buffer
, wxUint32 nbytes
)
930 wxSocketReadGuard
read(this);
932 m_lcount
= DoRead(buffer
, nbytes
);
937 wxUint32
wxSocketBase::DoRead(void* buffer_
, wxUint32 nbytes
)
939 wxCHECK_MSG( m_impl
, 0, "socket must be valid" );
941 // We use pointer arithmetic here which doesn't work with void pointers.
942 char *buffer
= static_cast<char *>(buffer_
);
943 wxCHECK_MSG( buffer
, 0, "NULL buffer" );
945 // Try the push back buffer first, even before checking whether the socket
946 // is valid to allow reading previously pushed back data from an already
948 wxUint32 total
= GetPushback(buffer
, nbytes
, false);
954 // our socket is non-blocking so Read() will return immediately if
955 // there is nothing to read yet and it's more efficient to try it first
956 // before entering DoWait() which is going to start dispatching GUI
957 // events and, even more importantly, we must do this under Windows
958 // where we're not going to get notifications about socket being ready
959 // for reading before we read all the existing data from it
960 const int ret
= !m_impl
->m_stream
|| m_connected
961 ? m_impl
->Read(buffer
, nbytes
)
965 if ( m_impl
->GetLastError() == wxSOCKET_WOULDBLOCK
)
967 // if we don't want to wait, just return immediately
968 if ( m_flags
& wxSOCKET_NOWAIT
)
971 // otherwise wait until the socket becomes ready for reading or
972 // an error occurs on it
973 if ( !DoWaitWithTimeout(wxSOCKET_INPUT_FLAG
) )
975 // and exit if the timeout elapsed before it did
976 SetError(wxSOCKET_TIMEDOUT
);
985 SetError(wxSOCKET_IOERR
);
991 // for connection-oriented (e.g. TCP) sockets we can only read
992 // 0 bytes if the other end has been closed, and for connectionless
993 // ones (UDP) this flag doesn't make sense anyhow so we can set it
994 // to true too without doing any harm
997 // we're not going to read anything else and so if we haven't read
998 // anything (or not everything in wxSOCKET_WAITALL case) already,
1000 if ( (m_flags
& wxSOCKET_WAITALL
) || !total
)
1001 SetError(wxSOCKET_IOERR
);
1007 // if we are happy to read something and not the entire nbytes bytes,
1009 if ( !(m_flags
& wxSOCKET_WAITALL
) )
1019 wxSocketBase
& wxSocketBase::ReadMsg(void* buffer
, wxUint32 nbytes
)
1023 unsigned char sig
[4];
1024 unsigned char len
[4];
1027 wxSocketReadGuard
read(this);
1029 wxSocketWaitModeChanger
changeFlags(this, wxSOCKET_WAITALL
);
1032 if ( DoRead(&msg
, sizeof(msg
)) == sizeof(msg
) )
1034 wxUint32 sig
= (wxUint32
)msg
.sig
[0];
1035 sig
|= (wxUint32
)(msg
.sig
[1] << 8);
1036 sig
|= (wxUint32
)(msg
.sig
[2] << 16);
1037 sig
|= (wxUint32
)(msg
.sig
[3] << 24);
1039 if ( sig
== 0xfeeddead )
1041 wxUint32 len
= (wxUint32
)msg
.len
[0];
1042 len
|= (wxUint32
)(msg
.len
[1] << 8);
1043 len
|= (wxUint32
)(msg
.len
[2] << 16);
1044 len
|= (wxUint32
)(msg
.len
[3] << 24);
1049 len2
= len
- nbytes
;
1055 // Don't attempt to read if the msg was zero bytes long.
1056 m_lcount
= len
? DoRead(buffer
, len
) : 0;
1060 char discard_buffer
[MAX_DISCARD_SIZE
];
1063 // NOTE: discarded bytes don't add to m_lcount.
1066 discard_len
= len2
> MAX_DISCARD_SIZE
1069 discard_len
= DoRead(discard_buffer
, (wxUint32
)discard_len
);
1070 len2
-= (wxUint32
)discard_len
;
1072 while ((discard_len
> 0) && len2
);
1075 if ( !len2
&& DoRead(&msg
, sizeof(msg
)) == sizeof(msg
) )
1077 sig
= (wxUint32
)msg
.sig
[0];
1078 sig
|= (wxUint32
)(msg
.sig
[1] << 8);
1079 sig
|= (wxUint32
)(msg
.sig
[2] << 16);
1080 sig
|= (wxUint32
)(msg
.sig
[3] << 24);
1082 if ( sig
== 0xdeadfeed )
1089 SetError(wxSOCKET_IOERR
);
1094 wxSocketBase
& wxSocketBase::Peek(void* buffer
, wxUint32 nbytes
)
1096 wxSocketReadGuard
read(this);
1098 m_lcount
= DoRead(buffer
, nbytes
);
1100 Pushback(buffer
, m_lcount
);
1105 wxSocketBase
& wxSocketBase::Write(const void *buffer
, wxUint32 nbytes
)
1107 wxSocketWriteGuard
write(this);
1109 m_lcount
= DoWrite(buffer
, nbytes
);
1114 // This function is a mirror image of DoRead() except that it doesn't use the
1115 // push back buffer and doesn't treat 0 return value specially (normally this
1116 // shouldn't happen at all here), so please see comments there for explanations
1117 wxUint32
wxSocketBase::DoWrite(const void *buffer_
, wxUint32 nbytes
)
1119 wxCHECK_MSG( m_impl
, 0, "socket must be valid" );
1121 const char *buffer
= static_cast<const char *>(buffer_
);
1122 wxCHECK_MSG( buffer
, 0, "NULL buffer" );
1127 if ( m_impl
->m_stream
&& !m_connected
)
1129 if ( (m_flags
& wxSOCKET_WAITALL
) || !total
)
1130 SetError(wxSOCKET_IOERR
);
1134 const int ret
= m_impl
->Write(buffer
, nbytes
);
1137 if ( m_impl
->GetLastError() == wxSOCKET_WOULDBLOCK
)
1139 if ( m_flags
& wxSOCKET_NOWAIT
)
1142 if ( !DoWaitWithTimeout(wxSOCKET_OUTPUT_FLAG
) )
1144 SetError(wxSOCKET_TIMEDOUT
);
1150 else // "real" error
1152 SetError(wxSOCKET_IOERR
);
1159 if ( !(m_flags
& wxSOCKET_WAITALL
) )
1169 wxSocketBase
& wxSocketBase::WriteMsg(const void *buffer
, wxUint32 nbytes
)
1173 unsigned char sig
[4];
1174 unsigned char len
[4];
1177 wxSocketWriteGuard
write(this);
1179 wxSocketWaitModeChanger
changeFlags(this, wxSOCKET_WAITALL
);
1181 msg
.sig
[0] = (unsigned char) 0xad;
1182 msg
.sig
[1] = (unsigned char) 0xde;
1183 msg
.sig
[2] = (unsigned char) 0xed;
1184 msg
.sig
[3] = (unsigned char) 0xfe;
1186 msg
.len
[0] = (unsigned char) (nbytes
& 0xff);
1187 msg
.len
[1] = (unsigned char) ((nbytes
>> 8) & 0xff);
1188 msg
.len
[2] = (unsigned char) ((nbytes
>> 16) & 0xff);
1189 msg
.len
[3] = (unsigned char) ((nbytes
>> 24) & 0xff);
1192 if ( DoWrite(&msg
, sizeof(msg
)) == sizeof(msg
) )
1194 m_lcount
= DoWrite(buffer
, nbytes
);
1195 if ( m_lcount
== nbytes
)
1197 msg
.sig
[0] = (unsigned char) 0xed;
1198 msg
.sig
[1] = (unsigned char) 0xfe;
1199 msg
.sig
[2] = (unsigned char) 0xad;
1200 msg
.sig
[3] = (unsigned char) 0xde;
1204 msg
.len
[3] = (char) 0;
1206 if ( DoWrite(&msg
, sizeof(msg
)) == sizeof(msg
))
1212 SetError(wxSOCKET_IOERR
);
1217 wxSocketBase
& wxSocketBase::Unread(const void *buffer
, wxUint32 nbytes
)
1220 Pushback(buffer
, nbytes
);
1222 SetError(wxSOCKET_NOERROR
);
1228 wxSocketBase
& wxSocketBase::Discard()
1230 char *buffer
= new char[MAX_DISCARD_SIZE
];
1234 wxSocketReadGuard
read(this);
1236 wxSocketWaitModeChanger
changeFlags(this, wxSOCKET_NOWAIT
);
1240 ret
= DoRead(buffer
, MAX_DISCARD_SIZE
);
1243 while (ret
== MAX_DISCARD_SIZE
);
1247 SetError(wxSOCKET_NOERROR
);
1252 // --------------------------------------------------------------------------
1254 // --------------------------------------------------------------------------
1257 This function will check for the events specified in the flags parameter,
1258 and it will return a mask indicating which operations can be performed.
1260 wxSocketEventFlags
wxSocketImpl::Select(wxSocketEventFlags flags
,
1261 const timeval
*timeout
)
1263 if ( m_fd
== INVALID_SOCKET
)
1264 return (wxSOCKET_LOST_FLAG
& flags
);
1270 tv
.tv_sec
= tv
.tv_usec
= 0;
1272 // prepare the FD sets, passing NULL for the one(s) we don't use
1274 readfds
, *preadfds
= NULL
,
1275 writefds
, *pwritefds
= NULL
,
1276 exceptfds
; // always want to know about errors
1278 if ( flags
& wxSOCKET_INPUT_FLAG
)
1280 preadfds
= &readfds
;
1281 wxFD_ZERO(preadfds
);
1282 wxFD_SET(m_fd
, preadfds
);
1285 // when using non-blocking connect() the socket becomes connected
1286 // (successfully or not) when it becomes writable
1287 if ( flags
& (wxSOCKET_OUTPUT_FLAG
| wxSOCKET_CONNECTION_FLAG
) )
1289 pwritefds
= &writefds
;
1290 wxFD_ZERO(pwritefds
);
1291 wxFD_SET(m_fd
, pwritefds
);
1294 wxFD_ZERO(&exceptfds
);
1295 wxFD_SET(m_fd
, &exceptfds
);
1297 const int rc
= select(m_fd
+ 1, preadfds
, pwritefds
, &exceptfds
, &tv
);
1299 // check for errors first
1300 if ( rc
== -1 || wxFD_ISSET(m_fd
, &exceptfds
) )
1302 m_establishing
= false;
1304 return wxSOCKET_LOST_FLAG
& flags
;
1310 wxASSERT_MSG( rc
== 1, "unexpected select() return value" );
1312 wxSocketEventFlags detected
= 0;
1313 if ( preadfds
&& wxFD_ISSET(m_fd
, preadfds
) )
1314 detected
|= wxSOCKET_INPUT_FLAG
;
1316 if ( pwritefds
&& wxFD_ISSET(m_fd
, pwritefds
) )
1318 // check for the case of non-blocking connect()
1319 if ( m_establishing
&& !m_server
)
1322 SOCKOPTLEN_T len
= sizeof(error
);
1323 m_establishing
= false;
1324 getsockopt(m_fd
, SOL_SOCKET
, SO_ERROR
, (char*)&error
, &len
);
1327 detected
= wxSOCKET_LOST_FLAG
;
1329 detected
|= wxSOCKET_CONNECTION_FLAG
;
1331 else // not called to get non-blocking connect() status
1333 detected
|= wxSOCKET_OUTPUT_FLAG
;
1337 return detected
& flags
;
1341 wxSocketBase::DoWait(long seconds
, long milliseconds
, wxSocketEventFlags flags
)
1343 // Use either the provided timeout or the default timeout value associated
1344 // with this socket.
1346 // TODO: allow waiting forever, see #9443
1347 const long timeout
= seconds
== -1 ? m_timeout
* 1000
1348 : seconds
* 1000 + milliseconds
;
1350 return DoWait(timeout
, flags
);
1354 wxSocketBase::DoWait(long timeout
, wxSocketEventFlags flags
)
1356 wxCHECK_MSG( m_impl
, -1, "can't wait on invalid socket" );
1358 // we're never going to become ready if we're not connected (any more)
1359 if ( !m_connected
&& !m_establishing
)
1362 // This can be set to true from Interrupt() to exit this function a.s.a.p.
1363 m_interrupt
= false;
1366 const wxMilliClock_t timeEnd
= wxGetLocalTimeMillis() + timeout
;
1368 // Get the active event loop which we'll use for the message dispatching
1369 // when running in the main thread unless this was explicitly disabled by
1370 // setting wxSOCKET_BLOCK flag
1371 wxEventLoopBase
*eventLoop
;
1372 if ( !(m_flags
& wxSOCKET_BLOCK
) && wxIsMainThread() )
1374 eventLoop
= wxEventLoop::GetActive();
1376 else // in worker thread
1378 // We never dispatch messages from threads other than the main one.
1382 // Make sure the events we're interested in are enabled before waiting for
1383 // them: this is really necessary here as otherwise this could happen:
1384 // 1. DoRead(wxSOCKET_WAITALL) is called
1385 // 2. There is nothing to read so DoWait(wxSOCKET_INPUT_FLAG) is called
1386 // 3. Some, but not all data appears, wxSocketImplUnix::OnReadWaiting()
1387 // is called and wxSOCKET_INPUT_FLAG events are disabled in it
1388 // 4. Because of wxSOCKET_WAITALL we call DoWait() again but the events
1389 // are still disabled and we block forever
1391 // More elegant solution would be nice but for now simply re-enabling the
1392 // events here will do
1393 m_impl
->ReenableEvents(flags
& (wxSOCKET_INPUT_FLAG
| wxSOCKET_OUTPUT_FLAG
));
1396 // Wait until we receive the event we're waiting for or the timeout expires
1397 // (but note that we always execute the loop at least once, even if timeout
1398 // is 0 as this is used for polling)
1400 for ( bool firstTime
= true; !m_interrupt
; firstTime
= false )
1402 long timeLeft
= wxMilliClockToLong(timeEnd
- wxGetLocalTimeMillis());
1411 wxSocketEventFlags events
;
1414 // reset them before starting to wait
1417 eventLoop
->DispatchTimeout(timeLeft
);
1419 events
= m_eventsgot
;
1421 else // no event loop or waiting in another thread
1423 // as explained below, we should always check for wxSOCKET_LOST_FLAG
1425 SetTimeValFromMS(tv
, timeLeft
);
1426 events
= m_impl
->Select(flags
| wxSOCKET_LOST_FLAG
, &tv
);
1429 // always check for wxSOCKET_LOST_FLAG, even if flags doesn't include
1430 // it, as continuing to wait for anything else after getting it is
1432 if ( events
& wxSOCKET_LOST_FLAG
)
1434 m_connected
= false;
1435 m_establishing
= false;
1440 // otherwise mask out the bits we're not interested in
1443 // Incoming connection (server) or connection established (client)?
1444 if ( events
& wxSOCKET_CONNECTION_FLAG
)
1447 m_establishing
= false;
1452 // Data available or output buffer ready?
1453 if ( (events
& wxSOCKET_INPUT_FLAG
) || (events
& wxSOCKET_OUTPUT_FLAG
) )
1463 bool wxSocketBase::Wait(long seconds
, long milliseconds
)
1465 return DoWait(seconds
, milliseconds
,
1466 wxSOCKET_INPUT_FLAG
|
1467 wxSOCKET_OUTPUT_FLAG
|
1468 wxSOCKET_CONNECTION_FLAG
) != 0;
1471 bool wxSocketBase::WaitForRead(long seconds
, long milliseconds
)
1473 // Check pushback buffer before entering DoWait
1477 // Check if the socket is not already ready for input, if it is, there is
1478 // no need to start waiting for it (worse, we'll actually never get a
1479 // notification about the socket becoming ready if it is already under
1481 if ( m_impl
->Select(wxSOCKET_INPUT_FLAG
) )
1484 return DoWait(seconds
, milliseconds
, wxSOCKET_INPUT_FLAG
) != 0;
1488 bool wxSocketBase::WaitForWrite(long seconds
, long milliseconds
)
1490 if ( m_impl
->Select(wxSOCKET_OUTPUT_FLAG
) )
1493 return DoWait(seconds
, milliseconds
, wxSOCKET_OUTPUT_FLAG
) != 0;
1496 bool wxSocketBase::WaitForLost(long seconds
, long milliseconds
)
1498 return DoWait(seconds
, milliseconds
, wxSOCKET_LOST_FLAG
) == -1;
1501 // --------------------------------------------------------------------------
1503 // --------------------------------------------------------------------------
1506 // Get local or peer address
1509 bool wxSocketBase::GetPeer(wxSockAddress
& addr
) const
1511 wxCHECK_MSG( m_impl
, false, "invalid socket" );
1513 const wxSockAddressImpl
& peer
= m_impl
->GetPeer();
1517 addr
.SetAddress(peer
);
1522 bool wxSocketBase::GetLocal(wxSockAddress
& addr
) const
1524 wxCHECK_MSG( m_impl
, false, "invalid socket" );
1526 const wxSockAddressImpl
& local
= m_impl
->GetLocal();
1527 if ( !local
.IsOk() )
1530 addr
.SetAddress(local
);
1536 // Save and restore socket state
1539 void wxSocketBase::SaveState()
1541 wxSocketState
*state
;
1543 state
= new wxSocketState();
1545 state
->m_flags
= m_flags
;
1546 state
->m_notify
= m_notify
;
1547 state
->m_eventmask
= m_eventmask
;
1548 state
->m_clientData
= m_clientData
;
1550 m_states
.Append(state
);
1553 void wxSocketBase::RestoreState()
1555 wxList::compatibility_iterator node
;
1556 wxSocketState
*state
;
1558 node
= m_states
.GetLast();
1562 state
= (wxSocketState
*)node
->GetData();
1564 m_flags
= state
->m_flags
;
1565 m_notify
= state
->m_notify
;
1566 m_eventmask
= state
->m_eventmask
;
1567 m_clientData
= state
->m_clientData
;
1569 m_states
.Erase(node
);
1574 // Timeout and flags
1577 void wxSocketBase::SetTimeout(long seconds
)
1579 m_timeout
= seconds
;
1582 m_impl
->SetTimeout(m_timeout
* 1000);
1585 void wxSocketBase::SetFlags(wxSocketFlags flags
)
1587 // Do some sanity checking on the flags used: not all values can be used
1589 wxASSERT_MSG( !(flags
& wxSOCKET_NOWAIT
) ||
1590 !(flags
& (wxSOCKET_WAITALL
| wxSOCKET_BLOCK
)),
1591 "Using wxSOCKET_WAITALL or wxSOCKET_BLOCK with "
1592 "wxSOCKET_NOWAIT doesn't make sense" );
1598 // --------------------------------------------------------------------------
1600 // --------------------------------------------------------------------------
1602 void wxSocketBase::OnRequest(wxSocketNotify notification
)
1604 wxSocketEventFlags flag
= 0;
1605 switch ( notification
)
1607 case wxSOCKET_INPUT
:
1608 flag
= wxSOCKET_INPUT_FLAG
;
1611 case wxSOCKET_OUTPUT
:
1612 flag
= wxSOCKET_OUTPUT_FLAG
;
1615 case wxSOCKET_CONNECTION
:
1616 flag
= wxSOCKET_CONNECTION_FLAG
;
1618 // we're now successfully connected
1620 m_establishing
= false;
1622 // error was previously set to wxSOCKET_WOULDBLOCK, but this is not
1623 // the case any longer
1624 SetError(wxSOCKET_NOERROR
);
1628 flag
= wxSOCKET_LOST_FLAG
;
1630 // if we lost the connection the socket is now closed and not
1631 // connected any more
1632 m_connected
= false;
1637 wxFAIL_MSG( "unknown wxSocket notification" );
1640 // remember the events which were generated for this socket, we're going to
1641 // use this in DoWait()
1642 m_eventsgot
|= flag
;
1644 // send the wx event if enabled and we're interested in it
1645 if ( m_notify
&& (m_eventmask
& flag
) && m_handler
)
1647 // don't generate the events when we're inside DoWait() called from our
1648 // own code as we are going to consume the data that has just become
1649 // available ourselves and the user code won't see it at all
1650 if ( (notification
== wxSOCKET_INPUT
&& m_reading
) ||
1651 (notification
== wxSOCKET_OUTPUT
&& m_writing
) )
1656 wxSocketEvent
event(m_id
);
1657 event
.m_event
= notification
;
1658 event
.m_clientData
= m_clientData
;
1659 event
.SetEventObject(this);
1661 m_handler
->AddPendingEvent(event
);
1665 void wxSocketBase::Notify(bool notify
)
1670 void wxSocketBase::SetNotify(wxSocketEventFlags flags
)
1672 m_eventmask
= flags
;
1675 void wxSocketBase::SetEventHandler(wxEvtHandler
& handler
, int id
)
1677 m_handler
= &handler
;
1681 // --------------------------------------------------------------------------
1683 // --------------------------------------------------------------------------
1685 void wxSocketBase::Pushback(const void *buffer
, wxUint32 size
)
1689 if (m_unread
== NULL
)
1690 m_unread
= malloc(size
);
1695 tmp
= malloc(m_unrd_size
+ size
);
1696 memcpy((char *)tmp
+ size
, m_unread
, m_unrd_size
);
1702 m_unrd_size
+= size
;
1704 memcpy(m_unread
, buffer
, size
);
1707 wxUint32
wxSocketBase::GetPushback(void *buffer
, wxUint32 size
, bool peek
)
1709 wxCHECK_MSG( buffer
, 0, "NULL buffer" );
1714 if (size
> (m_unrd_size
-m_unrd_cur
))
1715 size
= m_unrd_size
-m_unrd_cur
;
1717 memcpy(buffer
, (char *)m_unread
+ m_unrd_cur
, size
);
1722 if (m_unrd_size
== m_unrd_cur
)
1735 // ==========================================================================
1737 // ==========================================================================
1739 // --------------------------------------------------------------------------
1741 // --------------------------------------------------------------------------
1743 wxSocketServer::wxSocketServer(const wxSockAddress
& addr
,
1744 wxSocketFlags flags
)
1745 : wxSocketBase(flags
, wxSOCKET_SERVER
)
1747 wxLogTrace( wxTRACE_Socket
, wxT("Opening wxSocketServer") );
1749 wxSocketManager
* const manager
= wxSocketManager::Get();
1750 m_impl
= manager
? manager
->CreateSocket(*this) : NULL
;
1754 wxLogTrace( wxTRACE_Socket
, wxT("*** Failed to create m_impl") );
1758 // Setup the socket as server
1759 m_impl
->SetLocal(addr
.GetAddress());
1761 if (GetFlags() & wxSOCKET_REUSEADDR
) {
1762 m_impl
->SetReusable();
1764 if (GetFlags() & wxSOCKET_BROADCAST
) {
1765 m_impl
->SetBroadcast();
1767 if (GetFlags() & wxSOCKET_NOBIND
) {
1768 m_impl
->DontDoBind();
1771 if (m_impl
->CreateServer() != wxSOCKET_NOERROR
)
1776 wxLogTrace( wxTRACE_Socket
, wxT("*** CreateServer() failed") );
1780 wxLogTrace( wxTRACE_Socket
, wxT("wxSocketServer on fd %d"), m_impl
->m_fd
);
1783 // --------------------------------------------------------------------------
1785 // --------------------------------------------------------------------------
1787 bool wxSocketServer::AcceptWith(wxSocketBase
& sock
, bool wait
)
1789 if ( !m_impl
|| (m_impl
->m_fd
== INVALID_SOCKET
) || !m_impl
->IsServer() )
1791 wxFAIL_MSG( "can only be called for a valid server socket" );
1793 SetError(wxSOCKET_INVSOCK
);
1800 // wait until we get a connection
1801 if ( !m_impl
->SelectWithTimeout(wxSOCKET_INPUT_FLAG
) )
1803 SetError(wxSOCKET_TIMEDOUT
);
1809 sock
.m_impl
= m_impl
->Accept(sock
);
1813 SetError(m_impl
->GetLastError());
1818 sock
.m_type
= wxSOCKET_BASE
;
1819 sock
.m_connected
= true;
1824 wxSocketBase
*wxSocketServer::Accept(bool wait
)
1826 wxSocketBase
* sock
= new wxSocketBase();
1828 sock
->SetFlags(m_flags
);
1830 if (!AcceptWith(*sock
, wait
))
1839 bool wxSocketServer::WaitForAccept(long seconds
, long milliseconds
)
1841 return DoWait(seconds
, milliseconds
, wxSOCKET_CONNECTION_FLAG
) == 1;
1844 bool wxSocketBase::GetOption(int level
, int optname
, void *optval
, int *optlen
)
1846 wxASSERT_MSG( m_impl
, wxT("Socket not initialised") );
1848 SOCKOPTLEN_T lenreal
= *optlen
;
1849 if ( getsockopt(m_impl
->m_fd
, level
, optname
,
1850 static_cast<char *>(optval
), &lenreal
) != 0 )
1859 wxSocketBase::SetOption(int level
, int optname
, const void *optval
, int optlen
)
1861 wxASSERT_MSG( m_impl
, wxT("Socket not initialised") );
1863 return setsockopt(m_impl
->m_fd
, level
, optname
,
1864 static_cast<const char *>(optval
), optlen
) == 0;
1867 bool wxSocketBase::SetLocal(const wxIPV4address
& local
)
1869 m_localAddress
= local
;
1874 // ==========================================================================
1876 // ==========================================================================
1878 // --------------------------------------------------------------------------
1880 // --------------------------------------------------------------------------
1882 wxSocketClient::wxSocketClient(wxSocketFlags flags
)
1883 : wxSocketBase(flags
, wxSOCKET_CLIENT
)
1885 m_initialRecvBufferSize
=
1886 m_initialSendBufferSize
= -1;
1889 // --------------------------------------------------------------------------
1891 // --------------------------------------------------------------------------
1893 bool wxSocketClient::DoConnect(const wxSockAddress
& remote
,
1894 const wxSockAddress
* local
,
1899 // Shutdown and destroy the old socket
1904 m_connected
= false;
1905 m_establishing
= false;
1907 // Create and set up the new one
1908 wxSocketManager
* const manager
= wxSocketManager::Get();
1909 m_impl
= manager
? manager
->CreateSocket(*this) : NULL
;
1913 // Reuse makes sense for clients too, if we are trying to rebind to the same port
1914 if (GetFlags() & wxSOCKET_REUSEADDR
)
1915 m_impl
->SetReusable();
1916 if (GetFlags() & wxSOCKET_BROADCAST
)
1917 m_impl
->SetBroadcast();
1918 if (GetFlags() & wxSOCKET_NOBIND
)
1919 m_impl
->DontDoBind();
1921 // Bind to the local IP address and port, when provided or if one had been
1923 if ( !local
&& m_localAddress
.GetAddress().IsOk() )
1924 local
= &m_localAddress
;
1927 m_impl
->SetLocal(local
->GetAddress());
1929 m_impl
->SetInitialSocketBuffers(m_initialRecvBufferSize
, m_initialSendBufferSize
);
1931 m_impl
->SetPeer(remote
.GetAddress());
1933 // Finally do create the socket and connect to the peer
1934 const wxSocketError err
= m_impl
->CreateClient(wait
);
1936 if ( err
!= wxSOCKET_NOERROR
)
1938 if ( err
== wxSOCKET_WOULDBLOCK
)
1940 wxASSERT_MSG( !wait
, "shouldn't get this for blocking connect" );
1942 m_establishing
= true;
1952 bool wxSocketClient::Connect(const wxSockAddress
& remote
, bool wait
)
1954 return DoConnect(remote
, NULL
, wait
);
1957 bool wxSocketClient::Connect(const wxSockAddress
& remote
,
1958 const wxSockAddress
& local
,
1961 return DoConnect(remote
, &local
, wait
);
1964 bool wxSocketClient::WaitOnConnect(long seconds
, long milliseconds
)
1968 // this happens if the initial attempt to connect succeeded without
1973 wxCHECK_MSG( m_establishing
&& m_impl
, false,
1974 "No connection establishment attempt in progress" );
1976 // notice that we return true even if DoWait() returned -1, i.e. if an
1977 // error occurred and connection was lost: this is intentional as we should
1978 // return false only if timeout expired without anything happening
1979 return DoWait(seconds
, milliseconds
, wxSOCKET_CONNECTION_FLAG
) != 0;
1982 // ==========================================================================
1984 // ==========================================================================
1986 wxDatagramSocket::wxDatagramSocket( const wxSockAddress
& addr
,
1987 wxSocketFlags flags
)
1988 : wxSocketBase( flags
, wxSOCKET_DATAGRAM
)
1990 // Create the socket
1991 wxSocketManager
* const manager
= wxSocketManager::Get();
1992 m_impl
= manager
? manager
->CreateSocket(*this) : NULL
;
1997 // Setup the socket as non connection oriented
1998 m_impl
->SetLocal(addr
.GetAddress());
1999 if (flags
& wxSOCKET_REUSEADDR
)
2001 m_impl
->SetReusable();
2003 if (GetFlags() & wxSOCKET_BROADCAST
)
2005 m_impl
->SetBroadcast();
2007 if (GetFlags() & wxSOCKET_NOBIND
)
2009 m_impl
->DontDoBind();
2012 if ( m_impl
->CreateUDP() != wxSOCKET_NOERROR
)
2019 // Initialize all stuff
2020 m_connected
= false;
2021 m_establishing
= false;
2024 wxDatagramSocket
& wxDatagramSocket::RecvFrom( wxSockAddress
& addr
,
2033 wxDatagramSocket
& wxDatagramSocket::SendTo( const wxSockAddress
& addr
,
2037 wxASSERT_MSG( m_impl
, wxT("Socket not initialised") );
2039 m_impl
->SetPeer(addr
.GetAddress());
2044 // ==========================================================================
2046 // ==========================================================================
2048 class wxSocketModule
: public wxModule
2051 virtual bool OnInit()
2053 // wxSocketBase will call Initialize() itself only if sockets are
2054 // really used, don't do it from here
2058 virtual void OnExit()
2060 if ( wxSocketBase::IsInitialized() )
2061 wxSocketBase::Shutdown();
2065 DECLARE_DYNAMIC_CLASS(wxSocketModule
)
2068 IMPLEMENT_DYNAMIC_CLASS(wxSocketModule
, wxModule
)
2070 #if defined(wxUSE_SELECT_DISPATCHER) && wxUSE_SELECT_DISPATCHER
2071 // NOTE: we need to force linking against socketiohandler.cpp otherwise in
2072 // static builds of wxWidgets the ManagerSetter::ManagerSetter ctor
2073 // contained there wouldn't be ever called
2074 wxFORCE_LINK_MODULE( socketiohandler
)
2077 // same for ManagerSetter in the MSW file
2079 wxFORCE_LINK_MODULE( mswsocket
)
2082 // and for OSXManagerSetter in the OS X one
2084 wxFORCE_LINK_MODULE( osxsocket
)
2087 #endif // wxUSE_SOCKETS