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 // Licence: 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 // --------------------------------------------------------------------------
756 // counts the number of calls to Initialize() minus the number of calls to
757 // Shutdown(): we don't really need it any more but it was documented that
758 // Shutdown() must be called the same number of times as Initialize() and using
759 // a counter helps us to check it
760 int gs_socketInitCount
= 0;
762 } // anonymous namespace
764 bool wxSocketBase::IsInitialized()
766 wxASSERT_MSG( wxIsMainThread(), "unsafe to call from other threads" );
768 return gs_socketInitCount
!= 0;
771 bool wxSocketBase::Initialize()
773 wxCHECK_MSG( wxIsMainThread(), false,
774 "must be called from the main thread" );
776 if ( !gs_socketInitCount
)
778 wxSocketManager
* const manager
= wxSocketManager::Get();
779 if ( !manager
|| !manager
->OnInit() )
783 gs_socketInitCount
++;
788 void wxSocketBase::Shutdown()
790 wxCHECK_RET( wxIsMainThread(), "must be called from the main thread" );
792 wxCHECK_RET( gs_socketInitCount
> 0, "too many calls to Shutdown()" );
794 if ( !--gs_socketInitCount
)
796 wxSocketManager
* const manager
= wxSocketManager::Get();
797 wxCHECK_RET( manager
, "should have a socket manager" );
803 // --------------------------------------------------------------------------
805 // --------------------------------------------------------------------------
807 void wxSocketBase::Init()
810 m_type
= wxSOCKET_UNINIT
;
823 m_beingDeleted
= false;
838 // when we create the first socket in the main thread we initialize the
839 // OS-dependent socket stuff: notice that this means that the user code
840 // needs to call wxSocket::Initialize() itself if the first socket it
841 // creates is not created in the main thread
842 if ( wxIsMainThread() )
846 wxLogError(_("Cannot initialize sockets"));
851 wxSocketBase::wxSocketBase()
856 wxSocketBase::wxSocketBase(wxSocketFlags flags
, wxSocketType type
)
865 wxSocketBase::~wxSocketBase()
867 // Shutdown and close the socket
871 // Destroy the implementation object
874 // Free the pushback buffer
878 bool wxSocketBase::Destroy()
880 // Delayed destruction: the socket will be deleted during the next idle
881 // loop iteration. This ensures that all pending events have been
883 m_beingDeleted
= true;
885 // Shutdown and close the socket
888 // Suppress events from now on
891 // Schedule this object for deletion instead of destroying it right now if
892 // it can have other events pending for it and we have a way to do it.
894 // Notice that sockets used in other threads won't have any events for them
895 // and we shouldn't use delayed destruction mechanism for them as it's not
897 if ( wxIsMainThread() && wxTheApp
)
899 wxTheApp
->ScheduleForDestruction(this);
903 // in wxBase we might have no app object at all, don't leak memory
910 // ----------------------------------------------------------------------------
912 // ----------------------------------------------------------------------------
914 void wxSocketBase::SetError(wxSocketError error
)
916 m_impl
->m_error
= error
;
919 wxSocketError
wxSocketBase::LastError() const
921 return m_impl
->GetError();
924 // --------------------------------------------------------------------------
926 // --------------------------------------------------------------------------
928 // The following IO operations update m_lcount:
929 // {Read, Write, ReadMsg, WriteMsg, Peek, Unread, Discard}
930 bool wxSocketBase::Close()
932 // Interrupt pending waits
938 m_establishing
= false;
942 void wxSocketBase::ShutdownOutput()
948 wxSocketBase
& wxSocketBase::Read(void* buffer
, wxUint32 nbytes
)
950 wxSocketReadGuard
read(this);
952 m_lcount_read
= DoRead(buffer
, nbytes
);
953 m_lcount
= m_lcount_read
;
958 wxUint32
wxSocketBase::DoRead(void* buffer_
, wxUint32 nbytes
)
960 wxCHECK_MSG( m_impl
, 0, "socket must be valid" );
962 // We use pointer arithmetic here which doesn't work with void pointers.
963 char *buffer
= static_cast<char *>(buffer_
);
964 wxCHECK_MSG( buffer
, 0, "NULL buffer" );
966 // Try the push back buffer first, even before checking whether the socket
967 // is valid to allow reading previously pushed back data from an already
969 wxUint32 total
= GetPushback(buffer
, nbytes
, false);
975 // our socket is non-blocking so Read() will return immediately if
976 // there is nothing to read yet and it's more efficient to try it first
977 // before entering DoWait() which is going to start dispatching GUI
978 // events and, even more importantly, we must do this under Windows
979 // where we're not going to get notifications about socket being ready
980 // for reading before we read all the existing data from it
981 const int ret
= !m_impl
->m_stream
|| m_connected
982 ? m_impl
->Read(buffer
, nbytes
)
986 if ( m_impl
->GetLastError() == wxSOCKET_WOULDBLOCK
)
988 // if we don't want to wait, just return immediately
989 if ( m_flags
& (wxSOCKET_NOWAIT
|wxSOCKET_NOWAIT_READ
))
991 // this shouldn't be counted as an error in this case
992 SetError(wxSOCKET_NOERROR
);
996 // otherwise wait until the socket becomes ready for reading or
997 // an error occurs on it
998 if ( !DoWaitWithTimeout(wxSOCKET_INPUT_FLAG
) )
1000 // and exit if the timeout elapsed before it did
1001 SetError(wxSOCKET_TIMEDOUT
);
1008 else // "real" error
1010 SetError(wxSOCKET_IOERR
);
1014 else if ( ret
== 0 )
1016 // for connection-oriented (e.g. TCP) sockets we can only read
1017 // 0 bytes if the other end has been closed, and for connectionless
1018 // ones (UDP) this flag doesn't make sense anyhow so we can set it
1019 // to true too without doing any harm
1022 // we're not going to read anything else and so if we haven't read
1023 // anything (or not everything in wxSOCKET_WAITALL case) already,
1025 if ( (m_flags
& (wxSOCKET_WAITALL
|wxSOCKET_WAITALL_READ
)) || !total
)
1026 SetError(wxSOCKET_IOERR
);
1032 // if we are happy to read something and not the entire nbytes bytes,
1034 if ( !(m_flags
& (wxSOCKET_WAITALL
|wxSOCKET_WAITALL_READ
)) )
1044 wxSocketBase
& wxSocketBase::ReadMsg(void* buffer
, wxUint32 nbytes
)
1048 unsigned char sig
[4];
1049 unsigned char len
[4];
1052 wxSocketReadGuard
read(this);
1054 wxSocketWaitModeChanger
changeFlags(this, (wxSOCKET_WAITALL
|wxSOCKET_WAITALL_READ
));
1057 if ( DoRead(&msg
, sizeof(msg
)) == sizeof(msg
) )
1059 wxUint32 sig
= (wxUint32
)msg
.sig
[0];
1060 sig
|= (wxUint32
)(msg
.sig
[1] << 8);
1061 sig
|= (wxUint32
)(msg
.sig
[2] << 16);
1062 sig
|= (wxUint32
)(msg
.sig
[3] << 24);
1064 if ( sig
== 0xfeeddead )
1066 wxUint32 len
= (wxUint32
)msg
.len
[0];
1067 len
|= (wxUint32
)(msg
.len
[1] << 8);
1068 len
|= (wxUint32
)(msg
.len
[2] << 16);
1069 len
|= (wxUint32
)(msg
.len
[3] << 24);
1074 len2
= len
- nbytes
;
1080 // Don't attempt to read if the msg was zero bytes long.
1081 m_lcount_read
= len
? DoRead(buffer
, len
) : 0;
1082 m_lcount
= m_lcount_read
;
1086 char discard_buffer
[MAX_DISCARD_SIZE
];
1089 // NOTE: discarded bytes don't add to m_lcount.
1092 discard_len
= len2
> MAX_DISCARD_SIZE
1095 discard_len
= DoRead(discard_buffer
, (wxUint32
)discard_len
);
1096 len2
-= (wxUint32
)discard_len
;
1098 while ((discard_len
> 0) && len2
);
1101 if ( !len2
&& DoRead(&msg
, sizeof(msg
)) == sizeof(msg
) )
1103 sig
= (wxUint32
)msg
.sig
[0];
1104 sig
|= (wxUint32
)(msg
.sig
[1] << 8);
1105 sig
|= (wxUint32
)(msg
.sig
[2] << 16);
1106 sig
|= (wxUint32
)(msg
.sig
[3] << 24);
1108 if ( sig
== 0xdeadfeed )
1115 SetError(wxSOCKET_IOERR
);
1120 wxSocketBase
& wxSocketBase::Peek(void* buffer
, wxUint32 nbytes
)
1122 wxSocketReadGuard
read(this);
1124 // Peek() should never block
1125 wxSocketWaitModeChanger
changeFlags(this, wxSOCKET_NOWAIT
);
1127 m_lcount
= DoRead(buffer
, nbytes
);
1129 Pushback(buffer
, m_lcount
);
1134 wxSocketBase
& wxSocketBase::Write(const void *buffer
, wxUint32 nbytes
)
1136 wxSocketWriteGuard
write(this);
1138 m_lcount_write
= DoWrite(buffer
, nbytes
);
1139 m_lcount
= m_lcount_write
;
1144 // This function is a mirror image of DoRead() except that it doesn't use the
1145 // push back buffer and doesn't treat 0 return value specially (normally this
1146 // shouldn't happen at all here), so please see comments there for explanations
1147 wxUint32
wxSocketBase::DoWrite(const void *buffer_
, wxUint32 nbytes
)
1149 wxCHECK_MSG( m_impl
, 0, "socket must be valid" );
1151 const char *buffer
= static_cast<const char *>(buffer_
);
1152 wxCHECK_MSG( buffer
, 0, "NULL buffer" );
1157 if ( m_impl
->m_stream
&& !m_connected
)
1159 if ( (m_flags
& (wxSOCKET_WAITALL
|wxSOCKET_WAITALL_WRITE
)) || !total
)
1160 SetError(wxSOCKET_IOERR
);
1164 const int ret
= m_impl
->Write(buffer
, nbytes
);
1167 if ( m_impl
->GetLastError() == wxSOCKET_WOULDBLOCK
)
1169 if ( m_flags
& (wxSOCKET_NOWAIT
|wxSOCKET_NOWAIT_WRITE
) )
1172 if ( !DoWaitWithTimeout(wxSOCKET_OUTPUT_FLAG
) )
1174 SetError(wxSOCKET_TIMEDOUT
);
1180 else // "real" error
1182 SetError(wxSOCKET_IOERR
);
1189 if ( !(m_flags
& (wxSOCKET_WAITALL
|wxSOCKET_WAITALL_WRITE
)) )
1199 wxSocketBase
& wxSocketBase::WriteMsg(const void *buffer
, wxUint32 nbytes
)
1203 unsigned char sig
[4];
1204 unsigned char len
[4];
1207 wxSocketWriteGuard
write(this);
1209 wxSocketWaitModeChanger
changeFlags(this, (wxSOCKET_WAITALL
|wxSOCKET_WAITALL_WRITE
));
1211 msg
.sig
[0] = (unsigned char) 0xad;
1212 msg
.sig
[1] = (unsigned char) 0xde;
1213 msg
.sig
[2] = (unsigned char) 0xed;
1214 msg
.sig
[3] = (unsigned char) 0xfe;
1216 msg
.len
[0] = (unsigned char) (nbytes
& 0xff);
1217 msg
.len
[1] = (unsigned char) ((nbytes
>> 8) & 0xff);
1218 msg
.len
[2] = (unsigned char) ((nbytes
>> 16) & 0xff);
1219 msg
.len
[3] = (unsigned char) ((nbytes
>> 24) & 0xff);
1222 if ( DoWrite(&msg
, sizeof(msg
)) == sizeof(msg
) )
1224 m_lcount_write
= DoWrite(buffer
, nbytes
);
1225 m_lcount
= m_lcount_write
;
1226 if ( m_lcount_write
== nbytes
)
1228 msg
.sig
[0] = (unsigned char) 0xed;
1229 msg
.sig
[1] = (unsigned char) 0xfe;
1230 msg
.sig
[2] = (unsigned char) 0xad;
1231 msg
.sig
[3] = (unsigned char) 0xde;
1235 msg
.len
[3] = (char) 0;
1237 if ( DoWrite(&msg
, sizeof(msg
)) == sizeof(msg
))
1243 SetError(wxSOCKET_IOERR
);
1248 wxSocketBase
& wxSocketBase::Unread(const void *buffer
, wxUint32 nbytes
)
1251 Pushback(buffer
, nbytes
);
1253 SetError(wxSOCKET_NOERROR
);
1259 wxSocketBase
& wxSocketBase::Discard()
1261 char *buffer
= new char[MAX_DISCARD_SIZE
];
1265 wxSocketReadGuard
read(this);
1267 wxSocketWaitModeChanger
changeFlags(this, wxSOCKET_NOWAIT
);
1271 ret
= DoRead(buffer
, MAX_DISCARD_SIZE
);
1274 while (ret
== MAX_DISCARD_SIZE
);
1278 SetError(wxSOCKET_NOERROR
);
1283 // --------------------------------------------------------------------------
1285 // --------------------------------------------------------------------------
1288 This function will check for the events specified in the flags parameter,
1289 and it will return a mask indicating which operations can be performed.
1291 wxSocketEventFlags
wxSocketImpl::Select(wxSocketEventFlags flags
,
1292 const timeval
*timeout
)
1294 if ( m_fd
== INVALID_SOCKET
)
1295 return (wxSOCKET_LOST_FLAG
& flags
);
1301 tv
.tv_sec
= tv
.tv_usec
= 0;
1303 // prepare the FD sets, passing NULL for the one(s) we don't use
1305 readfds
, *preadfds
= NULL
,
1306 writefds
, *pwritefds
= NULL
,
1307 exceptfds
; // always want to know about errors
1309 if ( flags
& wxSOCKET_INPUT_FLAG
)
1310 preadfds
= &readfds
;
1312 if ( flags
& wxSOCKET_OUTPUT_FLAG
)
1313 pwritefds
= &writefds
;
1315 // When using non-blocking connect() the client socket becomes connected
1316 // (successfully or not) when it becomes writable but when using
1317 // non-blocking accept() the server socket becomes connected when it
1318 // becomes readable.
1319 if ( flags
& wxSOCKET_CONNECTION_FLAG
)
1322 preadfds
= &readfds
;
1324 pwritefds
= &writefds
;
1329 wxFD_ZERO(preadfds
);
1330 wxFD_SET(m_fd
, preadfds
);
1335 wxFD_ZERO(pwritefds
);
1336 wxFD_SET(m_fd
, pwritefds
);
1339 wxFD_ZERO(&exceptfds
);
1340 wxFD_SET(m_fd
, &exceptfds
);
1342 const int rc
= select(m_fd
+ 1, preadfds
, pwritefds
, &exceptfds
, &tv
);
1344 // check for errors first
1345 if ( rc
== -1 || wxFD_ISSET(m_fd
, &exceptfds
) )
1347 m_establishing
= false;
1349 return wxSOCKET_LOST_FLAG
& flags
;
1355 wxASSERT_MSG( rc
== 1, "unexpected select() return value" );
1357 wxSocketEventFlags detected
= 0;
1358 if ( preadfds
&& wxFD_ISSET(m_fd
, preadfds
) )
1359 detected
|= wxSOCKET_INPUT_FLAG
;
1361 if ( pwritefds
&& wxFD_ISSET(m_fd
, pwritefds
) )
1363 // check for the case of non-blocking connect()
1364 if ( m_establishing
&& !m_server
)
1367 SOCKOPTLEN_T len
= sizeof(error
);
1368 m_establishing
= false;
1369 getsockopt(m_fd
, SOL_SOCKET
, SO_ERROR
, (char*)&error
, &len
);
1372 detected
= wxSOCKET_LOST_FLAG
;
1374 detected
|= wxSOCKET_CONNECTION_FLAG
;
1376 else // not called to get non-blocking connect() status
1378 detected
|= wxSOCKET_OUTPUT_FLAG
;
1382 return detected
& flags
;
1386 wxSocketBase::DoWait(long seconds
, long milliseconds
, wxSocketEventFlags flags
)
1388 // Use either the provided timeout or the default timeout value associated
1389 // with this socket.
1391 // TODO: allow waiting forever, see #9443
1392 const long timeout
= seconds
== -1 ? m_timeout
* 1000
1393 : seconds
* 1000 + milliseconds
;
1395 return DoWait(timeout
, flags
);
1399 wxSocketBase::DoWait(long timeout
, wxSocketEventFlags flags
)
1401 wxCHECK_MSG( m_impl
, -1, "can't wait on invalid socket" );
1403 // we're never going to become ready in a TCP client if we're not connected
1404 // any more (OTOH a server can call this to precisely wait for a connection
1405 // so do wait for it in this case and UDP client is never "connected")
1406 if ( !m_impl
->IsServer() &&
1407 m_impl
->m_stream
&& !m_connected
&& !m_establishing
)
1410 // This can be set to true from Interrupt() to exit this function a.s.a.p.
1411 m_interrupt
= false;
1414 const wxMilliClock_t timeEnd
= wxGetLocalTimeMillis() + timeout
;
1416 // Get the active event loop which we'll use for the message dispatching
1417 // when running in the main thread unless this was explicitly disabled by
1418 // setting wxSOCKET_BLOCK flag
1419 wxEventLoopBase
*eventLoop
;
1420 if ( !(m_flags
& wxSOCKET_BLOCK
) && wxIsMainThread() )
1422 eventLoop
= wxEventLoop::GetActive();
1424 else // in worker thread
1426 // We never dispatch messages from threads other than the main one.
1430 // Make sure the events we're interested in are enabled before waiting for
1431 // them: this is really necessary here as otherwise this could happen:
1432 // 1. DoRead(wxSOCKET_WAITALL) is called
1433 // 2. There is nothing to read so DoWait(wxSOCKET_INPUT_FLAG) is called
1434 // 3. Some, but not all data appears, wxSocketImplUnix::OnReadWaiting()
1435 // is called and wxSOCKET_INPUT_FLAG events are disabled in it
1436 // 4. Because of wxSOCKET_WAITALL we call DoWait() again but the events
1437 // are still disabled and we block forever
1439 // More elegant solution would be nice but for now simply re-enabling the
1440 // events here will do
1441 m_impl
->ReenableEvents(flags
& (wxSOCKET_INPUT_FLAG
| wxSOCKET_OUTPUT_FLAG
));
1444 // Wait until we receive the event we're waiting for or the timeout expires
1445 // (but note that we always execute the loop at least once, even if timeout
1446 // is 0 as this is used for polling)
1448 for ( bool firstTime
= true; !m_interrupt
; firstTime
= false )
1450 long timeLeft
= wxMilliClockToLong(timeEnd
- wxGetLocalTimeMillis());
1459 wxSocketEventFlags events
;
1462 // reset them before starting to wait
1465 eventLoop
->DispatchTimeout(timeLeft
);
1467 events
= m_eventsgot
;
1469 else // no event loop or waiting in another thread
1471 // as explained below, we should always check for wxSOCKET_LOST_FLAG
1473 SetTimeValFromMS(tv
, timeLeft
);
1474 events
= m_impl
->Select(flags
| wxSOCKET_LOST_FLAG
, &tv
);
1477 // always check for wxSOCKET_LOST_FLAG, even if flags doesn't include
1478 // it, as continuing to wait for anything else after getting it is
1480 if ( events
& wxSOCKET_LOST_FLAG
)
1482 m_connected
= false;
1483 m_establishing
= false;
1488 // otherwise mask out the bits we're not interested in
1491 // Incoming connection (server) or connection established (client)?
1492 if ( events
& wxSOCKET_CONNECTION_FLAG
)
1495 m_establishing
= false;
1500 // Data available or output buffer ready?
1501 if ( (events
& wxSOCKET_INPUT_FLAG
) || (events
& wxSOCKET_OUTPUT_FLAG
) )
1511 bool wxSocketBase::Wait(long seconds
, long milliseconds
)
1513 return DoWait(seconds
, milliseconds
,
1514 wxSOCKET_INPUT_FLAG
|
1515 wxSOCKET_OUTPUT_FLAG
|
1516 wxSOCKET_CONNECTION_FLAG
) != 0;
1519 bool wxSocketBase::WaitForRead(long seconds
, long milliseconds
)
1521 // Check pushback buffer before entering DoWait
1525 // Check if the socket is not already ready for input, if it is, there is
1526 // no need to start waiting for it (worse, we'll actually never get a
1527 // notification about the socket becoming ready if it is already under
1529 if ( m_impl
->Select(wxSOCKET_INPUT_FLAG
) )
1532 return DoWait(seconds
, milliseconds
, wxSOCKET_INPUT_FLAG
) != 0;
1536 bool wxSocketBase::WaitForWrite(long seconds
, long milliseconds
)
1538 if ( m_impl
->Select(wxSOCKET_OUTPUT_FLAG
) )
1541 return DoWait(seconds
, milliseconds
, wxSOCKET_OUTPUT_FLAG
) != 0;
1544 bool wxSocketBase::WaitForLost(long seconds
, long milliseconds
)
1546 return DoWait(seconds
, milliseconds
, wxSOCKET_LOST_FLAG
) == -1;
1549 // --------------------------------------------------------------------------
1551 // --------------------------------------------------------------------------
1554 // Get local or peer address
1557 bool wxSocketBase::GetPeer(wxSockAddress
& addr
) const
1559 wxCHECK_MSG( m_impl
, false, "invalid socket" );
1561 const wxSockAddressImpl
& peer
= m_impl
->GetPeer();
1565 addr
.SetAddress(peer
);
1570 bool wxSocketBase::GetLocal(wxSockAddress
& addr
) const
1572 wxCHECK_MSG( m_impl
, false, "invalid socket" );
1574 const wxSockAddressImpl
& local
= m_impl
->GetLocal();
1575 if ( !local
.IsOk() )
1578 addr
.SetAddress(local
);
1584 // Save and restore socket state
1587 void wxSocketBase::SaveState()
1589 wxSocketState
*state
;
1591 state
= new wxSocketState();
1593 state
->m_flags
= m_flags
;
1594 state
->m_notify
= m_notify
;
1595 state
->m_eventmask
= m_eventmask
;
1596 state
->m_clientData
= m_clientData
;
1598 m_states
.Append(state
);
1601 void wxSocketBase::RestoreState()
1603 wxList::compatibility_iterator node
;
1604 wxSocketState
*state
;
1606 node
= m_states
.GetLast();
1610 state
= (wxSocketState
*)node
->GetData();
1612 m_flags
= state
->m_flags
;
1613 m_notify
= state
->m_notify
;
1614 m_eventmask
= state
->m_eventmask
;
1615 m_clientData
= state
->m_clientData
;
1617 m_states
.Erase(node
);
1622 // Timeout and flags
1625 void wxSocketBase::SetTimeout(long seconds
)
1627 m_timeout
= seconds
;
1630 m_impl
->SetTimeout(m_timeout
* 1000);
1633 void wxSocketBase::SetFlags(wxSocketFlags flags
)
1635 // Do some sanity checking on the flags used: not all values can be used
1637 wxASSERT_MSG( !(flags
& wxSOCKET_NOWAIT
) ||
1638 !(flags
& (wxSOCKET_WAITALL
| wxSOCKET_BLOCK
)),
1639 "Using wxSOCKET_WAITALL or wxSOCKET_BLOCK with "
1640 "wxSOCKET_NOWAIT doesn't make sense" );
1646 // --------------------------------------------------------------------------
1648 // --------------------------------------------------------------------------
1650 void wxSocketBase::OnRequest(wxSocketNotify notification
)
1652 wxSocketEventFlags flag
= 0;
1653 switch ( notification
)
1655 case wxSOCKET_INPUT
:
1656 flag
= wxSOCKET_INPUT_FLAG
;
1659 case wxSOCKET_OUTPUT
:
1660 flag
= wxSOCKET_OUTPUT_FLAG
;
1663 case wxSOCKET_CONNECTION
:
1664 flag
= wxSOCKET_CONNECTION_FLAG
;
1666 // we're now successfully connected
1668 m_establishing
= false;
1670 // error was previously set to wxSOCKET_WOULDBLOCK, but this is not
1671 // the case any longer
1672 SetError(wxSOCKET_NOERROR
);
1676 flag
= wxSOCKET_LOST_FLAG
;
1678 // if we lost the connection the socket is now closed and not
1679 // connected any more
1680 m_connected
= false;
1685 wxFAIL_MSG( "unknown wxSocket notification" );
1688 // remember the events which were generated for this socket, we're going to
1689 // use this in DoWait()
1690 m_eventsgot
|= flag
;
1692 // send the wx event if enabled and we're interested in it
1693 if ( m_notify
&& (m_eventmask
& flag
) && m_handler
)
1695 // don't generate the events when we're inside DoWait() called from our
1696 // own code as we are going to consume the data that has just become
1697 // available ourselves and the user code won't see it at all
1698 if ( (notification
== wxSOCKET_INPUT
&& m_reading
) ||
1699 (notification
== wxSOCKET_OUTPUT
&& m_writing
) )
1704 wxSocketEvent
event(m_id
);
1705 event
.m_event
= notification
;
1706 event
.m_clientData
= m_clientData
;
1707 event
.SetEventObject(this);
1709 m_handler
->AddPendingEvent(event
);
1713 void wxSocketBase::Notify(bool notify
)
1718 void wxSocketBase::SetNotify(wxSocketEventFlags flags
)
1720 m_eventmask
= flags
;
1723 void wxSocketBase::SetEventHandler(wxEvtHandler
& handler
, int id
)
1725 m_handler
= &handler
;
1729 // --------------------------------------------------------------------------
1731 // --------------------------------------------------------------------------
1733 void wxSocketBase::Pushback(const void *buffer
, wxUint32 size
)
1737 if (m_unread
== NULL
)
1738 m_unread
= malloc(size
);
1743 tmp
= malloc(m_unrd_size
+ size
);
1744 memcpy((char *)tmp
+ size
, m_unread
, m_unrd_size
);
1750 m_unrd_size
+= size
;
1752 memcpy(m_unread
, buffer
, size
);
1755 wxUint32
wxSocketBase::GetPushback(void *buffer
, wxUint32 size
, bool peek
)
1757 wxCHECK_MSG( buffer
, 0, "NULL buffer" );
1762 if (size
> (m_unrd_size
-m_unrd_cur
))
1763 size
= m_unrd_size
-m_unrd_cur
;
1765 memcpy(buffer
, (char *)m_unread
+ m_unrd_cur
, size
);
1770 if (m_unrd_size
== m_unrd_cur
)
1783 // ==========================================================================
1785 // ==========================================================================
1787 // --------------------------------------------------------------------------
1789 // --------------------------------------------------------------------------
1791 wxSocketServer::wxSocketServer(const wxSockAddress
& addr
,
1792 wxSocketFlags flags
)
1793 : wxSocketBase(flags
, wxSOCKET_SERVER
)
1795 wxLogTrace( wxTRACE_Socket
, wxT("Opening wxSocketServer") );
1797 wxSocketManager
* const manager
= wxSocketManager::Get();
1798 m_impl
= manager
? manager
->CreateSocket(*this) : NULL
;
1802 wxLogTrace( wxTRACE_Socket
, wxT("*** Failed to create m_impl") );
1806 // Setup the socket as server
1807 m_impl
->SetLocal(addr
.GetAddress());
1809 if (GetFlags() & wxSOCKET_REUSEADDR
) {
1810 m_impl
->SetReusable();
1812 if (GetFlags() & wxSOCKET_BROADCAST
) {
1813 m_impl
->SetBroadcast();
1815 if (GetFlags() & wxSOCKET_NOBIND
) {
1816 m_impl
->DontDoBind();
1819 if (m_impl
->CreateServer() != wxSOCKET_NOERROR
)
1823 wxLogTrace( wxTRACE_Socket
, wxT("*** CreateServer() failed") );
1827 // Notice that we need a cast as SOCKET is 64 bit under Win64 and that the
1828 // cast is safe because a SOCKET is a handle and so limited to 32 (or,
1829 // actually, even 24) bit values anyhow.
1830 wxLogTrace( wxTRACE_Socket
, wxT("wxSocketServer on fd %u"),
1831 static_cast<unsigned>(m_impl
->m_fd
) );
1834 // --------------------------------------------------------------------------
1836 // --------------------------------------------------------------------------
1838 bool wxSocketServer::AcceptWith(wxSocketBase
& sock
, bool wait
)
1840 if ( !m_impl
|| (m_impl
->m_fd
== INVALID_SOCKET
) || !m_impl
->IsServer() )
1842 wxFAIL_MSG( "can only be called for a valid server socket" );
1844 SetError(wxSOCKET_INVSOCK
);
1851 // wait until we get a connection
1852 if ( !m_impl
->SelectWithTimeout(wxSOCKET_INPUT_FLAG
) )
1854 SetError(wxSOCKET_TIMEDOUT
);
1860 sock
.m_impl
= m_impl
->Accept(sock
);
1864 SetError(m_impl
->GetLastError());
1869 sock
.m_type
= wxSOCKET_BASE
;
1870 sock
.m_connected
= true;
1875 wxSocketBase
*wxSocketServer::Accept(bool wait
)
1877 wxSocketBase
* sock
= new wxSocketBase();
1879 sock
->SetFlags(m_flags
);
1881 if (!AcceptWith(*sock
, wait
))
1890 bool wxSocketServer::WaitForAccept(long seconds
, long milliseconds
)
1892 return DoWait(seconds
, milliseconds
, wxSOCKET_CONNECTION_FLAG
) == 1;
1895 bool wxSocketBase::GetOption(int level
, int optname
, void *optval
, int *optlen
)
1897 wxASSERT_MSG( m_impl
, wxT("Socket not initialised") );
1899 SOCKOPTLEN_T lenreal
= *optlen
;
1900 if ( getsockopt(m_impl
->m_fd
, level
, optname
,
1901 static_cast<char *>(optval
), &lenreal
) != 0 )
1910 wxSocketBase::SetOption(int level
, int optname
, const void *optval
, int optlen
)
1912 wxASSERT_MSG( m_impl
, wxT("Socket not initialised") );
1914 return setsockopt(m_impl
->m_fd
, level
, optname
,
1915 static_cast<const char *>(optval
), optlen
) == 0;
1918 bool wxSocketBase::SetLocal(const wxIPV4address
& local
)
1920 m_localAddress
= local
;
1925 // ==========================================================================
1927 // ==========================================================================
1929 // --------------------------------------------------------------------------
1931 // --------------------------------------------------------------------------
1933 wxSocketClient::wxSocketClient(wxSocketFlags flags
)
1934 : wxSocketBase(flags
, wxSOCKET_CLIENT
)
1936 m_initialRecvBufferSize
=
1937 m_initialSendBufferSize
= -1;
1940 // --------------------------------------------------------------------------
1942 // --------------------------------------------------------------------------
1944 bool wxSocketClient::DoConnect(const wxSockAddress
& remote
,
1945 const wxSockAddress
* local
,
1950 // Shutdown and destroy the old socket
1955 m_connected
= false;
1956 m_establishing
= false;
1958 // Create and set up the new one
1959 wxSocketManager
* const manager
= wxSocketManager::Get();
1960 m_impl
= manager
? manager
->CreateSocket(*this) : NULL
;
1964 // Reuse makes sense for clients too, if we are trying to rebind to the same port
1965 if (GetFlags() & wxSOCKET_REUSEADDR
)
1966 m_impl
->SetReusable();
1967 if (GetFlags() & wxSOCKET_BROADCAST
)
1968 m_impl
->SetBroadcast();
1969 if (GetFlags() & wxSOCKET_NOBIND
)
1970 m_impl
->DontDoBind();
1972 // Bind to the local IP address and port, when provided or if one had been
1974 if ( !local
&& m_localAddress
.GetAddress().IsOk() )
1975 local
= &m_localAddress
;
1978 m_impl
->SetLocal(local
->GetAddress());
1980 m_impl
->SetInitialSocketBuffers(m_initialRecvBufferSize
, m_initialSendBufferSize
);
1982 m_impl
->SetPeer(remote
.GetAddress());
1984 // Finally do create the socket and connect to the peer
1985 const wxSocketError err
= m_impl
->CreateClient(wait
);
1987 if ( err
!= wxSOCKET_NOERROR
)
1989 if ( err
== wxSOCKET_WOULDBLOCK
)
1991 wxASSERT_MSG( !wait
, "shouldn't get this for blocking connect" );
1993 m_establishing
= true;
2003 bool wxSocketClient::Connect(const wxSockAddress
& remote
, bool wait
)
2005 return DoConnect(remote
, NULL
, wait
);
2008 bool wxSocketClient::Connect(const wxSockAddress
& remote
,
2009 const wxSockAddress
& local
,
2012 return DoConnect(remote
, &local
, wait
);
2015 bool wxSocketClient::WaitOnConnect(long seconds
, long milliseconds
)
2019 // this happens if the initial attempt to connect succeeded without
2024 wxCHECK_MSG( m_establishing
&& m_impl
, false,
2025 "No connection establishment attempt in progress" );
2027 // notice that we return true even if DoWait() returned -1, i.e. if an
2028 // error occurred and connection was lost: this is intentional as we should
2029 // return false only if timeout expired without anything happening
2030 return DoWait(seconds
, milliseconds
, wxSOCKET_CONNECTION_FLAG
) != 0;
2033 // ==========================================================================
2035 // ==========================================================================
2037 wxDatagramSocket::wxDatagramSocket( const wxSockAddress
& addr
,
2038 wxSocketFlags flags
)
2039 : wxSocketBase( flags
, wxSOCKET_DATAGRAM
)
2041 // Create the socket
2042 wxSocketManager
* const manager
= wxSocketManager::Get();
2043 m_impl
= manager
? manager
->CreateSocket(*this) : NULL
;
2048 // Setup the socket as non connection oriented
2049 m_impl
->SetLocal(addr
.GetAddress());
2050 if (flags
& wxSOCKET_REUSEADDR
)
2052 m_impl
->SetReusable();
2054 if (GetFlags() & wxSOCKET_BROADCAST
)
2056 m_impl
->SetBroadcast();
2058 if (GetFlags() & wxSOCKET_NOBIND
)
2060 m_impl
->DontDoBind();
2063 if ( m_impl
->CreateUDP() != wxSOCKET_NOERROR
)
2069 // Initialize all stuff
2070 m_connected
= false;
2071 m_establishing
= false;
2074 wxDatagramSocket
& wxDatagramSocket::RecvFrom( wxSockAddress
& addr
,
2083 wxDatagramSocket
& wxDatagramSocket::SendTo( const wxSockAddress
& addr
,
2087 wxASSERT_MSG( m_impl
, wxT("Socket not initialised") );
2089 m_impl
->SetPeer(addr
.GetAddress());
2094 // ==========================================================================
2096 // ==========================================================================
2098 class wxSocketModule
: public wxModule
2101 virtual bool OnInit()
2103 // wxSocketBase will call Initialize() itself only if sockets are
2104 // really used, don't do it from here
2108 virtual void OnExit()
2110 if ( wxSocketBase::IsInitialized() )
2111 wxSocketBase::Shutdown();
2115 DECLARE_DYNAMIC_CLASS(wxSocketModule
)
2118 IMPLEMENT_DYNAMIC_CLASS(wxSocketModule
, wxModule
)
2120 #if defined(wxUSE_SELECT_DISPATCHER) && wxUSE_SELECT_DISPATCHER
2121 // NOTE: we need to force linking against socketiohandler.cpp otherwise in
2122 // static builds of wxWidgets the ManagerSetter::ManagerSetter ctor
2123 // contained there wouldn't be ever called
2124 wxFORCE_LINK_MODULE( socketiohandler
)
2127 // same for ManagerSetter in the MSW file
2129 wxFORCE_LINK_MODULE( mswsocket
)
2132 // and for OSXManagerSetter in the OS X one
2134 wxFORCE_LINK_MODULE( osxsocket
)
2137 #endif // wxUSE_SOCKETS