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"
46 #include "wx/private/fd.h"
47 #include "wx/private/socket.h"
53 // we use MSG_NOSIGNAL to avoid getting SIGPIPE when sending data to a remote
54 // host which closed the connection if it is available, otherwise we rely on
55 // SO_NOSIGPIPE existency
57 // this should cover all the current Unix systems (Windows never sends any
58 // signals anyhow) but if we find one that has neither we should explicitly
59 // ignore SIGPIPE for it
61 #define wxSOCKET_MSG_NOSIGNAL MSG_NOSIGNAL
62 #else // MSG_NOSIGNAL not available (BSD including OS X)
63 #if defined(__UNIX__) && !defined(SO_NOSIGPIPE)
64 #error "Writing to socket could generate unhandled SIGPIPE."
65 #error "Please post information about your system to wx-dev."
68 #define wxSOCKET_MSG_NOSIGNAL 0
71 // DLL options compatibility check:
73 WX_CHECK_BUILD_OPTIONS("wxNet")
75 // --------------------------------------------------------------------------
76 // macros and constants
77 // --------------------------------------------------------------------------
80 #define MAX_DISCARD_SIZE (10 * 1024)
82 #define wxTRACE_Socket _T("wxSocket")
84 // --------------------------------------------------------------------------
86 // --------------------------------------------------------------------------
88 IMPLEMENT_CLASS(wxSocketBase
, wxObject
)
89 IMPLEMENT_CLASS(wxSocketServer
, wxSocketBase
)
90 IMPLEMENT_CLASS(wxSocketClient
, wxSocketBase
)
91 IMPLEMENT_CLASS(wxDatagramSocket
, wxSocketBase
)
92 IMPLEMENT_DYNAMIC_CLASS(wxSocketEvent
, wxEvent
)
94 // ----------------------------------------------------------------------------
96 // ----------------------------------------------------------------------------
101 void SetTimeValFromMS(timeval
& tv
, unsigned long ms
)
103 tv
.tv_sec
= (ms
/ 1000);
104 tv
.tv_usec
= (ms
% 1000) * 1000;
107 } // anonymous namespace
109 // --------------------------------------------------------------------------
111 // --------------------------------------------------------------------------
113 class wxSocketState
: public wxObject
116 wxSocketFlags m_flags
;
117 wxSocketEventFlags m_eventmask
;
122 wxSocketState() : wxObject() {}
124 DECLARE_NO_COPY_CLASS(wxSocketState
)
127 // ============================================================================
129 // ============================================================================
131 wxSocketManager
*wxSocketManager::ms_manager
= NULL
;
134 void wxSocketManager::Set(wxSocketManager
*manager
)
136 wxASSERT_MSG( !ms_manager
, "too late to set manager now" );
138 ms_manager
= manager
;
142 void wxSocketManager::Init()
144 wxASSERT_MSG( !ms_manager
, "shouldn't be initialized twice" );
147 Details: Initialize() creates a hidden window as a sink for socket
148 events, such as 'read completed'. wxMSW has only one message loop
149 for the main thread. If Initialize is called in a secondary thread,
150 the socket window will be created for the secondary thread, but
151 since there is no message loop on this thread, it will never
152 receive events and all socket operations will time out.
153 BTW, the main thread must not be stopped using sleep or block
154 on a semaphore (a bad idea in any case) or socket operations
157 On the Mac side, Initialize() stores a pointer to the CFRunLoop for
158 the main thread. Because secondary threads do not have run loops,
159 adding event notifications to the "Current" loop would have no
160 effect at all, events would never fire.
162 wxASSERT_MSG( wxIsMainThread(),
163 "sockets must be initialized from the main thread" );
165 wxAppConsole
* const app
= wxAppConsole::GetInstance();
166 wxCHECK_RET( app
, "sockets can't be initialized without wxApp" );
168 ms_manager
= app
->GetTraits()->GetSocketManager();
171 // ==========================================================================
173 // ==========================================================================
175 wxSocketImpl::wxSocketImpl(wxSocketBase
& wxsocket
)
176 : m_wxsocket(&wxsocket
)
178 m_fd
= INVALID_SOCKET
;
179 m_error
= wxSOCKET_NOERROR
;
183 SetTimeout(wxsocket
.GetTimeout() * 1000);
185 m_establishing
= false;
189 m_initialRecvBufferSize
= -1;
190 m_initialSendBufferSize
= -1;
193 wxSocketImpl::~wxSocketImpl()
195 if ( m_fd
!= INVALID_SOCKET
)
199 bool wxSocketImpl::PreCreateCheck(const wxSockAddressImpl
& addr
)
201 if ( m_fd
!= INVALID_SOCKET
)
203 m_error
= wxSOCKET_INVSOCK
;
209 m_error
= wxSOCKET_INVADDR
;
216 void wxSocketImpl::PostCreation()
218 // FreeBSD variants can't use MSG_NOSIGNAL, and instead use a socket option
220 EnableSocketOption(SO_NOSIGPIPE
);
224 EnableSocketOption(SO_REUSEADDR
);
228 wxASSERT_MSG( !m_stream
, "broadcasting is for datagram sockets only" );
230 EnableSocketOption(SO_BROADCAST
);
233 if ( m_initialRecvBufferSize
>= 0 )
234 SetSocketOption(SO_RCVBUF
, m_initialRecvBufferSize
);
235 if ( m_initialSendBufferSize
>= 0 )
236 SetSocketOption(SO_SNDBUF
, m_initialSendBufferSize
);
238 // we always put our sockets in unblocked mode and handle blocking
239 // ourselves in DoRead/Write() if wxSOCKET_WAITALL is specified
240 UnblockAndRegisterWithEventLoop();
243 wxSocketError
wxSocketImpl::UpdateLocalAddress()
245 WX_SOCKLEN_T lenAddr
= m_local
.GetLen();
246 if ( getsockname(m_fd
, m_local
.GetWritableAddr(), &lenAddr
) != 0 )
249 m_error
= wxSOCKET_IOERR
;
253 return wxSOCKET_NOERROR
;
256 wxSocketError
wxSocketImpl::CreateServer()
258 if ( !PreCreateCheck(m_local
) )
264 // do create the socket
265 m_fd
= socket(m_local
.GetFamily(), SOCK_STREAM
, 0);
267 if ( m_fd
== INVALID_SOCKET
)
269 m_error
= wxSOCKET_IOERR
;
270 return wxSOCKET_IOERR
;
275 // and then bind to and listen on it
277 // FIXME: should we test for m_dobind here?
278 if ( bind(m_fd
, m_local
.GetAddr(), m_local
.GetLen()) != 0 )
279 m_error
= wxSOCKET_IOERR
;
283 if ( listen(m_fd
, 5) != 0 )
284 m_error
= wxSOCKET_IOERR
;
293 // finally retrieve the address we effectively bound to
294 return UpdateLocalAddress();
297 wxSocketError
wxSocketImpl::CreateClient(bool wait
)
299 if ( !PreCreateCheck(m_peer
) )
302 m_fd
= socket(m_peer
.GetFamily(), SOCK_STREAM
, 0);
304 if ( m_fd
== INVALID_SOCKET
)
306 m_error
= wxSOCKET_IOERR
;
307 return wxSOCKET_IOERR
;
312 // If a local address has been set, then bind to it before calling connect
313 if ( m_local
.IsOk() )
315 if ( bind(m_fd
, m_local
.GetAddr(), m_local
.GetLen()) != 0 )
318 m_error
= wxSOCKET_IOERR
;
324 int rc
= connect(m_fd
, m_peer
.GetAddr(), m_peer
.GetLen());
325 if ( rc
== SOCKET_ERROR
)
327 wxSocketError err
= GetLastError();
328 if ( err
== wxSOCKET_WOULDBLOCK
)
330 m_establishing
= true;
332 // block waiting for connection if we should (otherwise just return
333 // wxSOCKET_WOULDBLOCK to the caller)
336 err
= SelectWithTimeout(wxSOCKET_CONNECTION_FLAG
)
339 m_establishing
= false;
347 m_error
= wxSOCKET_NOERROR
;
354 wxSocketError
wxSocketImpl::CreateUDP()
356 if ( !PreCreateCheck(m_local
) )
362 m_fd
= socket(m_local
.GetFamily(), SOCK_DGRAM
, 0);
364 if ( m_fd
== INVALID_SOCKET
)
366 m_error
= wxSOCKET_IOERR
;
367 return wxSOCKET_IOERR
;
374 if ( bind(m_fd
, m_local
.GetAddr(), m_local
.GetLen()) != 0 )
377 m_error
= wxSOCKET_IOERR
;
381 return UpdateLocalAddress();
384 return wxSOCKET_NOERROR
;
387 wxSocketImpl
*wxSocketImpl::Accept(wxSocketBase
& wxsocket
)
389 wxSockAddressStorage from
;
390 WX_SOCKLEN_T fromlen
= sizeof(from
);
391 const SOCKET fd
= accept(m_fd
, &from
.addr
, &fromlen
);
393 if ( fd
== INVALID_SOCKET
)
396 wxSocketImpl
* const sock
= Create(wxsocket
);
398 sock
->m_peer
= wxSockAddressImpl(from
.addr
, fromlen
);
400 sock
->UnblockAndRegisterWithEventLoop();
406 void wxSocketImpl::Close()
408 if ( m_fd
!= INVALID_SOCKET
)
411 m_fd
= INVALID_SOCKET
;
416 * Disallow further read/write operations on this socket, close
417 * the fd and disable all callbacks.
419 void wxSocketImpl::Shutdown()
421 if ( m_fd
!= INVALID_SOCKET
)
423 shutdown(m_fd
, 1 /* SD_SEND */);
429 * Sets the timeout for blocking calls. Time is expressed in
432 void wxSocketImpl::SetTimeout(unsigned long millis
)
434 SetTimeValFromMS(m_timeout
, millis
);
437 void wxSocketImpl::NotifyOnStateChange(wxSocketNotify event
)
439 m_wxsocket
->OnRequest(event
);
442 /* Address handling */
443 wxSocketError
wxSocketImpl::SetLocal(const wxSockAddressImpl
& local
)
445 /* the socket must be initialized, or it must be a server */
446 if (m_fd
!= INVALID_SOCKET
&& !m_server
)
448 m_error
= wxSOCKET_INVSOCK
;
449 return wxSOCKET_INVSOCK
;
454 m_error
= wxSOCKET_INVADDR
;
455 return wxSOCKET_INVADDR
;
460 return wxSOCKET_NOERROR
;
463 wxSocketError
wxSocketImpl::SetPeer(const wxSockAddressImpl
& peer
)
467 m_error
= wxSOCKET_INVADDR
;
468 return wxSOCKET_INVADDR
;
473 return wxSOCKET_NOERROR
;
476 const wxSockAddressImpl
& wxSocketImpl::GetLocal()
478 if ( !m_local
.IsOk() )
479 UpdateLocalAddress();
484 // ----------------------------------------------------------------------------
486 // ----------------------------------------------------------------------------
488 // this macro wraps the given expression (normally a syscall) in a loop which
489 // ignores any interruptions, i.e. reevaluates it again if it failed and errno
492 #define DO_WHILE_EINTR( rc, syscall ) \
496 while ( rc == -1 && errno == EINTR )
498 #define DO_WHILE_EINTR( rc, syscall ) rc = (syscall)
501 int wxSocketImpl::RecvStream(void *buffer
, int size
)
504 DO_WHILE_EINTR( ret
, recv(m_fd
, static_cast<char *>(buffer
), size
, 0) );
508 // receiving 0 bytes for a TCP socket indicates that the connection was
509 // closed by peer so shut down our end as well (for UDP sockets empty
510 // datagrams are also possible)
511 m_establishing
= false;
512 NotifyOnStateChange(wxSOCKET_LOST
);
516 // do not return an error in this case however
522 int wxSocketImpl::SendStream(const void *buffer
, int size
)
525 DO_WHILE_EINTR( ret
, send(m_fd
, static_cast<const char *>(buffer
), size
,
526 wxSOCKET_MSG_NOSIGNAL
) );
531 int wxSocketImpl::RecvDgram(void *buffer
, int size
)
533 wxSockAddressStorage from
;
534 WX_SOCKLEN_T fromlen
= sizeof(from
);
537 DO_WHILE_EINTR( ret
, recvfrom(m_fd
, static_cast<char *>(buffer
), size
,
538 0, &from
.addr
, &fromlen
) );
540 if ( ret
== SOCKET_ERROR
)
543 m_peer
= wxSockAddressImpl(from
.addr
, fromlen
);
544 if ( !m_peer
.IsOk() )
550 int wxSocketImpl::SendDgram(const void *buffer
, int size
)
552 if ( !m_peer
.IsOk() )
554 m_error
= wxSOCKET_INVADDR
;
559 DO_WHILE_EINTR( ret
, sendto(m_fd
, static_cast<const char *>(buffer
), size
,
560 0, m_peer
.GetAddr(), m_peer
.GetLen()) );
565 int wxSocketImpl::Read(void *buffer
, int size
)
567 // server sockets can't be used for IO, only to accept new connections
568 if ( m_fd
== INVALID_SOCKET
|| m_server
)
570 m_error
= wxSOCKET_INVSOCK
;
574 int ret
= m_stream
? RecvStream(buffer
, size
)
575 : RecvDgram(buffer
, size
);
577 m_error
= ret
== SOCKET_ERROR
? GetLastError() : wxSOCKET_NOERROR
;
582 int wxSocketImpl::Write(const void *buffer
, int size
)
584 if ( m_fd
== INVALID_SOCKET
|| m_server
)
586 m_error
= wxSOCKET_INVSOCK
;
590 int ret
= m_stream
? SendStream(buffer
, size
)
591 : SendDgram(buffer
, size
);
593 m_error
= ret
== SOCKET_ERROR
? GetLastError() : wxSOCKET_NOERROR
;
598 // ==========================================================================
600 // ==========================================================================
602 // --------------------------------------------------------------------------
603 // Initialization and shutdown
604 // --------------------------------------------------------------------------
606 // FIXME-MT: all this is MT-unsafe, of course, we should protect all accesses
607 // to m_countInit with a crit section
608 size_t wxSocketBase::m_countInit
= 0;
610 bool wxSocketBase::IsInitialized()
612 return m_countInit
> 0;
615 bool wxSocketBase::Initialize()
617 if ( !m_countInit
++ )
619 wxSocketManager
* const manager
= wxSocketManager::Get();
620 if ( !manager
|| !manager
->OnInit() )
631 void wxSocketBase::Shutdown()
633 // we should be initialized
634 wxASSERT_MSG( m_countInit
> 0, _T("extra call to Shutdown()") );
635 if ( --m_countInit
== 0 )
637 wxSocketManager
* const manager
= wxSocketManager::Get();
638 wxCHECK_RET( manager
, "should have a socket manager" );
644 // --------------------------------------------------------------------------
646 // --------------------------------------------------------------------------
648 void wxSocketBase::Init()
651 m_type
= wxSOCKET_UNINIT
;
662 m_beingDeleted
= false;
677 if ( !IsInitialized() )
679 // this Initialize() will be undone by wxSocketModule::OnExit(), all
680 // the other calls to it should be matched by a call to Shutdown()
685 wxSocketBase::wxSocketBase()
690 wxSocketBase::wxSocketBase(wxSocketFlags flags
, wxSocketType type
)
699 wxSocketBase::~wxSocketBase()
701 // Just in case the app called Destroy() *and* then deleted the socket
702 // immediately: don't leave dangling pointers.
703 wxAppTraits
*traits
= wxTheApp
? wxTheApp
->GetTraits() : NULL
;
705 traits
->RemoveFromPendingDelete(this);
707 // Shutdown and close the socket
711 // Destroy the implementation object
714 // Free the pushback buffer
719 bool wxSocketBase::Destroy()
721 // Delayed destruction: the socket will be deleted during the next idle
722 // loop iteration. This ensures that all pending events have been
724 m_beingDeleted
= true;
726 // Shutdown and close the socket
729 // Suppress events from now on
732 // schedule this object for deletion
733 wxAppTraits
*traits
= wxTheApp
? wxTheApp
->GetTraits() : NULL
;
736 // let the traits object decide what to do with us
737 traits
->ScheduleForDestroy(this);
739 else // no app or no traits
741 // in wxBase we might have no app object at all, don't leak memory
748 // ----------------------------------------------------------------------------
750 // ----------------------------------------------------------------------------
752 void wxSocketBase::SetError(wxSocketError error
)
754 m_impl
->m_error
= error
;
757 wxSocketError
wxSocketBase::LastError() const
759 return m_impl
->GetError();
762 // --------------------------------------------------------------------------
764 // --------------------------------------------------------------------------
766 // The following IO operations update m_lcount:
767 // {Read, Write, ReadMsg, WriteMsg, Peek, Unread, Discard}
768 bool wxSocketBase::Close()
770 // Interrupt pending waits
777 m_establishing
= false;
781 wxSocketBase
& wxSocketBase::Read(void* buffer
, wxUint32 nbytes
)
786 m_lcount
= DoRead(buffer
, nbytes
);
788 // Allow read events from now on
794 wxUint32
wxSocketBase::DoRead(void* buffer_
, wxUint32 nbytes
)
796 // We use pointer arithmetic here which doesn't work with void pointers.
797 char *buffer
= static_cast<char *>(buffer_
);
799 // Try the push back buffer first, even before checking whether the socket
800 // is valid to allow reading previously pushed back data from an already
802 wxUint32 total
= GetPushback(buffer
, nbytes
, false);
806 // If it's indeed closed or if read everything, there is nothing more to do.
807 if ( !m_impl
|| !nbytes
)
810 wxCHECK_MSG( buffer
, 0, "NULL buffer" );
813 // wxSOCKET_NOWAIT overrides all the other flags and means that we are
814 // polling the socket and don't block at all.
815 if ( m_flags
& wxSOCKET_NOWAIT
)
817 int ret
= m_impl
->Read(buffer
, nbytes
);
820 if ( m_impl
->GetLastError() != wxSOCKET_WOULDBLOCK
)
821 SetError(wxSOCKET_IOERR
);
823 else // not an error, even if we didn't read anything
828 else // blocking socket
832 // Wait until socket becomes ready for reading
833 if ( !WaitForRead() )
836 const int ret
= m_impl
->Read(buffer
, nbytes
);
839 // for connection-oriented (e.g. TCP) sockets we can only read
840 // 0 bytes if the other end has been closed, and for
841 // connectionless ones (UDP) this flag doesn't make sense
842 // anyhow so we can set it to true too without doing any harm
849 SetError(wxSOCKET_IOERR
);
855 // If wxSOCKET_WAITALL is not set, we can leave now as we did read
856 // something and we don't need to wait for all nbytes bytes to be
858 if ( !(m_flags
& wxSOCKET_WAITALL
) )
861 // Otherwise continue reading until we do read everything.
869 // it's an error to not read everything in wxSOCKET_WAITALL mode or to
870 // not read anything otherwise
871 if ( ((m_flags
& wxSOCKET_WAITALL
) && nbytes
) || !total
)
872 SetError(wxSOCKET_IOERR
);
878 wxSocketBase
& wxSocketBase::ReadMsg(void* buffer
, wxUint32 nbytes
)
882 unsigned char sig
[4];
883 unsigned char len
[4];
889 int old_flags
= m_flags
;
890 SetFlags((m_flags
& wxSOCKET_BLOCK
) | wxSOCKET_WAITALL
);
893 if ( DoRead(&msg
, sizeof(msg
)) == sizeof(msg
) )
895 wxUint32 sig
= (wxUint32
)msg
.sig
[0];
896 sig
|= (wxUint32
)(msg
.sig
[1] << 8);
897 sig
|= (wxUint32
)(msg
.sig
[2] << 16);
898 sig
|= (wxUint32
)(msg
.sig
[3] << 24);
900 if ( sig
== 0xfeeddead )
902 wxUint32 len
= (wxUint32
)msg
.len
[0];
903 len
|= (wxUint32
)(msg
.len
[1] << 8);
904 len
|= (wxUint32
)(msg
.len
[2] << 16);
905 len
|= (wxUint32
)(msg
.len
[3] << 24);
916 // Don't attempt to read if the msg was zero bytes long.
917 m_lcount
= len
? DoRead(buffer
, len
) : 0;
921 char discard_buffer
[MAX_DISCARD_SIZE
];
924 // NOTE: discarded bytes don't add to m_lcount.
927 discard_len
= len2
> MAX_DISCARD_SIZE
930 discard_len
= DoRead(discard_buffer
, (wxUint32
)discard_len
);
931 len2
-= (wxUint32
)discard_len
;
933 while ((discard_len
> 0) && len2
);
936 if ( !len2
&& DoRead(&msg
, sizeof(msg
)) == sizeof(msg
) )
938 sig
= (wxUint32
)msg
.sig
[0];
939 sig
|= (wxUint32
)(msg
.sig
[1] << 8);
940 sig
|= (wxUint32
)(msg
.sig
[2] << 16);
941 sig
|= (wxUint32
)(msg
.sig
[3] << 24);
943 if ( sig
== 0xdeadfeed )
950 SetError(wxSOCKET_IOERR
);
958 wxSocketBase
& wxSocketBase::Peek(void* buffer
, wxUint32 nbytes
)
963 m_lcount
= DoRead(buffer
, nbytes
);
964 Pushback(buffer
, m_lcount
);
966 // Allow read events again
972 wxSocketBase
& wxSocketBase::Write(const void *buffer
, wxUint32 nbytes
)
977 m_lcount
= DoWrite(buffer
, nbytes
);
979 // Allow write events again
985 // This function is a mirror image of DoRead() except that it doesn't use the
986 // push back buffer, please see comments there
987 wxUint32
wxSocketBase::DoWrite(const void *buffer_
, wxUint32 nbytes
)
989 const char *buffer
= static_cast<const char *>(buffer_
);
991 // Return if there is nothing to read or the socket is (already?) closed.
992 if ( !m_impl
|| !nbytes
)
995 wxCHECK_MSG( buffer
, 0, "NULL buffer" );
998 if ( m_flags
& wxSOCKET_NOWAIT
)
1000 const int ret
= m_impl
->Write(buffer
, nbytes
);
1003 if ( m_impl
->GetLastError() != wxSOCKET_WOULDBLOCK
)
1004 SetError(wxSOCKET_IOERR
);
1011 else // blocking socket
1015 if ( !WaitForWrite() )
1018 const int ret
= m_impl
->Write(buffer
, nbytes
);
1027 SetError(wxSOCKET_IOERR
);
1032 if ( !(m_flags
& wxSOCKET_WAITALL
) )
1042 if ( ((m_flags
& wxSOCKET_WAITALL
) && nbytes
) || !total
)
1043 SetError(wxSOCKET_IOERR
);
1049 wxSocketBase
& wxSocketBase::WriteMsg(const void *buffer
, wxUint32 nbytes
)
1053 unsigned char sig
[4];
1054 unsigned char len
[4];
1057 // Mask write events
1060 const int old_flags
= m_flags
;
1061 SetFlags((m_flags
& wxSOCKET_BLOCK
) | wxSOCKET_WAITALL
);
1063 msg
.sig
[0] = (unsigned char) 0xad;
1064 msg
.sig
[1] = (unsigned char) 0xde;
1065 msg
.sig
[2] = (unsigned char) 0xed;
1066 msg
.sig
[3] = (unsigned char) 0xfe;
1068 msg
.len
[0] = (unsigned char) (nbytes
& 0xff);
1069 msg
.len
[1] = (unsigned char) ((nbytes
>> 8) & 0xff);
1070 msg
.len
[2] = (unsigned char) ((nbytes
>> 16) & 0xff);
1071 msg
.len
[3] = (unsigned char) ((nbytes
>> 24) & 0xff);
1074 if ( DoWrite(&msg
, sizeof(msg
)) == sizeof(msg
) )
1076 m_lcount
= DoWrite(buffer
, nbytes
);
1077 if ( m_lcount
== nbytes
)
1079 msg
.sig
[0] = (unsigned char) 0xed;
1080 msg
.sig
[1] = (unsigned char) 0xfe;
1081 msg
.sig
[2] = (unsigned char) 0xad;
1082 msg
.sig
[3] = (unsigned char) 0xde;
1086 msg
.len
[3] = (char) 0;
1088 if ( DoWrite(&msg
, sizeof(msg
)) == sizeof(msg
))
1094 SetError(wxSOCKET_IOERR
);
1097 SetFlags(old_flags
);
1102 wxSocketBase
& wxSocketBase::Unread(const void *buffer
, wxUint32 nbytes
)
1105 Pushback(buffer
, nbytes
);
1107 SetError(wxSOCKET_NOERROR
);
1113 wxSocketBase
& wxSocketBase::Discard()
1115 char *buffer
= new char[MAX_DISCARD_SIZE
];
1122 const int old_flags
= m_flags
;
1123 SetFlags(wxSOCKET_NOWAIT
);
1127 ret
= DoRead(buffer
, MAX_DISCARD_SIZE
);
1130 while (ret
== MAX_DISCARD_SIZE
);
1134 SetError(wxSOCKET_NOERROR
);
1136 // Allow read events again
1139 SetFlags(old_flags
);
1144 // --------------------------------------------------------------------------
1146 // --------------------------------------------------------------------------
1149 This function will check for the events specified in the flags parameter,
1150 and it will return a mask indicating which operations can be performed.
1152 wxSocketEventFlags
wxSocketImpl::Select(wxSocketEventFlags flags
,
1153 const timeval
*timeout
)
1155 if ( m_fd
== INVALID_SOCKET
)
1156 return (wxSOCKET_LOST_FLAG
& flags
);
1162 tv
.tv_sec
= tv
.tv_usec
= 0;
1164 // prepare the FD sets, passing NULL for the one(s) we don't use
1166 readfds
, *preadfds
= NULL
,
1167 writefds
, *pwritefds
= NULL
,
1168 exceptfds
; // always want to know about errors
1170 if ( flags
& wxSOCKET_INPUT_FLAG
)
1172 preadfds
= &readfds
;
1173 wxFD_ZERO(preadfds
);
1174 wxFD_SET(m_fd
, preadfds
);
1177 // when using non-blocking connect() the socket becomes connected
1178 // (successfully or not) when it becomes writable
1179 if ( flags
& (wxSOCKET_OUTPUT_FLAG
| wxSOCKET_CONNECTION_FLAG
) )
1181 pwritefds
= &writefds
;
1182 wxFD_ZERO(pwritefds
);
1183 wxFD_SET(m_fd
, pwritefds
);
1186 wxFD_ZERO(&exceptfds
);
1187 wxFD_SET(m_fd
, &exceptfds
);
1189 const int rc
= select(m_fd
+ 1, preadfds
, pwritefds
, &exceptfds
, &tv
);
1191 // check for errors first
1192 if ( rc
== -1 || wxFD_ISSET(m_fd
, &exceptfds
) )
1194 m_establishing
= false;
1196 return wxSOCKET_LOST_FLAG
& flags
;
1202 wxASSERT_MSG( rc
== 1, "unexpected select() return value" );
1204 wxSocketEventFlags detected
= 0;
1205 if ( preadfds
&& wxFD_ISSET(m_fd
, preadfds
) )
1206 detected
|= wxSOCKET_INPUT_FLAG
;
1208 if ( pwritefds
&& wxFD_ISSET(m_fd
, pwritefds
) )
1210 // check for the case of non-blocking connect()
1211 if ( m_establishing
&& !m_server
)
1214 SOCKOPTLEN_T len
= sizeof(error
);
1215 m_establishing
= false;
1216 getsockopt(m_fd
, SOL_SOCKET
, SO_ERROR
, (char*)&error
, &len
);
1219 detected
= wxSOCKET_LOST_FLAG
;
1221 detected
|= wxSOCKET_CONNECTION_FLAG
;
1223 else // not called to get non-blocking connect() status
1225 detected
|= wxSOCKET_OUTPUT_FLAG
;
1229 return detected
& flags
;
1233 wxSocketBase::DoWait(long seconds
, long milliseconds
, wxSocketEventFlags flags
)
1235 wxCHECK_MSG( m_impl
, false, "can't wait on invalid socket" );
1237 // This can be set to true from Interrupt() to exit this function a.s.a.p.
1238 m_interrupt
= false;
1241 // Use either the provided timeout or the default timeout value associated
1242 // with this socket.
1244 // TODO: allow waiting forever, see #9443
1245 const long timeout
= seconds
== -1 ? m_timeout
* 1000
1246 : seconds
* 1000 + milliseconds
;
1247 const wxMilliClock_t timeEnd
= wxGetLocalTimeMillis() + timeout
;
1249 // Get the active event loop which we'll use for the message dispatching
1250 // when running in the main thread unless this was explicitly disabled by
1251 // setting wxSOCKET_BLOCK flag
1252 wxEventLoopBase
*eventLoop
;
1253 if ( !(m_flags
& wxSOCKET_BLOCK
) && wxIsMainThread() )
1255 eventLoop
= wxEventLoop::GetActive();
1257 else // in worker thread
1259 // We never dispatch messages from threads other than the main one.
1263 // Wait until we receive the event we're waiting for or the timeout expires
1264 // (but note that we always execute the loop at least once, even if timeout
1265 // is 0 as this is used for polling)
1266 bool gotEvent
= false;
1267 for ( bool firstTime
= true; !m_interrupt
; firstTime
= false )
1269 long timeLeft
= wxMilliClockToLong(timeEnd
- wxGetLocalTimeMillis());
1278 // This function is only called if wxSOCKET_BLOCK flag was not used and
1279 // so we should dispatch the events if there is an event loop capable
1281 wxSocketEventFlags events
;
1284 // reset them before starting to wait
1287 eventLoop
->DispatchTimeout(timeLeft
);
1289 events
= m_eventsgot
;
1291 else // no event loop or waiting in another thread
1293 // as explained below, we should always check for wxSOCKET_LOST_FLAG
1295 SetTimeValFromMS(tv
, timeLeft
);
1296 events
= m_impl
->Select(flags
| wxSOCKET_LOST_FLAG
, &tv
);
1299 // always check for wxSOCKET_LOST_FLAG, even if flags doesn't include
1300 // it, as continuing to wait for anything else after getting it is
1302 if ( events
& wxSOCKET_LOST_FLAG
)
1304 m_connected
= false;
1305 m_establishing
= false;
1306 if ( flags
& wxSOCKET_LOST_FLAG
)
1311 // otherwise mask out the bits we're not interested in
1314 // Incoming connection (server) or connection established (client)?
1315 if ( events
& wxSOCKET_CONNECTION_FLAG
)
1318 m_establishing
= false;
1323 // Data available or output buffer ready?
1324 if ( (events
& wxSOCKET_INPUT_FLAG
) || (events
& wxSOCKET_OUTPUT_FLAG
) )
1334 bool wxSocketBase::Wait(long seconds
, long milliseconds
)
1336 return DoWait(seconds
, milliseconds
,
1337 wxSOCKET_INPUT_FLAG
|
1338 wxSOCKET_OUTPUT_FLAG
|
1339 wxSOCKET_CONNECTION_FLAG
|
1344 bool wxSocketBase::WaitForRead(long seconds
, long milliseconds
)
1346 // Check pushback buffer before entering DoWait
1350 // Note that wxSOCKET_INPUT_LOST has to be explicitly passed to DoWait
1351 // because of the semantics of WaitForRead: a return value of true means
1352 // that a Read call will return immediately, not that there is
1353 // actually data to read.
1354 return DoWait(seconds
, milliseconds
, wxSOCKET_INPUT_FLAG
| wxSOCKET_LOST_FLAG
);
1358 bool wxSocketBase::WaitForWrite(long seconds
, long milliseconds
)
1360 return DoWait(seconds
, milliseconds
, wxSOCKET_OUTPUT_FLAG
| wxSOCKET_LOST_FLAG
);
1363 bool wxSocketBase::WaitForLost(long seconds
, long milliseconds
)
1365 return DoWait(seconds
, milliseconds
, wxSOCKET_LOST_FLAG
);
1368 // --------------------------------------------------------------------------
1370 // --------------------------------------------------------------------------
1373 // Get local or peer address
1376 bool wxSocketBase::GetPeer(wxSockAddress
& addr
) const
1378 wxCHECK_MSG( m_impl
, false, "invalid socket" );
1380 const wxSockAddressImpl
& peer
= m_impl
->GetPeer();
1384 addr
.SetAddress(peer
);
1389 bool wxSocketBase::GetLocal(wxSockAddress
& addr
) const
1391 wxCHECK_MSG( m_impl
, false, "invalid socket" );
1393 const wxSockAddressImpl
& local
= m_impl
->GetLocal();
1394 if ( !local
.IsOk() )
1397 addr
.SetAddress(local
);
1403 // Save and restore socket state
1406 void wxSocketBase::SaveState()
1408 wxSocketState
*state
;
1410 state
= new wxSocketState();
1412 state
->m_flags
= m_flags
;
1413 state
->m_notify
= m_notify
;
1414 state
->m_eventmask
= m_eventmask
;
1415 state
->m_clientData
= m_clientData
;
1417 m_states
.Append(state
);
1420 void wxSocketBase::RestoreState()
1422 wxList::compatibility_iterator node
;
1423 wxSocketState
*state
;
1425 node
= m_states
.GetLast();
1429 state
= (wxSocketState
*)node
->GetData();
1431 m_flags
= state
->m_flags
;
1432 m_notify
= state
->m_notify
;
1433 m_eventmask
= state
->m_eventmask
;
1434 m_clientData
= state
->m_clientData
;
1436 m_states
.Erase(node
);
1441 // Timeout and flags
1444 void wxSocketBase::SetTimeout(long seconds
)
1446 m_timeout
= seconds
;
1449 m_impl
->SetTimeout(m_timeout
* 1000);
1452 void wxSocketBase::SetFlags(wxSocketFlags flags
)
1454 // Do some sanity checking on the flags used: not all values can be used
1456 wxASSERT_MSG( !(flags
& wxSOCKET_NOWAIT
) ||
1457 !(flags
& (wxSOCKET_WAITALL
| wxSOCKET_BLOCK
)),
1458 "Using wxSOCKET_WAITALL or wxSOCKET_BLOCK with "
1459 "wxSOCKET_NOWAIT doesn't make sense" );
1465 // --------------------------------------------------------------------------
1467 // --------------------------------------------------------------------------
1469 void wxSocketBase::OnRequest(wxSocketNotify notification
)
1471 wxSocketEventFlags flag
= 0;
1472 switch ( notification
)
1474 case wxSOCKET_INPUT
:
1475 flag
= wxSOCKET_INPUT_FLAG
;
1478 case wxSOCKET_OUTPUT
:
1479 flag
= wxSOCKET_OUTPUT_FLAG
;
1482 case wxSOCKET_CONNECTION
:
1483 flag
= wxSOCKET_CONNECTION_FLAG
;
1487 flag
= wxSOCKET_LOST_FLAG
;
1491 wxFAIL_MSG( "unknown wxSocket notification" );
1494 // if we lost the connection the socket is now closed
1495 if ( notification
== wxSOCKET_LOST
)
1498 // remember the events which were generated for this socket, we're going to
1499 // use this in DoWait()
1500 m_eventsgot
|= flag
;
1502 // send the wx event if enabled and we're interested in it
1503 if ( m_notify
&& (m_eventmask
& flag
) && m_handler
)
1505 // If we are in the middle of a R/W operation, do not propagate events
1506 // to users. Also, filter 'late' events which are no longer valid.
1507 if ( notification
== wxSOCKET_INPUT
)
1509 if ( m_reading
|| !m_impl
->Select(wxSOCKET_INPUT_FLAG
) )
1512 else if ( notification
== wxSOCKET_OUTPUT
)
1514 if ( m_writing
|| !m_impl
->Select(wxSOCKET_OUTPUT_FLAG
) )
1518 wxSocketEvent
event(m_id
);
1519 event
.m_event
= notification
;
1520 event
.m_clientData
= m_clientData
;
1521 event
.SetEventObject(this);
1523 m_handler
->AddPendingEvent(event
);
1527 void wxSocketBase::Notify(bool notify
)
1532 void wxSocketBase::SetNotify(wxSocketEventFlags flags
)
1534 m_eventmask
= flags
;
1537 void wxSocketBase::SetEventHandler(wxEvtHandler
& handler
, int id
)
1539 m_handler
= &handler
;
1543 // --------------------------------------------------------------------------
1545 // --------------------------------------------------------------------------
1547 void wxSocketBase::Pushback(const void *buffer
, wxUint32 size
)
1551 if (m_unread
== NULL
)
1552 m_unread
= malloc(size
);
1557 tmp
= malloc(m_unrd_size
+ size
);
1558 memcpy((char *)tmp
+ size
, m_unread
, m_unrd_size
);
1564 m_unrd_size
+= size
;
1566 memcpy(m_unread
, buffer
, size
);
1569 wxUint32
wxSocketBase::GetPushback(void *buffer
, wxUint32 size
, bool peek
)
1571 wxCHECK_MSG( buffer
, 0, "NULL buffer" );
1576 if (size
> (m_unrd_size
-m_unrd_cur
))
1577 size
= m_unrd_size
-m_unrd_cur
;
1579 memcpy(buffer
, (char *)m_unread
+ m_unrd_cur
, size
);
1584 if (m_unrd_size
== m_unrd_cur
)
1597 // ==========================================================================
1599 // ==========================================================================
1601 // --------------------------------------------------------------------------
1603 // --------------------------------------------------------------------------
1605 wxSocketServer::wxSocketServer(const wxSockAddress
& addr
,
1606 wxSocketFlags flags
)
1607 : wxSocketBase(flags
, wxSOCKET_SERVER
)
1609 wxLogTrace( wxTRACE_Socket
, _T("Opening wxSocketServer") );
1611 m_impl
= wxSocketImpl::Create(*this);
1615 wxLogTrace( wxTRACE_Socket
, _T("*** Failed to create m_impl") );
1619 // Setup the socket as server
1620 m_impl
->SetLocal(addr
.GetAddress());
1622 if (GetFlags() & wxSOCKET_REUSEADDR
) {
1623 m_impl
->SetReusable();
1625 if (GetFlags() & wxSOCKET_BROADCAST
) {
1626 m_impl
->SetBroadcast();
1628 if (GetFlags() & wxSOCKET_NOBIND
) {
1629 m_impl
->DontDoBind();
1632 if (m_impl
->CreateServer() != wxSOCKET_NOERROR
)
1637 wxLogTrace( wxTRACE_Socket
, _T("*** CreateServer() failed") );
1641 wxLogTrace( wxTRACE_Socket
, _T("wxSocketServer on fd %d"), m_impl
->m_fd
);
1644 // --------------------------------------------------------------------------
1646 // --------------------------------------------------------------------------
1648 bool wxSocketServer::AcceptWith(wxSocketBase
& sock
, bool wait
)
1650 if ( !m_impl
|| (m_impl
->m_fd
== INVALID_SOCKET
) || !m_impl
->IsServer() )
1652 wxFAIL_MSG( "can only be called for a valid server socket" );
1654 SetError(wxSOCKET_INVSOCK
);
1661 // wait until we get a connection
1662 if ( !m_impl
->SelectWithTimeout(wxSOCKET_INPUT_FLAG
) )
1664 SetError(wxSOCKET_TIMEDOUT
);
1670 sock
.m_impl
= m_impl
->Accept(sock
);
1674 SetError(m_impl
->GetLastError());
1679 sock
.m_type
= wxSOCKET_BASE
;
1680 sock
.m_connected
= true;
1685 wxSocketBase
*wxSocketServer::Accept(bool wait
)
1687 wxSocketBase
* sock
= new wxSocketBase();
1689 sock
->SetFlags(m_flags
);
1691 if (!AcceptWith(*sock
, wait
))
1700 bool wxSocketServer::WaitForAccept(long seconds
, long milliseconds
)
1702 return DoWait(seconds
, milliseconds
, wxSOCKET_CONNECTION_FLAG
);
1705 bool wxSocketBase::GetOption(int level
, int optname
, void *optval
, int *optlen
)
1707 wxASSERT_MSG( m_impl
, _T("Socket not initialised") );
1709 SOCKOPTLEN_T lenreal
= *optlen
;
1710 if ( getsockopt(m_impl
->m_fd
, level
, optname
,
1711 static_cast<char *>(optval
), &lenreal
) != 0 )
1720 wxSocketBase::SetOption(int level
, int optname
, const void *optval
, int optlen
)
1722 wxASSERT_MSG( m_impl
, _T("Socket not initialised") );
1724 return setsockopt(m_impl
->m_fd
, level
, optname
,
1725 static_cast<const char *>(optval
), optlen
) == 0;
1728 bool wxSocketBase::SetLocal(const wxIPV4address
& local
)
1730 m_localAddress
= local
;
1735 // ==========================================================================
1737 // ==========================================================================
1739 // --------------------------------------------------------------------------
1741 // --------------------------------------------------------------------------
1743 wxSocketClient::wxSocketClient(wxSocketFlags flags
)
1744 : wxSocketBase(flags
, wxSOCKET_CLIENT
)
1746 m_initialRecvBufferSize
=
1747 m_initialSendBufferSize
= -1;
1750 wxSocketClient::~wxSocketClient()
1754 // --------------------------------------------------------------------------
1756 // --------------------------------------------------------------------------
1758 bool wxSocketClient::DoConnect(const wxSockAddress
& remote
,
1759 const wxSockAddress
* local
,
1764 // Shutdown and destroy the old socket
1769 m_connected
= false;
1770 m_establishing
= false;
1772 // Create and set up the new one
1773 m_impl
= wxSocketImpl::Create(*this);
1777 // Reuse makes sense for clients too, if we are trying to rebind to the same port
1778 if (GetFlags() & wxSOCKET_REUSEADDR
)
1779 m_impl
->SetReusable();
1780 if (GetFlags() & wxSOCKET_BROADCAST
)
1781 m_impl
->SetBroadcast();
1782 if (GetFlags() & wxSOCKET_NOBIND
)
1783 m_impl
->DontDoBind();
1785 // Bind to the local IP address and port, when provided or if one had been
1787 if ( !local
&& m_localAddress
.GetAddress().IsOk() )
1788 local
= &m_localAddress
;
1791 m_impl
->SetLocal(local
->GetAddress());
1793 m_impl
->SetInitialSocketBuffers(m_initialRecvBufferSize
, m_initialSendBufferSize
);
1795 m_impl
->SetPeer(remote
.GetAddress());
1797 // Finally do create the socket and connect to the peer
1798 const wxSocketError err
= m_impl
->CreateClient(wait
);
1800 if ( err
!= wxSOCKET_NOERROR
)
1802 if ( err
== wxSOCKET_WOULDBLOCK
)
1804 wxASSERT_MSG( !wait
, "shouldn't get this for blocking connect" );
1806 m_establishing
= true;
1816 bool wxSocketClient::Connect(const wxSockAddress
& remote
, bool wait
)
1818 return DoConnect(remote
, NULL
, wait
);
1821 bool wxSocketClient::Connect(const wxSockAddress
& remote
,
1822 const wxSockAddress
& local
,
1825 return DoConnect(remote
, &local
, wait
);
1828 bool wxSocketClient::WaitOnConnect(long seconds
, long milliseconds
)
1832 // this happens if the initial attempt to connect succeeded without
1837 wxCHECK_MSG( m_establishing
&& m_impl
, false,
1838 "No connection establishment attempt in progress" );
1840 // we must specify wxSOCKET_LOST_FLAG here explicitly because we must return
1841 // true if the connection establishment process is finished, whether it is
1842 // over because we successfully connected or because we were not able to
1844 return DoWait(seconds
, milliseconds
,
1845 wxSOCKET_CONNECTION_FLAG
| wxSOCKET_LOST_FLAG
);
1848 // ==========================================================================
1850 // ==========================================================================
1852 wxDatagramSocket::wxDatagramSocket( const wxSockAddress
& addr
,
1853 wxSocketFlags flags
)
1854 : wxSocketBase( flags
, wxSOCKET_DATAGRAM
)
1856 // Create the socket
1857 m_impl
= wxSocketImpl::Create(*this);
1862 // Setup the socket as non connection oriented
1863 m_impl
->SetLocal(addr
.GetAddress());
1864 if (flags
& wxSOCKET_REUSEADDR
)
1866 m_impl
->SetReusable();
1868 if (GetFlags() & wxSOCKET_BROADCAST
)
1870 m_impl
->SetBroadcast();
1872 if (GetFlags() & wxSOCKET_NOBIND
)
1874 m_impl
->DontDoBind();
1877 if ( m_impl
->CreateUDP() != wxSOCKET_NOERROR
)
1884 // Initialize all stuff
1885 m_connected
= false;
1886 m_establishing
= false;
1889 wxDatagramSocket
& wxDatagramSocket::RecvFrom( wxSockAddress
& addr
,
1898 wxDatagramSocket
& wxDatagramSocket::SendTo( const wxSockAddress
& addr
,
1902 wxASSERT_MSG( m_impl
, _T("Socket not initialised") );
1904 m_impl
->SetPeer(addr
.GetAddress());
1909 // ==========================================================================
1911 // ==========================================================================
1913 class wxSocketModule
: public wxModule
1916 virtual bool OnInit()
1918 // wxSocketBase will call Initialize() itself only if sockets are
1919 // really used, don't do it from here
1923 virtual void OnExit()
1925 if ( wxSocketBase::IsInitialized() )
1926 wxSocketBase::Shutdown();
1930 DECLARE_DYNAMIC_CLASS(wxSocketModule
)
1933 IMPLEMENT_DYNAMIC_CLASS(wxSocketModule
, wxModule
)
1935 #endif // wxUSE_SOCKETS