]> git.saurik.com Git - wxWidgets.git/blob - src/common/socket.cpp
6f32e83791aa4a74fffb14f3e637425594464cf0
[wxWidgets.git] / src / common / socket.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/common/socket.cpp
3 // Purpose: Socket handler classes
4 // Authors: Guilhem Lavaux, Guillermo Rodriguez Garcia
5 // Created: April 1997
6 // Copyright: (C) 1999-1997, Guilhem Lavaux
7 // (C) 1999-2000, Guillermo Rodriguez Garcia
8 // (C) 2008 Vadim Zeitlin
9 // RCS_ID: $Id$
10 // Licence: wxWindows licence
11 /////////////////////////////////////////////////////////////////////////////
12
13 // ==========================================================================
14 // Declarations
15 // ==========================================================================
16
17 // For compilers that support precompilation, includes "wx.h".
18 #include "wx/wxprec.h"
19
20 #ifdef __BORLANDC__
21 #pragma hdrstop
22 #endif
23
24 #if wxUSE_SOCKETS
25
26 #include "wx/socket.h"
27
28 #ifndef WX_PRECOMP
29 #include "wx/object.h"
30 #include "wx/string.h"
31 #include "wx/intl.h"
32 #include "wx/log.h"
33 #include "wx/event.h"
34 #include "wx/app.h"
35 #include "wx/utils.h"
36 #include "wx/timer.h"
37 #include "wx/module.h"
38 #endif
39
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"
45 #include "wx/link.h"
46
47 #include "wx/private/fd.h"
48 #include "wx/private/socket.h"
49
50 #ifdef __UNIX__
51 #include <errno.h>
52 #endif
53
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
57 //
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.
63 #ifdef MSG_NOSIGNAL
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); }
72 namespace
73 {
74 class IgnoreSignal
75 {
76 public:
77 // ctor disables the given signal
78 IgnoreSignal(int sig)
79 : m_handler(signal(sig, SIG_IGN)),
80 m_sig(sig)
81 {
82 }
83
84 // dtor restores the old handler
85 ~IgnoreSignal()
86 {
87 signal(m_sig, m_handler);
88 }
89
90 private:
91 const wxSigHandler_t m_handler;
92 const int m_sig;
93
94 wxDECLARE_NO_COPY_CLASS(IgnoreSignal);
95 };
96 } // anonymous namespace
97
98 #define wxNEEDS_IGNORE_SIGPIPE
99 #endif // Unix without SO_NOSIGPIPE
100
101 #define wxSOCKET_MSG_NOSIGNAL 0
102 #endif
103
104 // DLL options compatibility check:
105 #include "wx/build.h"
106 WX_CHECK_BUILD_OPTIONS("wxNet")
107
108 // --------------------------------------------------------------------------
109 // macros and constants
110 // --------------------------------------------------------------------------
111
112 // event
113 wxDEFINE_EVENT(wxEVT_SOCKET, wxSocketEvent);
114
115 // discard buffer
116 #define MAX_DISCARD_SIZE (10 * 1024)
117
118 #define wxTRACE_Socket wxT("wxSocket")
119
120 // --------------------------------------------------------------------------
121 // wxWin macros
122 // --------------------------------------------------------------------------
123
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)
129
130 // ----------------------------------------------------------------------------
131 // private functions
132 // ----------------------------------------------------------------------------
133
134 namespace
135 {
136
137 void SetTimeValFromMS(timeval& tv, unsigned long ms)
138 {
139 tv.tv_sec = (ms / 1000);
140 tv.tv_usec = (ms % 1000) * 1000;
141 }
142
143 } // anonymous namespace
144
145 // --------------------------------------------------------------------------
146 // private classes
147 // --------------------------------------------------------------------------
148
149 class wxSocketState : public wxObject
150 {
151 public:
152 wxSocketFlags m_flags;
153 wxSocketEventFlags m_eventmask;
154 bool m_notify;
155 void *m_clientData;
156
157 public:
158 wxSocketState() : wxObject() {}
159
160 wxDECLARE_NO_COPY_CLASS(wxSocketState);
161 };
162
163 // wxSocketWaitModeChanger: temporarily change the socket flags affecting its
164 // wait mode
165 class wxSocketWaitModeChanger
166 {
167 public:
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)
171 : m_socket(socket),
172 m_oldflags(socket->GetFlags())
173
174 {
175 wxASSERT_MSG( flag == wxSOCKET_WAITALL || flag == wxSOCKET_NOWAIT,
176 "not a wait flag" );
177
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;
183
184 socket->SetFlags(flag);
185 }
186
187 ~wxSocketWaitModeChanger()
188 {
189 m_socket->SetFlags(m_oldflags);
190 }
191
192 private:
193 wxSocketBase * const m_socket;
194 const int m_oldflags;
195
196 wxDECLARE_NO_COPY_CLASS(wxSocketWaitModeChanger);
197 };
198
199 // wxSocketRead/WriteGuard are instantiated before starting reading
200 // from/writing to the socket
201 class wxSocketReadGuard
202 {
203 public:
204 wxSocketReadGuard(wxSocketBase *socket)
205 : m_socket(socket)
206 {
207 wxASSERT_MSG( !m_socket->m_reading, "read reentrancy?" );
208
209 m_socket->m_reading = true;
210 }
211
212 ~wxSocketReadGuard()
213 {
214 m_socket->m_reading = false;
215
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);
221 }
222
223 private:
224 wxSocketBase * const m_socket;
225
226 wxDECLARE_NO_COPY_CLASS(wxSocketReadGuard);
227 };
228
229 class wxSocketWriteGuard
230 {
231 public:
232 wxSocketWriteGuard(wxSocketBase *socket)
233 : m_socket(socket)
234 {
235 wxASSERT_MSG( !m_socket->m_writing, "write reentrancy?" );
236
237 m_socket->m_writing = true;
238 }
239
240 ~wxSocketWriteGuard()
241 {
242 m_socket->m_writing = false;
243
244 wxSocketImpl * const impl = m_socket->m_impl;
245 if ( impl && impl->m_fd != INVALID_SOCKET )
246 impl->ReenableEvents(wxSOCKET_OUTPUT_FLAG);
247 }
248
249 private:
250 wxSocketBase * const m_socket;
251
252 wxDECLARE_NO_COPY_CLASS(wxSocketWriteGuard);
253 };
254
255 // ============================================================================
256 // wxSocketManager
257 // ============================================================================
258
259 wxSocketManager *wxSocketManager::ms_manager = NULL;
260
261 /* static */
262 void wxSocketManager::Set(wxSocketManager *manager)
263 {
264 wxASSERT_MSG( !ms_manager, "too late to set manager now" );
265
266 ms_manager = manager;
267 }
268
269 /* static */
270 void wxSocketManager::Init()
271 {
272 wxASSERT_MSG( !ms_manager, "shouldn't be initialized twice" );
273
274 /*
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
283 will time out.
284
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.
289 */
290 wxASSERT_MSG( wxIsMainThread(),
291 "sockets must be initialized from the main thread" );
292
293 wxAppConsole * const app = wxAppConsole::GetInstance();
294 wxCHECK_RET( app, "sockets can't be initialized without wxApp" );
295
296 ms_manager = app->GetTraits()->GetSocketManager();
297 }
298
299 // ==========================================================================
300 // wxSocketImpl
301 // ==========================================================================
302
303 wxSocketImpl::wxSocketImpl(wxSocketBase& wxsocket)
304 : m_wxsocket(&wxsocket)
305 {
306 m_fd = INVALID_SOCKET;
307 m_error = wxSOCKET_NOERROR;
308 m_server = false;
309 m_stream = true;
310
311 SetTimeout(wxsocket.GetTimeout() * 1000);
312
313 m_establishing = false;
314 m_reusable = false;
315 m_broadcast = false;
316 m_dobind = true;
317 m_initialRecvBufferSize = -1;
318 m_initialSendBufferSize = -1;
319 }
320
321 wxSocketImpl::~wxSocketImpl()
322 {
323 if ( m_fd != INVALID_SOCKET )
324 Shutdown();
325 }
326
327 bool wxSocketImpl::PreCreateCheck(const wxSockAddressImpl& addr)
328 {
329 if ( m_fd != INVALID_SOCKET )
330 {
331 m_error = wxSOCKET_INVSOCK;
332 return false;
333 }
334
335 if ( !addr.IsOk() )
336 {
337 m_error = wxSOCKET_INVADDR;
338 return false;
339 }
340
341 return true;
342 }
343
344 void wxSocketImpl::PostCreation()
345 {
346 // FreeBSD variants can't use MSG_NOSIGNAL, and instead use a socket option
347 #ifdef SO_NOSIGPIPE
348 EnableSocketOption(SO_NOSIGPIPE);
349 #endif
350
351 if ( m_reusable )
352 EnableSocketOption(SO_REUSEADDR);
353
354 if ( m_broadcast )
355 {
356 wxASSERT_MSG( !m_stream, "broadcasting is for datagram sockets only" );
357
358 EnableSocketOption(SO_BROADCAST);
359 }
360
361 if ( m_initialRecvBufferSize >= 0 )
362 SetSocketOption(SO_RCVBUF, m_initialRecvBufferSize);
363 if ( m_initialSendBufferSize >= 0 )
364 SetSocketOption(SO_SNDBUF, m_initialSendBufferSize);
365
366 // we always put our sockets in unblocked mode and handle blocking
367 // ourselves in DoRead/Write() if wxSOCKET_WAITALL is specified
368 UnblockAndRegisterWithEventLoop();
369 }
370
371 wxSocketError wxSocketImpl::UpdateLocalAddress()
372 {
373 if ( !m_local.IsOk() )
374 {
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
377 // determine it
378 m_local.Create(m_peer.GetFamily());
379 }
380
381 WX_SOCKLEN_T lenAddr = m_local.GetLen();
382 if ( getsockname(m_fd, m_local.GetWritableAddr(), &lenAddr) != 0 )
383 {
384 Close();
385 m_error = wxSOCKET_IOERR;
386 return m_error;
387 }
388
389 return wxSOCKET_NOERROR;
390 }
391
392 wxSocketError wxSocketImpl::CreateServer()
393 {
394 if ( !PreCreateCheck(m_local) )
395 return m_error;
396
397 m_server = true;
398 m_stream = true;
399
400 // do create the socket
401 m_fd = socket(m_local.GetFamily(), SOCK_STREAM, 0);
402
403 if ( m_fd == INVALID_SOCKET )
404 {
405 m_error = wxSOCKET_IOERR;
406 return wxSOCKET_IOERR;
407 }
408
409 PostCreation();
410
411 // and then bind to and listen on it
412 //
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;
416
417 if ( IsOk() )
418 {
419 if ( listen(m_fd, 5) != 0 )
420 m_error = wxSOCKET_IOERR;
421 }
422
423 if ( !IsOk() )
424 {
425 Close();
426 return m_error;
427 }
428
429 // finally retrieve the address we effectively bound to
430 return UpdateLocalAddress();
431 }
432
433 wxSocketError wxSocketImpl::CreateClient(bool wait)
434 {
435 if ( !PreCreateCheck(m_peer) )
436 return m_error;
437
438 m_fd = socket(m_peer.GetFamily(), SOCK_STREAM, 0);
439
440 if ( m_fd == INVALID_SOCKET )
441 {
442 m_error = wxSOCKET_IOERR;
443 return wxSOCKET_IOERR;
444 }
445
446 PostCreation();
447
448 // If a local address has been set, then bind to it before calling connect
449 if ( m_local.IsOk() )
450 {
451 if ( bind(m_fd, m_local.GetAddr(), m_local.GetLen()) != 0 )
452 {
453 Close();
454 m_error = wxSOCKET_IOERR;
455 return m_error;
456 }
457 }
458
459 // Do connect now
460 int rc = connect(m_fd, m_peer.GetAddr(), m_peer.GetLen());
461 if ( rc == SOCKET_ERROR )
462 {
463 wxSocketError err = GetLastError();
464 if ( err == wxSOCKET_WOULDBLOCK )
465 {
466 m_establishing = true;
467
468 // block waiting for connection if we should (otherwise just return
469 // wxSOCKET_WOULDBLOCK to the caller)
470 if ( wait )
471 {
472 err = SelectWithTimeout(wxSOCKET_CONNECTION_FLAG)
473 ? wxSOCKET_NOERROR
474 : wxSOCKET_TIMEDOUT;
475 m_establishing = false;
476 }
477 }
478
479 m_error = err;
480 }
481 else // connected
482 {
483 m_error = wxSOCKET_NOERROR;
484 }
485
486 return m_error;
487 }
488
489
490 wxSocketError wxSocketImpl::CreateUDP()
491 {
492 if ( !PreCreateCheck(m_local) )
493 return m_error;
494
495 m_stream = false;
496 m_server = false;
497
498 m_fd = socket(m_local.GetFamily(), SOCK_DGRAM, 0);
499
500 if ( m_fd == INVALID_SOCKET )
501 {
502 m_error = wxSOCKET_IOERR;
503 return wxSOCKET_IOERR;
504 }
505
506 PostCreation();
507
508 if ( m_dobind )
509 {
510 if ( bind(m_fd, m_local.GetAddr(), m_local.GetLen()) != 0 )
511 {
512 Close();
513 m_error = wxSOCKET_IOERR;
514 return m_error;
515 }
516
517 return UpdateLocalAddress();
518 }
519
520 return wxSOCKET_NOERROR;
521 }
522
523 wxSocketImpl *wxSocketImpl::Accept(wxSocketBase& wxsocket)
524 {
525 wxSockAddressStorage from;
526 WX_SOCKLEN_T fromlen = sizeof(from);
527 const SOCKET fd = accept(m_fd, &from.addr, &fromlen);
528
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);
532
533 if ( fd == INVALID_SOCKET )
534 return NULL;
535
536 wxSocketManager * const manager = wxSocketManager::Get();
537 if ( !manager )
538 return NULL;
539
540 wxSocketImpl * const sock = manager->CreateSocket(wxsocket);
541 if ( !sock )
542 return NULL;
543
544 sock->m_fd = fd;
545 sock->m_peer = wxSockAddressImpl(from.addr, fromlen);
546
547 sock->UnblockAndRegisterWithEventLoop();
548
549 return sock;
550 }
551
552
553 void wxSocketImpl::Close()
554 {
555 if ( m_fd != INVALID_SOCKET )
556 {
557 DoClose();
558 m_fd = INVALID_SOCKET;
559 }
560 }
561
562 void wxSocketImpl::Shutdown()
563 {
564 if ( m_fd != INVALID_SOCKET )
565 {
566 shutdown(m_fd, 1 /* SD_SEND */);
567 Close();
568 }
569 }
570
571 /*
572 * Sets the timeout for blocking calls. Time is expressed in
573 * milliseconds.
574 */
575 void wxSocketImpl::SetTimeout(unsigned long millis)
576 {
577 SetTimeValFromMS(m_timeout, millis);
578 }
579
580 void wxSocketImpl::NotifyOnStateChange(wxSocketNotify event)
581 {
582 m_wxsocket->OnRequest(event);
583 }
584
585 /* Address handling */
586 wxSocketError wxSocketImpl::SetLocal(const wxSockAddressImpl& local)
587 {
588 /* the socket must be initialized, or it must be a server */
589 if (m_fd != INVALID_SOCKET && !m_server)
590 {
591 m_error = wxSOCKET_INVSOCK;
592 return wxSOCKET_INVSOCK;
593 }
594
595 if ( !local.IsOk() )
596 {
597 m_error = wxSOCKET_INVADDR;
598 return wxSOCKET_INVADDR;
599 }
600
601 m_local = local;
602
603 return wxSOCKET_NOERROR;
604 }
605
606 wxSocketError wxSocketImpl::SetPeer(const wxSockAddressImpl& peer)
607 {
608 if ( !peer.IsOk() )
609 {
610 m_error = wxSOCKET_INVADDR;
611 return wxSOCKET_INVADDR;
612 }
613
614 m_peer = peer;
615
616 return wxSOCKET_NOERROR;
617 }
618
619 const wxSockAddressImpl& wxSocketImpl::GetLocal()
620 {
621 if ( !m_local.IsOk() )
622 UpdateLocalAddress();
623
624 return m_local;
625 }
626
627 // ----------------------------------------------------------------------------
628 // wxSocketImpl IO
629 // ----------------------------------------------------------------------------
630
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
633 // is EINTR
634 #ifdef __UNIX__
635 #define DO_WHILE_EINTR( rc, syscall ) \
636 do { \
637 rc = (syscall); \
638 } \
639 while ( rc == -1 && errno == EINTR )
640 #else
641 #define DO_WHILE_EINTR( rc, syscall ) rc = (syscall)
642 #endif
643
644 int wxSocketImpl::RecvStream(void *buffer, int size)
645 {
646 int ret;
647 DO_WHILE_EINTR( ret, recv(m_fd, static_cast<char *>(buffer), size, 0) );
648
649 if ( !ret )
650 {
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);
656
657 Shutdown();
658
659 // do not return an error in this case however
660 }
661
662 return ret;
663 }
664
665 int wxSocketImpl::SendStream(const void *buffer, int size)
666 {
667 #ifdef wxNEEDS_IGNORE_SIGPIPE
668 IgnoreSignal ignore(SIGPIPE);
669 #endif
670
671 int ret;
672 DO_WHILE_EINTR( ret, send(m_fd, static_cast<const char *>(buffer), size,
673 wxSOCKET_MSG_NOSIGNAL) );
674
675 return ret;
676 }
677
678 int wxSocketImpl::RecvDgram(void *buffer, int size)
679 {
680 wxSockAddressStorage from;
681 WX_SOCKLEN_T fromlen = sizeof(from);
682
683 int ret;
684 DO_WHILE_EINTR( ret, recvfrom(m_fd, static_cast<char *>(buffer), size,
685 0, &from.addr, &fromlen) );
686
687 if ( ret == SOCKET_ERROR )
688 return SOCKET_ERROR;
689
690 m_peer = wxSockAddressImpl(from.addr, fromlen);
691 if ( !m_peer.IsOk() )
692 return -1;
693
694 return ret;
695 }
696
697 int wxSocketImpl::SendDgram(const void *buffer, int size)
698 {
699 if ( !m_peer.IsOk() )
700 {
701 m_error = wxSOCKET_INVADDR;
702 return -1;
703 }
704
705 int ret;
706 DO_WHILE_EINTR( ret, sendto(m_fd, static_cast<const char *>(buffer), size,
707 0, m_peer.GetAddr(), m_peer.GetLen()) );
708
709 return ret;
710 }
711
712 int wxSocketImpl::Read(void *buffer, int size)
713 {
714 // server sockets can't be used for IO, only to accept new connections
715 if ( m_fd == INVALID_SOCKET || m_server )
716 {
717 m_error = wxSOCKET_INVSOCK;
718 return -1;
719 }
720
721 int ret = m_stream ? RecvStream(buffer, size)
722 : RecvDgram(buffer, size);
723
724 m_error = ret == SOCKET_ERROR ? GetLastError() : wxSOCKET_NOERROR;
725
726 return ret;
727 }
728
729 int wxSocketImpl::Write(const void *buffer, int size)
730 {
731 if ( m_fd == INVALID_SOCKET || m_server )
732 {
733 m_error = wxSOCKET_INVSOCK;
734 return -1;
735 }
736
737 int ret = m_stream ? SendStream(buffer, size)
738 : SendDgram(buffer, size);
739
740 m_error = ret == SOCKET_ERROR ? GetLastError() : wxSOCKET_NOERROR;
741
742 return ret;
743 }
744
745 // ==========================================================================
746 // wxSocketBase
747 // ==========================================================================
748
749 // --------------------------------------------------------------------------
750 // Initialization and shutdown
751 // --------------------------------------------------------------------------
752
753 namespace
754 {
755
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;
761
762 } // anonymous namespace
763
764 bool wxSocketBase::IsInitialized()
765 {
766 wxASSERT_MSG( wxIsMainThread(), "unsafe to call from other threads" );
767
768 return gs_socketInitCount != 0;
769 }
770
771 bool wxSocketBase::Initialize()
772 {
773 wxCHECK_MSG( wxIsMainThread(), false,
774 "must be called from the main thread" );
775
776 if ( !gs_socketInitCount )
777 {
778 wxSocketManager * const manager = wxSocketManager::Get();
779 if ( !manager || !manager->OnInit() )
780 return false;
781 }
782
783 gs_socketInitCount++;
784
785 return true;
786 }
787
788 void wxSocketBase::Shutdown()
789 {
790 wxCHECK_RET( wxIsMainThread(), "must be called from the main thread" );
791
792 wxCHECK_RET( gs_socketInitCount > 0, "too many calls to Shutdown()" );
793
794 if ( !--gs_socketInitCount )
795 {
796 wxSocketManager * const manager = wxSocketManager::Get();
797 wxCHECK_RET( manager, "should have a socket manager" );
798
799 manager->OnExit();
800 }
801 }
802
803 // --------------------------------------------------------------------------
804 // Ctor and dtor
805 // --------------------------------------------------------------------------
806
807 void wxSocketBase::Init()
808 {
809 m_impl = NULL;
810 m_type = wxSOCKET_UNINIT;
811
812 // state
813 m_flags = 0;
814 m_connected =
815 m_establishing =
816 m_reading =
817 m_writing =
818 m_closed = false;
819 m_lcount = 0;
820 m_timeout = 600;
821 m_beingDeleted = false;
822
823 // pushback buffer
824 m_unread = NULL;
825 m_unrd_size = 0;
826 m_unrd_cur = 0;
827
828 // events
829 m_id = wxID_ANY;
830 m_handler = NULL;
831 m_clientData = NULL;
832 m_notify = false;
833 m_eventmask =
834 m_eventsgot = 0;
835
836 // when we create the first socket in the main thread we initialize the
837 // OS-dependent socket stuff: notice that this means that the user code
838 // needs to call wxSocket::Initialize() itself if the first socket it
839 // creates is not created in the main thread
840 if ( wxIsMainThread() )
841 {
842 if ( !Initialize() )
843 {
844 wxLogError(_("Cannot initialize sockets"));
845 }
846 }
847 }
848
849 wxSocketBase::wxSocketBase()
850 {
851 Init();
852 }
853
854 wxSocketBase::wxSocketBase(wxSocketFlags flags, wxSocketType type)
855 {
856 Init();
857
858 SetFlags(flags);
859
860 m_type = type;
861 }
862
863 wxSocketBase::~wxSocketBase()
864 {
865 // Shutdown and close the socket
866 if (!m_beingDeleted)
867 Close();
868
869 // Destroy the implementation object
870 delete m_impl;
871
872 // Free the pushback buffer
873 free(m_unread);
874 }
875
876 bool wxSocketBase::Destroy()
877 {
878 // Delayed destruction: the socket will be deleted during the next idle
879 // loop iteration. This ensures that all pending events have been
880 // processed.
881 m_beingDeleted = true;
882
883 // Shutdown and close the socket
884 Close();
885
886 // Suppress events from now on
887 Notify(false);
888
889 // Schedule this object for deletion instead of destroying it right now if
890 // it can have other events pending for it and we have a way to do it.
891 //
892 // Notice that sockets used in other threads won't have any events for them
893 // and we shouldn't use delayed destruction mechanism for them as it's not
894 // MT-safe.
895 if ( wxIsMainThread() && wxTheApp )
896 {
897 wxTheApp->ScheduleForDestruction(this);
898 }
899 else // no app
900 {
901 // in wxBase we might have no app object at all, don't leak memory
902 delete this;
903 }
904
905 return true;
906 }
907
908 // ----------------------------------------------------------------------------
909 // simple accessors
910 // ----------------------------------------------------------------------------
911
912 void wxSocketBase::SetError(wxSocketError error)
913 {
914 m_impl->m_error = error;
915 }
916
917 wxSocketError wxSocketBase::LastError() const
918 {
919 return m_impl->GetError();
920 }
921
922 // --------------------------------------------------------------------------
923 // Basic IO calls
924 // --------------------------------------------------------------------------
925
926 // The following IO operations update m_lcount:
927 // {Read, Write, ReadMsg, WriteMsg, Peek, Unread, Discard}
928 bool wxSocketBase::Close()
929 {
930 // Interrupt pending waits
931 InterruptWait();
932
933 ShutdownOutput();
934
935 m_connected = false;
936 m_establishing = false;
937 return true;
938 }
939
940 void wxSocketBase::ShutdownOutput()
941 {
942 if ( m_impl )
943 m_impl->Shutdown();
944 }
945
946 wxSocketBase& wxSocketBase::Read(void* buffer, wxUint32 nbytes)
947 {
948 wxSocketReadGuard read(this);
949
950 m_lcount = DoRead(buffer, nbytes);
951
952 return *this;
953 }
954
955 wxUint32 wxSocketBase::DoRead(void* buffer_, wxUint32 nbytes)
956 {
957 wxCHECK_MSG( m_impl, 0, "socket must be valid" );
958
959 // We use pointer arithmetic here which doesn't work with void pointers.
960 char *buffer = static_cast<char *>(buffer_);
961 wxCHECK_MSG( buffer, 0, "NULL buffer" );
962
963 // Try the push back buffer first, even before checking whether the socket
964 // is valid to allow reading previously pushed back data from an already
965 // closed socket.
966 wxUint32 total = GetPushback(buffer, nbytes, false);
967 nbytes -= total;
968 buffer += total;
969
970 while ( nbytes )
971 {
972 // our socket is non-blocking so Read() will return immediately if
973 // there is nothing to read yet and it's more efficient to try it first
974 // before entering DoWait() which is going to start dispatching GUI
975 // events and, even more importantly, we must do this under Windows
976 // where we're not going to get notifications about socket being ready
977 // for reading before we read all the existing data from it
978 const int ret = !m_impl->m_stream || m_connected
979 ? m_impl->Read(buffer, nbytes)
980 : 0;
981 if ( ret == -1 )
982 {
983 if ( m_impl->GetLastError() == wxSOCKET_WOULDBLOCK )
984 {
985 // if we don't want to wait, just return immediately
986 if ( m_flags & wxSOCKET_NOWAIT )
987 {
988 // this shouldn't be counted as an error in this case
989 SetError(wxSOCKET_NOERROR);
990 break;
991 }
992
993 // otherwise wait until the socket becomes ready for reading or
994 // an error occurs on it
995 if ( !DoWaitWithTimeout(wxSOCKET_INPUT_FLAG) )
996 {
997 // and exit if the timeout elapsed before it did
998 SetError(wxSOCKET_TIMEDOUT);
999 break;
1000 }
1001
1002 // retry reading
1003 continue;
1004 }
1005 else // "real" error
1006 {
1007 SetError(wxSOCKET_IOERR);
1008 break;
1009 }
1010 }
1011 else if ( ret == 0 )
1012 {
1013 // for connection-oriented (e.g. TCP) sockets we can only read
1014 // 0 bytes if the other end has been closed, and for connectionless
1015 // ones (UDP) this flag doesn't make sense anyhow so we can set it
1016 // to true too without doing any harm
1017 m_closed = true;
1018
1019 // we're not going to read anything else and so if we haven't read
1020 // anything (or not everything in wxSOCKET_WAITALL case) already,
1021 // signal an error
1022 if ( (m_flags & wxSOCKET_WAITALL) || !total )
1023 SetError(wxSOCKET_IOERR);
1024 break;
1025 }
1026
1027 total += ret;
1028
1029 // if we are happy to read something and not the entire nbytes bytes,
1030 // then we're done
1031 if ( !(m_flags & wxSOCKET_WAITALL) )
1032 break;
1033
1034 nbytes -= ret;
1035 buffer += ret;
1036 }
1037
1038 return total;
1039 }
1040
1041 wxSocketBase& wxSocketBase::ReadMsg(void* buffer, wxUint32 nbytes)
1042 {
1043 struct
1044 {
1045 unsigned char sig[4];
1046 unsigned char len[4];
1047 } msg;
1048
1049 wxSocketReadGuard read(this);
1050
1051 wxSocketWaitModeChanger changeFlags(this, wxSOCKET_WAITALL);
1052
1053 bool ok = false;
1054 if ( DoRead(&msg, sizeof(msg)) == sizeof(msg) )
1055 {
1056 wxUint32 sig = (wxUint32)msg.sig[0];
1057 sig |= (wxUint32)(msg.sig[1] << 8);
1058 sig |= (wxUint32)(msg.sig[2] << 16);
1059 sig |= (wxUint32)(msg.sig[3] << 24);
1060
1061 if ( sig == 0xfeeddead )
1062 {
1063 wxUint32 len = (wxUint32)msg.len[0];
1064 len |= (wxUint32)(msg.len[1] << 8);
1065 len |= (wxUint32)(msg.len[2] << 16);
1066 len |= (wxUint32)(msg.len[3] << 24);
1067
1068 wxUint32 len2;
1069 if (len > nbytes)
1070 {
1071 len2 = len - nbytes;
1072 len = nbytes;
1073 }
1074 else
1075 len2 = 0;
1076
1077 // Don't attempt to read if the msg was zero bytes long.
1078 m_lcount = len ? DoRead(buffer, len) : 0;
1079
1080 if ( len2 )
1081 {
1082 char discard_buffer[MAX_DISCARD_SIZE];
1083 long discard_len;
1084
1085 // NOTE: discarded bytes don't add to m_lcount.
1086 do
1087 {
1088 discard_len = len2 > MAX_DISCARD_SIZE
1089 ? MAX_DISCARD_SIZE
1090 : len2;
1091 discard_len = DoRead(discard_buffer, (wxUint32)discard_len);
1092 len2 -= (wxUint32)discard_len;
1093 }
1094 while ((discard_len > 0) && len2);
1095 }
1096
1097 if ( !len2 && DoRead(&msg, sizeof(msg)) == sizeof(msg) )
1098 {
1099 sig = (wxUint32)msg.sig[0];
1100 sig |= (wxUint32)(msg.sig[1] << 8);
1101 sig |= (wxUint32)(msg.sig[2] << 16);
1102 sig |= (wxUint32)(msg.sig[3] << 24);
1103
1104 if ( sig == 0xdeadfeed )
1105 ok = true;
1106 }
1107 }
1108 }
1109
1110 if ( !ok )
1111 SetError(wxSOCKET_IOERR);
1112
1113 return *this;
1114 }
1115
1116 wxSocketBase& wxSocketBase::Peek(void* buffer, wxUint32 nbytes)
1117 {
1118 wxSocketReadGuard read(this);
1119
1120 // Peek() should never block
1121 wxSocketWaitModeChanger changeFlags(this, wxSOCKET_NOWAIT);
1122
1123 m_lcount = DoRead(buffer, nbytes);
1124
1125 Pushback(buffer, m_lcount);
1126
1127 return *this;
1128 }
1129
1130 wxSocketBase& wxSocketBase::Write(const void *buffer, wxUint32 nbytes)
1131 {
1132 wxSocketWriteGuard write(this);
1133
1134 m_lcount = DoWrite(buffer, nbytes);
1135
1136 return *this;
1137 }
1138
1139 // This function is a mirror image of DoRead() except that it doesn't use the
1140 // push back buffer and doesn't treat 0 return value specially (normally this
1141 // shouldn't happen at all here), so please see comments there for explanations
1142 wxUint32 wxSocketBase::DoWrite(const void *buffer_, wxUint32 nbytes)
1143 {
1144 wxCHECK_MSG( m_impl, 0, "socket must be valid" );
1145
1146 const char *buffer = static_cast<const char *>(buffer_);
1147 wxCHECK_MSG( buffer, 0, "NULL buffer" );
1148
1149 wxUint32 total = 0;
1150 while ( nbytes )
1151 {
1152 if ( m_impl->m_stream && !m_connected )
1153 {
1154 if ( (m_flags & wxSOCKET_WAITALL) || !total )
1155 SetError(wxSOCKET_IOERR);
1156 break;
1157 }
1158
1159 const int ret = m_impl->Write(buffer, nbytes);
1160 if ( ret == -1 )
1161 {
1162 if ( m_impl->GetLastError() == wxSOCKET_WOULDBLOCK )
1163 {
1164 if ( m_flags & wxSOCKET_NOWAIT )
1165 break;
1166
1167 if ( !DoWaitWithTimeout(wxSOCKET_OUTPUT_FLAG) )
1168 {
1169 SetError(wxSOCKET_TIMEDOUT);
1170 break;
1171 }
1172
1173 continue;
1174 }
1175 else // "real" error
1176 {
1177 SetError(wxSOCKET_IOERR);
1178 break;
1179 }
1180 }
1181
1182 total += ret;
1183
1184 if ( !(m_flags & wxSOCKET_WAITALL) )
1185 break;
1186
1187 nbytes -= ret;
1188 buffer += ret;
1189 }
1190
1191 return total;
1192 }
1193
1194 wxSocketBase& wxSocketBase::WriteMsg(const void *buffer, wxUint32 nbytes)
1195 {
1196 struct
1197 {
1198 unsigned char sig[4];
1199 unsigned char len[4];
1200 } msg;
1201
1202 wxSocketWriteGuard write(this);
1203
1204 wxSocketWaitModeChanger changeFlags(this, wxSOCKET_WAITALL);
1205
1206 msg.sig[0] = (unsigned char) 0xad;
1207 msg.sig[1] = (unsigned char) 0xde;
1208 msg.sig[2] = (unsigned char) 0xed;
1209 msg.sig[3] = (unsigned char) 0xfe;
1210
1211 msg.len[0] = (unsigned char) (nbytes & 0xff);
1212 msg.len[1] = (unsigned char) ((nbytes >> 8) & 0xff);
1213 msg.len[2] = (unsigned char) ((nbytes >> 16) & 0xff);
1214 msg.len[3] = (unsigned char) ((nbytes >> 24) & 0xff);
1215
1216 bool ok = false;
1217 if ( DoWrite(&msg, sizeof(msg)) == sizeof(msg) )
1218 {
1219 m_lcount = DoWrite(buffer, nbytes);
1220 if ( m_lcount == nbytes )
1221 {
1222 msg.sig[0] = (unsigned char) 0xed;
1223 msg.sig[1] = (unsigned char) 0xfe;
1224 msg.sig[2] = (unsigned char) 0xad;
1225 msg.sig[3] = (unsigned char) 0xde;
1226 msg.len[0] =
1227 msg.len[1] =
1228 msg.len[2] =
1229 msg.len[3] = (char) 0;
1230
1231 if ( DoWrite(&msg, sizeof(msg)) == sizeof(msg))
1232 ok = true;
1233 }
1234 }
1235
1236 if ( !ok )
1237 SetError(wxSOCKET_IOERR);
1238
1239 return *this;
1240 }
1241
1242 wxSocketBase& wxSocketBase::Unread(const void *buffer, wxUint32 nbytes)
1243 {
1244 if (nbytes != 0)
1245 Pushback(buffer, nbytes);
1246
1247 SetError(wxSOCKET_NOERROR);
1248 m_lcount = nbytes;
1249
1250 return *this;
1251 }
1252
1253 wxSocketBase& wxSocketBase::Discard()
1254 {
1255 char *buffer = new char[MAX_DISCARD_SIZE];
1256 wxUint32 ret;
1257 wxUint32 total = 0;
1258
1259 wxSocketReadGuard read(this);
1260
1261 wxSocketWaitModeChanger changeFlags(this, wxSOCKET_NOWAIT);
1262
1263 do
1264 {
1265 ret = DoRead(buffer, MAX_DISCARD_SIZE);
1266 total += ret;
1267 }
1268 while (ret == MAX_DISCARD_SIZE);
1269
1270 delete[] buffer;
1271 m_lcount = total;
1272 SetError(wxSOCKET_NOERROR);
1273
1274 return *this;
1275 }
1276
1277 // --------------------------------------------------------------------------
1278 // Wait functions
1279 // --------------------------------------------------------------------------
1280
1281 /*
1282 This function will check for the events specified in the flags parameter,
1283 and it will return a mask indicating which operations can be performed.
1284 */
1285 wxSocketEventFlags wxSocketImpl::Select(wxSocketEventFlags flags,
1286 const timeval *timeout)
1287 {
1288 if ( m_fd == INVALID_SOCKET )
1289 return (wxSOCKET_LOST_FLAG & flags);
1290
1291 struct timeval tv;
1292 if ( timeout )
1293 tv = *timeout;
1294 else
1295 tv.tv_sec = tv.tv_usec = 0;
1296
1297 // prepare the FD sets, passing NULL for the one(s) we don't use
1298 fd_set
1299 readfds, *preadfds = NULL,
1300 writefds, *pwritefds = NULL,
1301 exceptfds; // always want to know about errors
1302
1303 if ( flags & wxSOCKET_INPUT_FLAG )
1304 preadfds = &readfds;
1305
1306 if ( flags & wxSOCKET_OUTPUT_FLAG )
1307 pwritefds = &writefds;
1308
1309 // When using non-blocking connect() the client socket becomes connected
1310 // (successfully or not) when it becomes writable but when using
1311 // non-blocking accept() the server socket becomes connected when it
1312 // becomes readable.
1313 if ( flags & wxSOCKET_CONNECTION_FLAG )
1314 {
1315 if ( m_server )
1316 preadfds = &readfds;
1317 else
1318 pwritefds = &writefds;
1319 }
1320
1321 if ( preadfds )
1322 {
1323 wxFD_ZERO(preadfds);
1324 wxFD_SET(m_fd, preadfds);
1325 }
1326
1327 if ( pwritefds )
1328 {
1329 wxFD_ZERO(pwritefds);
1330 wxFD_SET(m_fd, pwritefds);
1331 }
1332
1333 wxFD_ZERO(&exceptfds);
1334 wxFD_SET(m_fd, &exceptfds);
1335
1336 const int rc = select(m_fd + 1, preadfds, pwritefds, &exceptfds, &tv);
1337
1338 // check for errors first
1339 if ( rc == -1 || wxFD_ISSET(m_fd, &exceptfds) )
1340 {
1341 m_establishing = false;
1342
1343 return wxSOCKET_LOST_FLAG & flags;
1344 }
1345
1346 if ( rc == 0 )
1347 return 0;
1348
1349 wxASSERT_MSG( rc == 1, "unexpected select() return value" );
1350
1351 wxSocketEventFlags detected = 0;
1352 if ( preadfds && wxFD_ISSET(m_fd, preadfds) )
1353 detected |= wxSOCKET_INPUT_FLAG;
1354
1355 if ( pwritefds && wxFD_ISSET(m_fd, pwritefds) )
1356 {
1357 // check for the case of non-blocking connect()
1358 if ( m_establishing && !m_server )
1359 {
1360 int error;
1361 SOCKOPTLEN_T len = sizeof(error);
1362 m_establishing = false;
1363 getsockopt(m_fd, SOL_SOCKET, SO_ERROR, (char*)&error, &len);
1364
1365 if ( error )
1366 detected = wxSOCKET_LOST_FLAG;
1367 else
1368 detected |= wxSOCKET_CONNECTION_FLAG;
1369 }
1370 else // not called to get non-blocking connect() status
1371 {
1372 detected |= wxSOCKET_OUTPUT_FLAG;
1373 }
1374 }
1375
1376 return detected & flags;
1377 }
1378
1379 int
1380 wxSocketBase::DoWait(long seconds, long milliseconds, wxSocketEventFlags flags)
1381 {
1382 // Use either the provided timeout or the default timeout value associated
1383 // with this socket.
1384 //
1385 // TODO: allow waiting forever, see #9443
1386 const long timeout = seconds == -1 ? m_timeout * 1000
1387 : seconds * 1000 + milliseconds;
1388
1389 return DoWait(timeout, flags);
1390 }
1391
1392 int
1393 wxSocketBase::DoWait(long timeout, wxSocketEventFlags flags)
1394 {
1395 wxCHECK_MSG( m_impl, -1, "can't wait on invalid socket" );
1396
1397 // we're never going to become ready in a TCP client if we're not connected
1398 // any more (OTOH a server can call this to precisely wait for a connection
1399 // so do wait for it in this case and UDP client is never "connected")
1400 if ( !m_impl->IsServer() &&
1401 m_impl->m_stream && !m_connected && !m_establishing )
1402 return -1;
1403
1404 // This can be set to true from Interrupt() to exit this function a.s.a.p.
1405 m_interrupt = false;
1406
1407
1408 const wxMilliClock_t timeEnd = wxGetLocalTimeMillis() + timeout;
1409
1410 // Get the active event loop which we'll use for the message dispatching
1411 // when running in the main thread unless this was explicitly disabled by
1412 // setting wxSOCKET_BLOCK flag
1413 wxEventLoopBase *eventLoop;
1414 if ( !(m_flags & wxSOCKET_BLOCK) && wxIsMainThread() )
1415 {
1416 eventLoop = wxEventLoop::GetActive();
1417 }
1418 else // in worker thread
1419 {
1420 // We never dispatch messages from threads other than the main one.
1421 eventLoop = NULL;
1422 }
1423
1424 // Make sure the events we're interested in are enabled before waiting for
1425 // them: this is really necessary here as otherwise this could happen:
1426 // 1. DoRead(wxSOCKET_WAITALL) is called
1427 // 2. There is nothing to read so DoWait(wxSOCKET_INPUT_FLAG) is called
1428 // 3. Some, but not all data appears, wxSocketImplUnix::OnReadWaiting()
1429 // is called and wxSOCKET_INPUT_FLAG events are disabled in it
1430 // 4. Because of wxSOCKET_WAITALL we call DoWait() again but the events
1431 // are still disabled and we block forever
1432 //
1433 // More elegant solution would be nice but for now simply re-enabling the
1434 // events here will do
1435 m_impl->ReenableEvents(flags & (wxSOCKET_INPUT_FLAG | wxSOCKET_OUTPUT_FLAG));
1436
1437
1438 // Wait until we receive the event we're waiting for or the timeout expires
1439 // (but note that we always execute the loop at least once, even if timeout
1440 // is 0 as this is used for polling)
1441 int rc = 0;
1442 for ( bool firstTime = true; !m_interrupt; firstTime = false )
1443 {
1444 long timeLeft = wxMilliClockToLong(timeEnd - wxGetLocalTimeMillis());
1445 if ( timeLeft < 0 )
1446 {
1447 if ( !firstTime )
1448 break; // timed out
1449
1450 timeLeft = 0;
1451 }
1452
1453 wxSocketEventFlags events;
1454 if ( eventLoop )
1455 {
1456 // reset them before starting to wait
1457 m_eventsgot = 0;
1458
1459 eventLoop->DispatchTimeout(timeLeft);
1460
1461 events = m_eventsgot;
1462 }
1463 else // no event loop or waiting in another thread
1464 {
1465 // as explained below, we should always check for wxSOCKET_LOST_FLAG
1466 timeval tv;
1467 SetTimeValFromMS(tv, timeLeft);
1468 events = m_impl->Select(flags | wxSOCKET_LOST_FLAG, &tv);
1469 }
1470
1471 // always check for wxSOCKET_LOST_FLAG, even if flags doesn't include
1472 // it, as continuing to wait for anything else after getting it is
1473 // pointless
1474 if ( events & wxSOCKET_LOST_FLAG )
1475 {
1476 m_connected = false;
1477 m_establishing = false;
1478 rc = -1;
1479 break;
1480 }
1481
1482 // otherwise mask out the bits we're not interested in
1483 events &= flags;
1484
1485 // Incoming connection (server) or connection established (client)?
1486 if ( events & wxSOCKET_CONNECTION_FLAG )
1487 {
1488 m_connected = true;
1489 m_establishing = false;
1490 rc = true;
1491 break;
1492 }
1493
1494 // Data available or output buffer ready?
1495 if ( (events & wxSOCKET_INPUT_FLAG) || (events & wxSOCKET_OUTPUT_FLAG) )
1496 {
1497 rc = true;
1498 break;
1499 }
1500 }
1501
1502 return rc;
1503 }
1504
1505 bool wxSocketBase::Wait(long seconds, long milliseconds)
1506 {
1507 return DoWait(seconds, milliseconds,
1508 wxSOCKET_INPUT_FLAG |
1509 wxSOCKET_OUTPUT_FLAG |
1510 wxSOCKET_CONNECTION_FLAG) != 0;
1511 }
1512
1513 bool wxSocketBase::WaitForRead(long seconds, long milliseconds)
1514 {
1515 // Check pushback buffer before entering DoWait
1516 if ( m_unread )
1517 return true;
1518
1519 // Check if the socket is not already ready for input, if it is, there is
1520 // no need to start waiting for it (worse, we'll actually never get a
1521 // notification about the socket becoming ready if it is already under
1522 // Windows)
1523 if ( m_impl->Select(wxSOCKET_INPUT_FLAG) )
1524 return true;
1525
1526 return DoWait(seconds, milliseconds, wxSOCKET_INPUT_FLAG) != 0;
1527 }
1528
1529
1530 bool wxSocketBase::WaitForWrite(long seconds, long milliseconds)
1531 {
1532 if ( m_impl->Select(wxSOCKET_OUTPUT_FLAG) )
1533 return true;
1534
1535 return DoWait(seconds, milliseconds, wxSOCKET_OUTPUT_FLAG) != 0;
1536 }
1537
1538 bool wxSocketBase::WaitForLost(long seconds, long milliseconds)
1539 {
1540 return DoWait(seconds, milliseconds, wxSOCKET_LOST_FLAG) == -1;
1541 }
1542
1543 // --------------------------------------------------------------------------
1544 // Miscellaneous
1545 // --------------------------------------------------------------------------
1546
1547 //
1548 // Get local or peer address
1549 //
1550
1551 bool wxSocketBase::GetPeer(wxSockAddress& addr) const
1552 {
1553 wxCHECK_MSG( m_impl, false, "invalid socket" );
1554
1555 const wxSockAddressImpl& peer = m_impl->GetPeer();
1556 if ( !peer.IsOk() )
1557 return false;
1558
1559 addr.SetAddress(peer);
1560
1561 return true;
1562 }
1563
1564 bool wxSocketBase::GetLocal(wxSockAddress& addr) const
1565 {
1566 wxCHECK_MSG( m_impl, false, "invalid socket" );
1567
1568 const wxSockAddressImpl& local = m_impl->GetLocal();
1569 if ( !local.IsOk() )
1570 return false;
1571
1572 addr.SetAddress(local);
1573
1574 return true;
1575 }
1576
1577 //
1578 // Save and restore socket state
1579 //
1580
1581 void wxSocketBase::SaveState()
1582 {
1583 wxSocketState *state;
1584
1585 state = new wxSocketState();
1586
1587 state->m_flags = m_flags;
1588 state->m_notify = m_notify;
1589 state->m_eventmask = m_eventmask;
1590 state->m_clientData = m_clientData;
1591
1592 m_states.Append(state);
1593 }
1594
1595 void wxSocketBase::RestoreState()
1596 {
1597 wxList::compatibility_iterator node;
1598 wxSocketState *state;
1599
1600 node = m_states.GetLast();
1601 if (!node)
1602 return;
1603
1604 state = (wxSocketState *)node->GetData();
1605
1606 m_flags = state->m_flags;
1607 m_notify = state->m_notify;
1608 m_eventmask = state->m_eventmask;
1609 m_clientData = state->m_clientData;
1610
1611 m_states.Erase(node);
1612 delete state;
1613 }
1614
1615 //
1616 // Timeout and flags
1617 //
1618
1619 void wxSocketBase::SetTimeout(long seconds)
1620 {
1621 m_timeout = seconds;
1622
1623 if (m_impl)
1624 m_impl->SetTimeout(m_timeout * 1000);
1625 }
1626
1627 void wxSocketBase::SetFlags(wxSocketFlags flags)
1628 {
1629 // Do some sanity checking on the flags used: not all values can be used
1630 // together.
1631 wxASSERT_MSG( !(flags & wxSOCKET_NOWAIT) ||
1632 !(flags & (wxSOCKET_WAITALL | wxSOCKET_BLOCK)),
1633 "Using wxSOCKET_WAITALL or wxSOCKET_BLOCK with "
1634 "wxSOCKET_NOWAIT doesn't make sense" );
1635
1636 m_flags = flags;
1637 }
1638
1639
1640 // --------------------------------------------------------------------------
1641 // Event handling
1642 // --------------------------------------------------------------------------
1643
1644 void wxSocketBase::OnRequest(wxSocketNotify notification)
1645 {
1646 wxSocketEventFlags flag = 0;
1647 switch ( notification )
1648 {
1649 case wxSOCKET_INPUT:
1650 flag = wxSOCKET_INPUT_FLAG;
1651 break;
1652
1653 case wxSOCKET_OUTPUT:
1654 flag = wxSOCKET_OUTPUT_FLAG;
1655 break;
1656
1657 case wxSOCKET_CONNECTION:
1658 flag = wxSOCKET_CONNECTION_FLAG;
1659
1660 // we're now successfully connected
1661 m_connected = true;
1662 m_establishing = false;
1663
1664 // error was previously set to wxSOCKET_WOULDBLOCK, but this is not
1665 // the case any longer
1666 SetError(wxSOCKET_NOERROR);
1667 break;
1668
1669 case wxSOCKET_LOST:
1670 flag = wxSOCKET_LOST_FLAG;
1671
1672 // if we lost the connection the socket is now closed and not
1673 // connected any more
1674 m_connected = false;
1675 m_closed = true;
1676 break;
1677
1678 default:
1679 wxFAIL_MSG( "unknown wxSocket notification" );
1680 }
1681
1682 // remember the events which were generated for this socket, we're going to
1683 // use this in DoWait()
1684 m_eventsgot |= flag;
1685
1686 // send the wx event if enabled and we're interested in it
1687 if ( m_notify && (m_eventmask & flag) && m_handler )
1688 {
1689 // don't generate the events when we're inside DoWait() called from our
1690 // own code as we are going to consume the data that has just become
1691 // available ourselves and the user code won't see it at all
1692 if ( (notification == wxSOCKET_INPUT && m_reading) ||
1693 (notification == wxSOCKET_OUTPUT && m_writing) )
1694 {
1695 return;
1696 }
1697
1698 wxSocketEvent event(m_id);
1699 event.m_event = notification;
1700 event.m_clientData = m_clientData;
1701 event.SetEventObject(this);
1702
1703 m_handler->AddPendingEvent(event);
1704 }
1705 }
1706
1707 void wxSocketBase::Notify(bool notify)
1708 {
1709 m_notify = notify;
1710 }
1711
1712 void wxSocketBase::SetNotify(wxSocketEventFlags flags)
1713 {
1714 m_eventmask = flags;
1715 }
1716
1717 void wxSocketBase::SetEventHandler(wxEvtHandler& handler, int id)
1718 {
1719 m_handler = &handler;
1720 m_id = id;
1721 }
1722
1723 // --------------------------------------------------------------------------
1724 // Pushback buffer
1725 // --------------------------------------------------------------------------
1726
1727 void wxSocketBase::Pushback(const void *buffer, wxUint32 size)
1728 {
1729 if (!size) return;
1730
1731 if (m_unread == NULL)
1732 m_unread = malloc(size);
1733 else
1734 {
1735 void *tmp;
1736
1737 tmp = malloc(m_unrd_size + size);
1738 memcpy((char *)tmp + size, m_unread, m_unrd_size);
1739 free(m_unread);
1740
1741 m_unread = tmp;
1742 }
1743
1744 m_unrd_size += size;
1745
1746 memcpy(m_unread, buffer, size);
1747 }
1748
1749 wxUint32 wxSocketBase::GetPushback(void *buffer, wxUint32 size, bool peek)
1750 {
1751 wxCHECK_MSG( buffer, 0, "NULL buffer" );
1752
1753 if (!m_unrd_size)
1754 return 0;
1755
1756 if (size > (m_unrd_size-m_unrd_cur))
1757 size = m_unrd_size-m_unrd_cur;
1758
1759 memcpy(buffer, (char *)m_unread + m_unrd_cur, size);
1760
1761 if (!peek)
1762 {
1763 m_unrd_cur += size;
1764 if (m_unrd_size == m_unrd_cur)
1765 {
1766 free(m_unread);
1767 m_unread = NULL;
1768 m_unrd_size = 0;
1769 m_unrd_cur = 0;
1770 }
1771 }
1772
1773 return size;
1774 }
1775
1776
1777 // ==========================================================================
1778 // wxSocketServer
1779 // ==========================================================================
1780
1781 // --------------------------------------------------------------------------
1782 // Ctor
1783 // --------------------------------------------------------------------------
1784
1785 wxSocketServer::wxSocketServer(const wxSockAddress& addr,
1786 wxSocketFlags flags)
1787 : wxSocketBase(flags, wxSOCKET_SERVER)
1788 {
1789 wxLogTrace( wxTRACE_Socket, wxT("Opening wxSocketServer") );
1790
1791 wxSocketManager * const manager = wxSocketManager::Get();
1792 m_impl = manager ? manager->CreateSocket(*this) : NULL;
1793
1794 if (!m_impl)
1795 {
1796 wxLogTrace( wxTRACE_Socket, wxT("*** Failed to create m_impl") );
1797 return;
1798 }
1799
1800 // Setup the socket as server
1801 m_impl->SetLocal(addr.GetAddress());
1802
1803 if (GetFlags() & wxSOCKET_REUSEADDR) {
1804 m_impl->SetReusable();
1805 }
1806 if (GetFlags() & wxSOCKET_BROADCAST) {
1807 m_impl->SetBroadcast();
1808 }
1809 if (GetFlags() & wxSOCKET_NOBIND) {
1810 m_impl->DontDoBind();
1811 }
1812
1813 if (m_impl->CreateServer() != wxSOCKET_NOERROR)
1814 {
1815 wxDELETE(m_impl);
1816
1817 wxLogTrace( wxTRACE_Socket, wxT("*** CreateServer() failed") );
1818 return;
1819 }
1820
1821 // Notice that we need a cast as SOCKET is 64 bit under Win64 and that the
1822 // cast is safe because a SOCKET is a handle and so limited to 32 (or,
1823 // actually, even 24) bit values anyhow.
1824 wxLogTrace( wxTRACE_Socket, wxT("wxSocketServer on fd %u"),
1825 static_cast<unsigned>(m_impl->m_fd) );
1826 }
1827
1828 // --------------------------------------------------------------------------
1829 // Accept
1830 // --------------------------------------------------------------------------
1831
1832 bool wxSocketServer::AcceptWith(wxSocketBase& sock, bool wait)
1833 {
1834 if ( !m_impl || (m_impl->m_fd == INVALID_SOCKET) || !m_impl->IsServer() )
1835 {
1836 wxFAIL_MSG( "can only be called for a valid server socket" );
1837
1838 SetError(wxSOCKET_INVSOCK);
1839
1840 return false;
1841 }
1842
1843 if ( wait )
1844 {
1845 // wait until we get a connection
1846 if ( !m_impl->SelectWithTimeout(wxSOCKET_INPUT_FLAG) )
1847 {
1848 SetError(wxSOCKET_TIMEDOUT);
1849
1850 return false;
1851 }
1852 }
1853
1854 sock.m_impl = m_impl->Accept(sock);
1855
1856 if ( !sock.m_impl )
1857 {
1858 SetError(m_impl->GetLastError());
1859
1860 return false;
1861 }
1862
1863 sock.m_type = wxSOCKET_BASE;
1864 sock.m_connected = true;
1865
1866 return true;
1867 }
1868
1869 wxSocketBase *wxSocketServer::Accept(bool wait)
1870 {
1871 wxSocketBase* sock = new wxSocketBase();
1872
1873 sock->SetFlags(m_flags);
1874
1875 if (!AcceptWith(*sock, wait))
1876 {
1877 sock->Destroy();
1878 sock = NULL;
1879 }
1880
1881 return sock;
1882 }
1883
1884 bool wxSocketServer::WaitForAccept(long seconds, long milliseconds)
1885 {
1886 return DoWait(seconds, milliseconds, wxSOCKET_CONNECTION_FLAG) == 1;
1887 }
1888
1889 bool wxSocketBase::GetOption(int level, int optname, void *optval, int *optlen)
1890 {
1891 wxASSERT_MSG( m_impl, wxT("Socket not initialised") );
1892
1893 SOCKOPTLEN_T lenreal = *optlen;
1894 if ( getsockopt(m_impl->m_fd, level, optname,
1895 static_cast<char *>(optval), &lenreal) != 0 )
1896 return false;
1897
1898 *optlen = lenreal;
1899
1900 return true;
1901 }
1902
1903 bool
1904 wxSocketBase::SetOption(int level, int optname, const void *optval, int optlen)
1905 {
1906 wxASSERT_MSG( m_impl, wxT("Socket not initialised") );
1907
1908 return setsockopt(m_impl->m_fd, level, optname,
1909 static_cast<const char *>(optval), optlen) == 0;
1910 }
1911
1912 bool wxSocketBase::SetLocal(const wxIPV4address& local)
1913 {
1914 m_localAddress = local;
1915
1916 return true;
1917 }
1918
1919 // ==========================================================================
1920 // wxSocketClient
1921 // ==========================================================================
1922
1923 // --------------------------------------------------------------------------
1924 // Ctor and dtor
1925 // --------------------------------------------------------------------------
1926
1927 wxSocketClient::wxSocketClient(wxSocketFlags flags)
1928 : wxSocketBase(flags, wxSOCKET_CLIENT)
1929 {
1930 m_initialRecvBufferSize =
1931 m_initialSendBufferSize = -1;
1932 }
1933
1934 // --------------------------------------------------------------------------
1935 // Connect
1936 // --------------------------------------------------------------------------
1937
1938 bool wxSocketClient::DoConnect(const wxSockAddress& remote,
1939 const wxSockAddress* local,
1940 bool wait)
1941 {
1942 if ( m_impl )
1943 {
1944 // Shutdown and destroy the old socket
1945 Close();
1946 delete m_impl;
1947 }
1948
1949 m_connected = false;
1950 m_establishing = false;
1951
1952 // Create and set up the new one
1953 wxSocketManager * const manager = wxSocketManager::Get();
1954 m_impl = manager ? manager->CreateSocket(*this) : NULL;
1955 if ( !m_impl )
1956 return false;
1957
1958 // Reuse makes sense for clients too, if we are trying to rebind to the same port
1959 if (GetFlags() & wxSOCKET_REUSEADDR)
1960 m_impl->SetReusable();
1961 if (GetFlags() & wxSOCKET_BROADCAST)
1962 m_impl->SetBroadcast();
1963 if (GetFlags() & wxSOCKET_NOBIND)
1964 m_impl->DontDoBind();
1965
1966 // Bind to the local IP address and port, when provided or if one had been
1967 // set before
1968 if ( !local && m_localAddress.GetAddress().IsOk() )
1969 local = &m_localAddress;
1970
1971 if ( local )
1972 m_impl->SetLocal(local->GetAddress());
1973
1974 m_impl->SetInitialSocketBuffers(m_initialRecvBufferSize, m_initialSendBufferSize);
1975
1976 m_impl->SetPeer(remote.GetAddress());
1977
1978 // Finally do create the socket and connect to the peer
1979 const wxSocketError err = m_impl->CreateClient(wait);
1980
1981 if ( err != wxSOCKET_NOERROR )
1982 {
1983 if ( err == wxSOCKET_WOULDBLOCK )
1984 {
1985 wxASSERT_MSG( !wait, "shouldn't get this for blocking connect" );
1986
1987 m_establishing = true;
1988 }
1989
1990 return false;
1991 }
1992
1993 m_connected = true;
1994 return true;
1995 }
1996
1997 bool wxSocketClient::Connect(const wxSockAddress& remote, bool wait)
1998 {
1999 return DoConnect(remote, NULL, wait);
2000 }
2001
2002 bool wxSocketClient::Connect(const wxSockAddress& remote,
2003 const wxSockAddress& local,
2004 bool wait)
2005 {
2006 return DoConnect(remote, &local, wait);
2007 }
2008
2009 bool wxSocketClient::WaitOnConnect(long seconds, long milliseconds)
2010 {
2011 if ( m_connected )
2012 {
2013 // this happens if the initial attempt to connect succeeded without
2014 // blocking
2015 return true;
2016 }
2017
2018 wxCHECK_MSG( m_establishing && m_impl, false,
2019 "No connection establishment attempt in progress" );
2020
2021 // notice that we return true even if DoWait() returned -1, i.e. if an
2022 // error occurred and connection was lost: this is intentional as we should
2023 // return false only if timeout expired without anything happening
2024 return DoWait(seconds, milliseconds, wxSOCKET_CONNECTION_FLAG) != 0;
2025 }
2026
2027 // ==========================================================================
2028 // wxDatagramSocket
2029 // ==========================================================================
2030
2031 wxDatagramSocket::wxDatagramSocket( const wxSockAddress& addr,
2032 wxSocketFlags flags )
2033 : wxSocketBase( flags, wxSOCKET_DATAGRAM )
2034 {
2035 // Create the socket
2036 wxSocketManager * const manager = wxSocketManager::Get();
2037 m_impl = manager ? manager->CreateSocket(*this) : NULL;
2038
2039 if (!m_impl)
2040 return;
2041
2042 // Setup the socket as non connection oriented
2043 m_impl->SetLocal(addr.GetAddress());
2044 if (flags & wxSOCKET_REUSEADDR)
2045 {
2046 m_impl->SetReusable();
2047 }
2048 if (GetFlags() & wxSOCKET_BROADCAST)
2049 {
2050 m_impl->SetBroadcast();
2051 }
2052 if (GetFlags() & wxSOCKET_NOBIND)
2053 {
2054 m_impl->DontDoBind();
2055 }
2056
2057 if ( m_impl->CreateUDP() != wxSOCKET_NOERROR )
2058 {
2059 wxDELETE(m_impl);
2060 return;
2061 }
2062
2063 // Initialize all stuff
2064 m_connected = false;
2065 m_establishing = false;
2066 }
2067
2068 wxDatagramSocket& wxDatagramSocket::RecvFrom( wxSockAddress& addr,
2069 void* buf,
2070 wxUint32 nBytes )
2071 {
2072 Read(buf, nBytes);
2073 GetPeer(addr);
2074 return (*this);
2075 }
2076
2077 wxDatagramSocket& wxDatagramSocket::SendTo( const wxSockAddress& addr,
2078 const void* buf,
2079 wxUint32 nBytes )
2080 {
2081 wxASSERT_MSG( m_impl, wxT("Socket not initialised") );
2082
2083 m_impl->SetPeer(addr.GetAddress());
2084 Write(buf, nBytes);
2085 return (*this);
2086 }
2087
2088 // ==========================================================================
2089 // wxSocketModule
2090 // ==========================================================================
2091
2092 class wxSocketModule : public wxModule
2093 {
2094 public:
2095 virtual bool OnInit()
2096 {
2097 // wxSocketBase will call Initialize() itself only if sockets are
2098 // really used, don't do it from here
2099 return true;
2100 }
2101
2102 virtual void OnExit()
2103 {
2104 if ( wxSocketBase::IsInitialized() )
2105 wxSocketBase::Shutdown();
2106 }
2107
2108 private:
2109 DECLARE_DYNAMIC_CLASS(wxSocketModule)
2110 };
2111
2112 IMPLEMENT_DYNAMIC_CLASS(wxSocketModule, wxModule)
2113
2114 #if defined(wxUSE_SELECT_DISPATCHER) && wxUSE_SELECT_DISPATCHER
2115 // NOTE: we need to force linking against socketiohandler.cpp otherwise in
2116 // static builds of wxWidgets the ManagerSetter::ManagerSetter ctor
2117 // contained there wouldn't be ever called
2118 wxFORCE_LINK_MODULE( socketiohandler )
2119 #endif
2120
2121 // same for ManagerSetter in the MSW file
2122 #ifdef __WINDOWS__
2123 wxFORCE_LINK_MODULE( mswsocket )
2124 #endif
2125
2126 // and for OSXManagerSetter in the OS X one
2127 #ifdef __WXOSX__
2128 wxFORCE_LINK_MODULE( osxsocket )
2129 #endif
2130
2131 #endif // wxUSE_SOCKETS