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