| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470 | 
							- /////////////////////////////////////////////////////////////////////////////
 
- // Name:        socket.h
 
- // Purpose:     interface of wxIP*address, wxSocket* classes
 
- // Author:      wxWidgets team
 
- // Licence:     wxWindows licence
 
- /////////////////////////////////////////////////////////////////////////////
 
- /**
 
-     The type of the native socket.
 
-     Notice that the definition below is simplified and this type is not always
 
-     int, e.g. it is a 64 bit integer type under Win64.
 
-     @since 2.9.5
 
-   */
 
- typedef int wxSOCKET_T;
 
- /**
 
-     @class wxIPaddress
 
-     wxIPaddress is an abstract base class for all internet protocol address
 
-     objects. Currently, only wxIPV4address is implemented. An experimental
 
-     implementation for IPV6, wxIPV6address, is being developed.
 
-     @library{wxnet}
 
-     @category{net}
 
- */
 
- class wxIPaddress : public wxSockAddress
 
- {
 
- public:
 
-     /**
 
-         Internally, this is the same as setting the IP address to @b INADDR_ANY.
 
-         On IPV4 implementations, 0.0.0.0
 
-         On IPV6 implementations, ::
 
-         @return @true on success, @false if something went wrong.
 
-     */
 
-     bool AnyAddress();
 
-     /**
 
-         Internally, this is the same as setting the IP address to @b INADDR_BROADCAST.
 
-         On IPV4 implementations, 255.255.255.255
 
-         @return @true on success, @false if something went wrong.
 
-     */
 
-     virtual bool BroadcastAddress() = 0;
 
-     /**
 
-         Set the address to hostname, which can be a host name or an IP-style address
 
-         in a format dependent on implementation.
 
-         @return @true on success, @false if something goes wrong (invalid
 
-                 hostname or invalid IP address).
 
-     */
 
-     bool Hostname(const wxString& hostname);
 
-     /**
 
-         Returns the hostname which matches the IP address.
 
-     */
 
-     wxString Hostname() const;
 
-     /**
 
-         Returns a wxString containing the IP address.
 
-     */
 
-     virtual wxString IPAddress() const = 0;
 
-     /**
 
-         Determines if current address is set to localhost.
 
-         @return @true if address is localhost, @false if internet address.
 
-     */
 
-     virtual bool IsLocalHost() const = 0;
 
-     /**
 
-         Set address to localhost.
 
-         On IPV4 implementations, 127.0.0.1
 
-         On IPV6 implementations, ::1
 
-         @return @true on success, @false if something went wrong.
 
-     */
 
-     bool LocalHost();
 
-     /**
 
-         Set the port to that corresponding to the specified service.
 
-         @return @true on success, @false if something goes wrong (invalid @a service).
 
-     */
 
-     bool Service(const wxString& service);
 
-     /**
 
-         Set the port to that corresponding to the specified service.
 
-         @return @true on success, @false if something goes wrong (invalid @a service).
 
-     */
 
-     bool Service(unsigned short service);
 
-     /**
 
-         Returns the current service.
 
-     */
 
-     unsigned short Service() const;
 
- };
 
- /**
 
-     @class wxIPV4address
 
-     A class for working with IPv4 network addresses.
 
-     @library{wxnet}
 
-     @category{net}
 
- */
 
- class wxIPV4address : public wxIPaddress
 
- {
 
- public:
 
-     /**
 
-         Set address to any of the addresses of the current machine.
 
-         Whenever possible, use this function instead of LocalHost(),
 
-         as this correctly handles multi-homed hosts and avoids other small
 
-         problems. Internally, this is the same as setting the IP address
 
-         to @b INADDR_ANY.
 
-         @return @true on success, @false if something went wrong.
 
-     */
 
-     bool AnyAddress();
 
-     /**
 
-         Set the address to hostname, which can be a host name or an IP-style address
 
-         in dot notation(<tt>a.b.c.d</tt>).
 
-         @return @true on success, @false if something goes wrong (invalid
 
-                 hostname or invalid IP address).
 
-     */
 
-     bool Hostname(const wxString& hostname);
 
-     /**
 
-         Returns the hostname which matches the IP address.
 
-     */
 
-     virtual wxString Hostname() const;
 
-     /**
 
-         Returns a wxString containing the IP address in dot quad (127.0.0.1) format.
 
-     */
 
-     virtual wxString IPAddress() const;
 
-     /**
 
-         Set address to localhost (127.0.0.1).
 
-         Whenever possible, use AnyAddress() instead of this one, as that one will
 
-         correctly handle multi-homed hosts and avoid other small problems.
 
-         @return @true on success, @false if something went wrong.
 
-     */
 
-     bool LocalHost();
 
-     /**
 
-         Set the port to that corresponding to the specified @a service.
 
-         @return @true on success, @false if something goes wrong (invalid @a service).
 
-     */
 
-     bool Service(const wxString& service);
 
-     /**
 
-         Set the port to that corresponding to the specified @a service.
 
-         @return @true on success, @false if something goes wrong (invalid @a service).
 
-     */
 
-     bool Service(unsigned short service);
 
-     /**
 
-         Returns the current service.
 
-     */
 
-     unsigned short Service() const;
 
- };
 
- /**
 
-     @class wxSocketServer
 
-     @todo describe me.
 
-     @library{wxnet}
 
-     @category{net}
 
- */
 
- class wxSocketServer : public wxSocketBase
 
- {
 
- public:
 
-     /**
 
-         Constructs a new server and tries to bind to the specified @e address.
 
-         Before trying to accept new connections, remember to test whether it succeeded
 
-         with wxSocketBase:IsOk().
 
-         @param address
 
-             Specifies the local address for the server (e.g. port number).
 
-         @param flags
 
-             Socket flags (See wxSocketBase::SetFlags()).
 
-     */
 
-     wxSocketServer(const wxSockAddress& address,
 
-                    wxSocketFlags flags = wxSOCKET_NONE);
 
-     /**
 
-         Destructor (it doesn't close the accepted connections).
 
-     */
 
-     virtual ~wxSocketServer();
 
-     /**
 
-         Accepts an incoming connection request, and creates a new wxSocketBase
 
-         object which represents the server-side of the connection.
 
-         If @a wait is @true and there are no pending connections to be
 
-         accepted, it will wait for the next incoming connection to
 
-         arrive.
 
-         @warning This method will block the GUI.
 
-         If @a wait is @false, it will try to accept a pending connection
 
-         if there is one, but it will always return immediately without blocking
 
-         the GUI. If you want to use Accept() in this way, you can either check for
 
-         incoming connections with WaitForAccept() or catch @b wxSOCKET_CONNECTION events,
 
-         then call Accept() once you know that there is an incoming connection waiting
 
-         to be accepted.
 
-         @return Returns an opened socket connection, or @NULL if an error
 
-                 occurred or if the wait parameter was @false and there
 
-                 were no pending connections.
 
-         @see WaitForAccept(), wxSocketBase::SetNotify(),
 
-              wxSocketBase::Notify(), AcceptWith()
 
-     */
 
-     wxSocketBase* Accept(bool wait = true);
 
-     /**
 
-         Accept an incoming connection using the specified socket object.
 
-         @param socket
 
-             Socket to be initialized
 
-         @param wait
 
-             See Accept() for more info.
 
-         @return Returns @true on success, or @false if an error occurred or
 
-                 if the wait parameter was @false and there were no pending
 
-                 connections.
 
-         @see WaitForAccept(), wxSocketBase::SetNotify(),
 
-              wxSocketBase::Notify(), Accept()
 
-     */
 
-     bool AcceptWith(wxSocketBase& socket, bool wait = true);
 
-     /**
 
-         Wait for an incoming connection.
 
-         Use it if you want to call Accept() or AcceptWith() with @e wait set
 
-         to @false, to detect when an incoming connection is waiting to be accepted.
 
-         @param seconds
 
-             Number of seconds to wait. If -1, it will wait for the default
 
-             timeout, as set with wxSocketBase::SetTimeout().
 
-         @param millisecond
 
-             Number of milliseconds to wait.
 
-         @return @true if an incoming connection arrived, @false if the timeout
 
-                 elapsed.
 
-         @see Accept(), AcceptWith(), wxSocketBase::InterruptWait()
 
-     */
 
-     bool WaitForAccept(long seconds = -1, long millisecond = 0);
 
- };
 
- /**
 
-     @class wxSocketClient
 
-     @todo describe me.
 
-     @library{wxnet}
 
-     @category{net}
 
- */
 
- class wxSocketClient : public wxSocketBase
 
- {
 
- public:
 
-     /**
 
-         Constructor.
 
-         @param flags
 
-             Socket flags (See wxSocketBase::SetFlags())
 
-     */
 
-     wxSocketClient(wxSocketFlags flags = wxSOCKET_NONE);
 
-     /**
 
-         Destructor. Please see wxSocketBase::Destroy().
 
-     */
 
-     virtual ~wxSocketClient();
 
-     /**
 
-         Connects to a server using the specified address.
 
-         If @a wait is @true, Connect() will wait until the connection
 
-         completes.
 
-         @warning This method will block the GUI.
 
-         If @a wait is @false, Connect() will try to establish the connection
 
-         and return immediately, without blocking the GUI. When used this way,
 
-         even if Connect() returns @false, the connection request can be
 
-         completed later. To detect this, use WaitOnConnect(), or catch
 
-         @b wxSOCKET_CONNECTION events (for successful establishment) and
 
-         @b wxSOCKET_LOST events (for connection failure).
 
-         @param address
 
-             Address of the server.
 
-         @param wait
 
-             If @true, waits for the connection to complete.
 
-         @return @true if the connection is established and no error occurs.
 
-                 If @a wait was true, and Connect() returns @false, an error
 
-                 occurred and the connection failed.
 
-                 If @a wait was @false, and Connect() returns @false, you should
 
-                 still be prepared to handle the completion of this connection request,
 
-                 either with WaitOnConnect() or by watching wxSOCKET_CONNECTION
 
-                 and wxSOCKET_LOST events.
 
-         @see WaitOnConnect(), wxSocketBase::SetNotify(), wxSocketBase::Notify()
 
-     */
 
-     virtual bool Connect(const wxSockAddress& address, bool wait = true);
 
-     /**
 
-         Connects to a server using the specified address.
 
-         If @a wait is @true, Connect() will wait until the connection
 
-         completes. @b Warning: This will block the GUI.
 
-         If @a wait is @false, Connect() will try to establish the connection
 
-         and return immediately, without blocking the GUI. When used this way,
 
-         even if Connect() returns @false, the connection request can be
 
-         completed later. To detect this, use WaitOnConnect(), or catch
 
-         @b wxSOCKET_CONNECTION events (for successful establishment) and
 
-         @b wxSOCKET_LOST events (for connection failure).
 
-         @param address
 
-             Address of the server.
 
-         @param local
 
-             Bind to the specified local address and port before connecting.
 
-             The local address and port can also be set using SetLocal(),
 
-             and then using the 2-parameter Connect() method.
 
-         @param wait
 
-             If @true, waits for the connection to complete.
 
-         @return @true if the connection is established and no error occurs.
 
-                 If @a wait was true, and Connect() returns @false, an error
 
-                 occurred and the connection failed.
 
-                 If @a wait was @false, and Connect() returns @false, you should
 
-                 still be prepared to handle the completion of this connection request,
 
-                 either with WaitOnConnect() or by watching wxSOCKET_CONNECTION
 
-                 and wxSOCKET_LOST events.
 
-         @see WaitOnConnect(), wxSocketBase::SetNotify(), wxSocketBase::Notify()
 
-     */
 
-     bool Connect(const wxSockAddress& address, const wxSockAddress& local,
 
-                  bool wait = true);
 
-     /**
 
-         Wait until a connection request completes, or until the specified timeout
 
-         elapses. Use this function after issuing a call to Connect() with
 
-         @e wait set to @false.
 
-         @param seconds
 
-             Number of seconds to wait.
 
-             If -1, it will wait for the default timeout, as set with wxSocketBase::SetTimeout().
 
-         @param milliseconds
 
-             Number of milliseconds to wait.
 
-         @return
 
-             WaitOnConnect() returns @true if the connection request completes.
 
-             This does not necessarily mean that the connection was
 
-             successfully established; it might also happen that the
 
-             connection was refused by the peer. Use wxSocketBase::IsConnected()
 
-             to distinguish between these two situations.
 
-             @n @n If the timeout elapses, WaitOnConnect() returns @false.
 
-             @n @n These semantics allow code like this:
 
-             @code
 
-             // Issue the connection request
 
-             client->Connect(addr, false);
 
-             // Wait until the request completes or until we decide to give up
 
-             bool waitmore = true;
 
-             while ( !client->WaitOnConnect(seconds, millis) && waitmore )
 
-             {
 
-                 // possibly give some feedback to the user,
 
-                 // and update waitmore as needed.
 
-             }
 
-             bool success = client->IsConnected();
 
-             @endcode
 
-     */
 
-     bool WaitOnConnect(long seconds = -1, long milliseconds = 0);
 
- };
 
- /**
 
-     @class wxSockAddress
 
-     You are unlikely to need to use this class: only wxSocketBase uses it.
 
-     @library{wxnet}
 
-     @category{net}
 
-     @see wxSocketBase, wxIPaddress, wxIPV4address
 
- */
 
- class wxSockAddress : public wxObject
 
- {
 
- public:
 
-     /**
 
-         Default constructor.
 
-     */
 
-     wxSockAddress();
 
-     /**
 
-         Default destructor.
 
-     */
 
-     virtual ~wxSockAddress();
 
-     /**
 
-         Delete all information about the address.
 
-     */
 
-     virtual void Clear();
 
-     /**
 
-         Returns the length of the socket address.
 
-     */
 
-     int SockAddrLen();
 
-     /**
 
-         Returns the pointer to the low-level representation of the address.
 
-         This can be used to pass socket address information to a 3rd party
 
-         library.
 
-         @return
 
-             Pointer to a sockaddr-derived struct.
 
-     */
 
-     const sockaddr *GetAddressData() const;
 
-     /**
 
-         Returns the length of the buffer retrieved by GetAddressData().
 
-         @return
 
-             The size of the sockaddr-derived struct corresponding to this
 
-             address.
 
-     */
 
-     int GetAddressDataLen() const;
 
- };
 
- /**
 
-     @class wxSocketEvent
 
-     This event class contains information about socket events.
 
-     This kind of events are sent to the event handler specified with
 
-     wxSocketBase::SetEventHandler.
 
-     @beginEventTable{wxSocketEvent}
 
-     @event{EVT_SOCKET(id, func)}
 
-         Process a socket event, supplying the member function.
 
-     @endEventTable
 
-     @library{wxnet}
 
-     @category{net}
 
-     @see wxSocketBase, wxSocketClient, wxSocketServer
 
- */
 
- class wxSocketEvent : public wxEvent
 
- {
 
- public:
 
-     /**
 
-         Constructor.
 
-     */
 
-     wxSocketEvent(int id = 0);
 
-     /**
 
-         Gets the client data of the socket which generated this event, as
 
-         set with wxSocketBase::SetClientData().
 
-     */
 
-     void* GetClientData() const;
 
-     /**
 
-         Returns the socket object to which this event refers to.
 
-         This makes it possible to use the same event handler for different sockets.
 
-     */
 
-     wxSocketBase* GetSocket() const;
 
-     /**
 
-         Returns the socket event type.
 
-     */
 
-     wxSocketNotify GetSocketEvent() const;
 
- };
 
- /**
 
-     wxSocket error return values.
 
- */
 
- enum wxSocketError
 
- {
 
-     wxSOCKET_NOERROR,       ///< No error happened.
 
-     wxSOCKET_INVOP,         ///< Invalid operation.
 
-     wxSOCKET_IOERR,         ///< Input/Output error.
 
-     wxSOCKET_INVADDR,       ///< Invalid address passed to wxSocket.
 
-     wxSOCKET_INVSOCK,       ///< Invalid socket (uninitialized).
 
-     wxSOCKET_NOHOST,        ///< No corresponding host.
 
-     wxSOCKET_INVPORT,       ///< Invalid port.
 
-     wxSOCKET_WOULDBLOCK,    ///< The socket is non-blocking and the operation would block.
 
-     wxSOCKET_TIMEDOUT,      ///< The timeout for this operation expired.
 
-     wxSOCKET_MEMERR         ///< Memory exhausted.
 
- };
 
- /**
 
-     @anchor wxSocketEventFlags
 
-     wxSocket Event Flags.
 
-     A brief note on how to use these events:
 
-     The @b wxSOCKET_INPUT event will be issued whenever there is data available
 
-     for reading. This will be the case if the input queue was empty and new data
 
-     arrives, or if the application has read some data yet there is still more data
 
-     available. This means that the application does not need to read all available
 
-     data in response to a @b wxSOCKET_INPUT event, as more events will be produced
 
-     as necessary.
 
-     The @b wxSOCKET_OUTPUT event is issued when a socket is first connected with
 
-     Connect() or accepted with Accept(). After that, new events will be generated
 
-     only after an output operation fails with @b wxSOCKET_WOULDBLOCK and buffer space
 
-     becomes available again. This means that the application should assume that it can
 
-     write data to the socket until an @b wxSOCKET_WOULDBLOCK error occurs; after this,
 
-     whenever the socket becomes writable again the application will be notified with
 
-     another @b wxSOCKET_OUTPUT event.
 
-     The @b wxSOCKET_CONNECTION event is issued when a delayed connection request completes
 
-     successfully (client) or when a new connection arrives at the incoming queue (server).
 
-     The @b wxSOCKET_LOST event is issued when a close indication is received for the socket.
 
-     This means that the connection broke down or that it was closed by the peer. Also, this
 
-     event will be issued if a connection request fails.
 
- */
 
- enum wxSocketEventFlags
 
- {
 
-     wxSOCKET_INPUT,         ///< There is data available for reading.
 
-     wxSOCKET_OUTPUT,        ///< The socket is ready to be written to.
 
-     wxSOCKET_CONNECTION,    ///< Incoming connection request (server), or
 
-                             ///< successful connection establishment (client).
 
-     wxSOCKET_LOST           ///< The connection has been closed.
 
- };
 
- /**
 
-     @anchor wxSocketFlags
 
-     wxSocket Flags.
 
-     A brief overview on how to use these flags follows.
 
-     If no flag is specified (this is the same as @b wxSOCKET_NONE),
 
-     IO calls will return after some data has been read or written, even
 
-     when the transfer might not be complete. This is the same as issuing
 
-     exactly one blocking low-level call to @b recv() or @b send(). Note
 
-     that @e blocking here refers to when the function returns, not
 
-     to whether the GUI blocks during this time.
 
-     If @b wxSOCKET_NOWAIT is specified, IO calls will return immediately.
 
-     Read operations will retrieve only available data. Write operations will
 
-     write as much data as possible, depending on how much space is available
 
-     in the output buffer. This is the same as issuing exactly one nonblocking
 
-     low-level call to @b recv() or @b send(). Note that @e nonblocking here
 
-     refers to when the function returns, not to whether the GUI blocks during
 
-     this time.  Also note that this flag impacts both Read and Write
 
-     operations.  If it is desired to control Read independently of Write, for
 
-     example you want no wait on Read(), but you do want to wait on Write(), then
 
-     use wxSOCKET_NOWAIT_READ and wxSOCKET_NOWAIT_WRITE.
 
-     If @b wxSOCKET_NOWAIT_READ (this flag is new since wxWidgets 2.9.5) is
 
-     specified, Read operations will return immediately. Read operations will
 
-     retrieve only available data. This is the same as issuing exactly one
 
-     nonblocking low-level call to @b recv(). Note that @e nonblocking here
 
-     refers to when the function returns, not to whether the GUI blocks during
 
-     this time.  This flag should not be enabled if ReadMsg() is going to be
 
-     used (it will be ignored), if you do then thread-safety may be at risk.
 
-     Note that wxSOCKET_NOWAIT_READ impacts only Read operations and does not
 
-     impact Write operations, allowing Read and Write operations to be set
 
-     differently.
 
-     If @b wxSOCKET_NOWAIT_WRITE (this flag is new since wxWidgets 2.9.5) is
 
-     specified, Write operations will return immediately. Write operations will
 
-     write as much data as possible, depending on how much space is available in
 
-     the output buffer. This is the same as issuing exactly one nonblocking
 
-     low-level call to @b send(). Note that @e nonblocking here refers to when
 
-     the function returns, not to whether the GUI blocks during this time.  This
 
-     flag should not be enabled if WriteMsg() is going to be used (it will be
 
-     ignored), if you use it then thread safety may be at risk. Note that
 
-     wxSOCKET_NOWAIT_WRITE impacts only Write operations and does not impact
 
-     Write operations, allowing Read and Write operations to be set differently.
 
-     If @b wxSOCKET_WAITALL is specified, IO calls won't return until ALL
 
-     the data has been read or written (or until an error occurs), blocking if
 
-     necessary, and issuing several low level calls if necessary. This is the
 
-     same as having a loop which makes as many blocking low-level calls to
 
-     @b recv() or @b send() as needed so as to transfer all the data. Note
 
-     that @e blocking here refers to when the function returns, not
 
-     to whether the GUI blocks during this time.  Note that wxSOCKET_WAITALL
 
-     impacts both Read and Write operations.  If you desire to wait
 
-     for all on just Read operations, but not on Write operations, (or vice versa),
 
-     use wxSOCKET_WAITALL_READ or wxSOCKET_WAITALL_WRITE.
 
-     If @b wxSOCKET_WAITALL_READ (this flag is new since wxWidgets 2.9.5) is
 
-     specified, Read operations won't return until ALL the data has been read
 
-     (or until an error occurs), blocking if necessary, and issuing several low
 
-     level calls if necessary. This is the same as having a loop which makes as
 
-     many blocking low-level calls to @b recv() as needed so as to transfer all
 
-     the data. Note that @e blocking here refers to when the function returns,
 
-     not to whether the GUI blocks during this time.  Note that
 
-     wxSOCKET_WAITALL_READ only has an impact on Read operations, and has no
 
-     impact on Write operations, allowing Read and Write operations to have
 
-     different settings.
 
-     If @b wxSOCKET_WAITALL_WRITE (this flag is new since wxWidgets 2.9.5) is
 
-     specified, Write() and WriteMsg() calls won't return until ALL the data has
 
-     been written (or until an error occurs), blocking if necessary, and issuing
 
-     several low level calls if necessary. This is the same as having a loop
 
-     which makes as many blocking low-level calls to @b send() as needed so as
 
-     to transfer all the data. Note that @e blocking here refers to when the
 
-     function returns, not to whether the GUI blocks during this time.  Note
 
-     that wxSOCKET_WAITALL_WRITE only has an impact on Write operations, and has
 
-     no impact on Read operations, allowing Read and Write operations to have
 
-     different settings.
 
-     The @b wxSOCKET_BLOCK flag controls whether the GUI blocks during
 
-     IO operations. If this flag is specified, the socket will not yield
 
-     during IO calls, so the GUI will remain blocked until the operation
 
-     completes. If it is not used, then the application must take extra
 
-     care to avoid unwanted reentrance.
 
-     The @b wxSOCKET_REUSEADDR flag controls the use of the @b SO_REUSEADDR standard
 
-     @b setsockopt() flag. This flag allows the socket to bind to a port that is
 
-     already in use. This is mostly used on UNIX-based systems to allow rapid starting
 
-     and stopping of a server, otherwise you may have to wait several minutes for the
 
-     port to become available.
 
-     @b wxSOCKET_REUSEADDR can also be used with socket clients to (re)bind to a
 
-     particular local port for an outgoing connection.
 
-     This option can have surprising platform dependent behaviour, so check the
 
-     documentation for your platform's implementation of setsockopt().
 
-     Note that on BSD-based systems(e.g. Mac OS X), use of
 
-     @b wxSOCKET_REUSEADDR implies @b SO_REUSEPORT in addition to
 
-     @b SO_REUSEADDR to be consistent with Windows.
 
-     The @b wxSOCKET_BROADCAST flag controls the use of the @b SO_BROADCAST standard
 
-     @b setsockopt() flag. This flag allows the socket to use the broadcast address,
 
-     and is generally used in conjunction with @b wxSOCKET_NOBIND and
 
-     wxIPaddress::BroadcastAddress().
 
-     So:
 
-     - @b wxSOCKET_NONE will try to read at least SOME data, no matter how much.
 
-     - @b wxSOCKET_NOWAIT will always return immediately, even if it cannot
 
-       read or write ANY data.
 
-     - @b wxSOCKET_WAITALL will only return when it has read or written ALL
 
-       the data.
 
-     - @b wxSOCKET_BLOCK has nothing to do with the previous flags and
 
-       it controls whether the GUI blocks.
 
-     - @b wxSOCKET_REUSEADDR controls special platform-specific behaviour for
 
-       reusing local addresses/ports.
 
- */
 
- enum
 
- {
 
-     wxSOCKET_NONE = 0,      ///< Normal functionality.
 
-     wxSOCKET_NOWAIT = 1,    ///< Read/write as much data as possible and return immediately.
 
-     wxSOCKET_WAITALL = 2,   ///< Wait for all required data to be read/written unless an error occurs.
 
-     wxSOCKET_BLOCK = 4,     ///< Block the GUI (do not yield) while reading/writing data.
 
-     wxSOCKET_REUSEADDR = 8, ///< Allows the use of an in-use port.
 
-     wxSOCKET_BROADCAST = 16, ///< Switches the socket to broadcast mode
 
-     wxSOCKET_NOBIND = 32,   ///< Stops the socket from being bound to a specific
 
-                             ///< adapter (normally used in conjunction with
 
-                             ///< @b wxSOCKET_BROADCAST)
 
-     wxSOCKET_NOWAIT_READ = 64,    ///< Read as much data as possible and return immediately
 
-     wxSOCKET_WAITALL_READ = 128,  ///< Wait for all required data to be read unless an error occurs.
 
-     wxSOCKET_NOWAIT_WRITE = 256,   ///< Write as much data as possible and return immediately
 
-     wxSOCKET_WAITALL_WRITE = 512   ///< Wait for all required data to be written unless an error occurs.
 
- };
 
- /**
 
-     @class wxSocketBase
 
-     wxSocketBase is the base class for all socket-related objects, and it
 
-     defines all basic IO functionality.
 
-     @note
 
-     When using wxSocket from multiple threads, even implicitly (e.g. by using
 
-     wxFTP or wxHTTP in another thread) you must initialize the sockets from the
 
-     main thread by calling Initialize() before creating the other ones.
 
-     @beginEventEmissionTable{wxSocketEvent}
 
-     @event{EVT_SOCKET(id, func)}
 
-         Process a @c wxEVT_SOCKET event.
 
-         See @ref wxSocketEventFlags and @ref wxSocketFlags for more info.
 
-     @endEventTable
 
-     @library{wxnet}
 
-     @category{net}
 
-     @see wxSocketEvent, wxSocketClient, wxSocketServer, @sample{sockets},
 
-          @ref wxSocketFlags, ::wxSocketEventFlags, ::wxSocketError
 
- */
 
- class wxSocketBase : public wxObject
 
- {
 
- public:
 
-     /**
 
-         @name Construction and Destruction
 
-     */
 
-     //@{
 
-     /**
 
-         Default constructor.
 
-         Don't use it directly; instead, use wxSocketClient to construct a socket client,
 
-         or wxSocketServer to construct a socket server.
 
-     */
 
-     wxSocketBase();
 
-     /**
 
-         Destructor.
 
-         Do not destroy a socket using the delete operator directly;
 
-         use Destroy() instead. Also, do not create socket objects in the stack.
 
-     */
 
-     virtual ~wxSocketBase();
 
-     /**
 
-         Destroys the socket safely.
 
-         Use this function instead of the delete operator, since otherwise socket events
 
-         could reach the application even after the socket has been destroyed. To prevent
 
-         this problem, this function appends the wxSocket to a list of object to be deleted
 
-         on idle time, after all events have been processed. For the same reason, you should
 
-         avoid creating socket objects in the stack.
 
-         Destroy() calls Close() automatically.
 
-         @return Always @true.
 
-     */
 
-     bool Destroy();
 
-     /**
 
-         Perform the initialization needed in order to use the sockets.
 
-         This function is called from wxSocket constructor implicitly and so
 
-         normally doesn't need to be called explicitly. There is however one
 
-         important exception: as this function must be called from the main
 
-         (UI) thread, if you use wxSocket from multiple threads you must call
 
-         Initialize() from the main thread before creating wxSocket objects in
 
-         the other ones.
 
-         It is safe to call this function multiple times (only the first call
 
-         does anything) but you must call Shutdown() exactly once for every call
 
-         to Initialize().
 
-         This function should only be called from the main thread.
 
-         @return
 
-             @true if the sockets can be used, @false if the initialization
 
-             failed and sockets are not available at all.
 
-      */
 
-     static bool Initialize();
 
-     /**
 
-         Shut down the sockets.
 
-         This function undoes the call to Initialize() and must be called after
 
-         every successful call to Initialize().
 
-         This function should only be called from the main thread, just as
 
-         Initialize().
 
-      */
 
-     static void Shutdown();
 
-     //@}
 
-     /**
 
-         @name Socket State
 
-     */
 
-     //@{
 
-     /**
 
-         Returns @true if an error occurred in the last IO operation.
 
-         Use this function to check for an error condition after one of the
 
-         following calls: Discard(), Peek(), Read(), ReadMsg(), Unread(), Write(), WriteMsg().
 
-     */
 
-     bool Error() const;
 
-     /**
 
-         Return the local address of the socket.
 
-         @return @true if no error happened, @false otherwise.
 
-     */
 
-     virtual bool GetLocal(wxSockAddress& addr) const;
 
-     /**
 
-         Return the peer address field of the socket.
 
-         @return @true if no error happened, @false otherwise.
 
-     */
 
-     virtual bool GetPeer(wxSockAddress& addr) const;
 
-     /**
 
-         Return the socket timeout in seconds.
 
-         The timeout can be set using SetTimeout() and is 10 minutes by default.
 
-      */
 
-     long GetTimeout() const;
 
-     /**
 
-         Returns @true if the socket is connected.
 
-     */
 
-     bool IsConnected() const;
 
-     /**
 
-         Check if the socket can be currently read or written.
 
-         This might mean that queued data is available for reading or, for streamed
 
-         sockets, that the connection has been closed, so that a read operation will
 
-         complete immediately without blocking (unless the @b wxSOCKET_WAITALL flag
 
-         is set, in which case the operation might still block).
 
-     */
 
-     bool IsData();
 
-     /**
 
-         Returns @true if the socket is not connected.
 
-     */
 
-     bool IsDisconnected() const;
 
-     /**
 
-         Returns @true if the socket is initialized and ready and @false in other
 
-         cases.
 
-         @remarks
 
-         For wxSocketClient, IsOk() won't return @true unless the client is connected to a server.
 
-         For wxSocketServer, IsOk() will return @true if the server could bind to the specified address
 
-         and is already listening for new connections.
 
-         IsOk() does not check for IO errors; use Error() instead for that purpose.
 
-     */
 
-     bool IsOk() const;
 
-     /**
 
-         Returns the number of bytes read or written by the last IO call.
 
-         Use this function to get the number of bytes actually transferred
 
-         after using one of the following IO calls: Discard(), Peek(), Read(),
 
-         ReadMsg(), Unread(), Write(), WriteMsg().
 
-         @deprecated
 
-         This function is kept mostly for backwards compatibility.  Use
 
-         LastReadCount() or LastWriteCount() instead.  LastCount() is still
 
-         needed for use with less commonly used functions: Discard(),
 
-         Peek(), and Unread().
 
-     */
 
-     wxUint32 LastCount() const;
 
-     /**
 
-         Returns the number of bytes read by the last Read() or ReadMsg()
 
-         call (receive direction only).
 
-         This function is thread-safe, in case Read() is executed in a
 
-         different thread than Write().  Use LastReadCount() instead of
 
-         LastCount() for this reason.
 
-         Unlike LastCount(), the functions Discard(), Peek(), and Unread()
 
-         are currently not supported by LastReadCount().
 
-         @since 2.9.5
 
-     */
 
-     wxUint32 LastReadCount() const;
 
-     /**
 
-         Returns the number of bytes written by the last Write() or WriteMsg()
 
-         call (transmit direction only).
 
-         This function is thread-safe, in case Write() is executed in a
 
-         different thread than Read().  Use LastWriteCount() instead of
 
-         LastCount() for this reason.
 
-         @since 2.9.5
 
-     */
 
-     wxUint32 LastWriteCount() const;
 
-     /**
 
-         Returns the last wxSocket error. See @ref wxSocketError .
 
-         @note
 
-         This function merely returns the last error code,
 
-         but it should not be used to determine if an error has occurred (this
 
-         is because successful operations do not change the LastError value).
 
-         Use Error() first, in order to determine if the last IO call failed.
 
-         If this returns @true, use LastError() to discover the cause of the error.
 
-     */
 
-     wxSocketError LastError() const;
 
-     /**
 
-         Restore the previous state of the socket, as saved with SaveState().
 
-         Calls to SaveState() and RestoreState() can be nested.
 
-         @see SaveState()
 
-     */
 
-     void RestoreState();
 
-     /**
 
-         Save the current state of the socket in a stack.
 
-         Socket state includes flags, as set with SetFlags(), event mask, as set
 
-         with SetNotify() and Notify(), user data, as set with SetClientData().
 
-         Calls to SaveState and RestoreState can be nested.
 
-         @see RestoreState()
 
-     */
 
-     void SaveState();
 
-     //@}
 
-     /**
 
-         @name Basic I/O
 
-         See also: wxSocketServer::WaitForAccept(), wxSocketClient::WaitOnConnect()
 
-     */
 
-     //@{
 
-     /**
 
-         Shut down the socket, disabling further transmission and reception of
 
-         data and disable events for the socket and frees the associated system
 
-         resources.
 
-         Upon socket destruction, Close() is automatically called, so in most cases
 
-         you won't need to do it yourself, unless you explicitly want to shut down
 
-         the socket, typically to notify the peer that you are closing the connection.
 
-         @remarks
 
-         Although Close() immediately disables events for the socket, it is possible
 
-         that event messages may be waiting in the application's event queue.
 
-         The application must therefore be prepared to handle socket event messages even
 
-         after calling Close().
 
-     */
 
-     virtual bool Close();
 
-     /**
 
-         Shuts down the writing end of the socket.
 
-         This function simply calls the standard shutdown() function on the
 
-         underlying socket, indicating that nothing will be written to this
 
-         socket any more.
 
-      */
 
-     void ShutdownOutput();
 
-     /**
 
-         Delete all bytes in the incoming queue.
 
-         This function always returns immediately and its operation is not
 
-         affected by IO flags.
 
-         Use LastCount() to verify the number of bytes actually discarded.
 
-         If you use Error(), it will always return @false.
 
-     */
 
-     wxSocketBase& Discard();
 
-     /**
 
-         Returns current IO flags, as set with SetFlags()
 
-     */
 
-     wxSocketFlags GetFlags() const;
 
-     /**
 
-         Use this function to interrupt any wait operation currently in progress.
 
-         Note that this is not intended as a regular way to interrupt a Wait call,
 
-         but only as an escape mechanism for exceptional situations where it is
 
-         absolutely necessary to use it, for example to abort an operation due to
 
-         some exception or abnormal problem. InterruptWait is automatically called
 
-         when you Close() a socket (and thus also upon
 
-         socket destruction), so you don't need to use it in these cases.
 
-         @see  Wait(), WaitForLost(), WaitForRead(), WaitForWrite(),
 
-               wxSocketServer::WaitForAccept(), wxSocketClient::WaitOnConnect()
 
-     */
 
-     void InterruptWait();
 
-     /**
 
-         Peek into the socket by copying the next bytes which would be read by
 
-         Read() into the provided buffer.
 
-         Peeking a buffer doesn't delete it from the socket input queue, i.e.
 
-         calling Read() will return the same data.
 
-         Use LastCount() to verify the number of bytes actually peeked.
 
-         Use Error() to determine if the operation succeeded.
 
-         @param buffer
 
-             Buffer where to put peeked data.
 
-         @param nbytes
 
-             Number of bytes.
 
-         @return Returns a reference to the current object.
 
-         @remarks
 
-             The exact behaviour of Peek() depends on the combination of flags being used.
 
-             For a detailed explanation, see SetFlags()
 
-         @see Error(), LastError(), LastCount(), SetFlags()
 
-     */
 
-     wxSocketBase& Peek(void* buffer, wxUint32 nbytes);
 
-     /**
 
-         Read up to the given number of bytes from the socket.
 
-         Use LastReadCount() to verify the number of bytes actually read.
 
-         Use Error() to determine if the operation succeeded.
 
-         @param buffer
 
-             Buffer where to put read data.
 
-         @param nbytes
 
-             Number of bytes.
 
-         @return Returns a reference to the current object.
 
-         @remarks
 
-             The exact behaviour of Read() depends on the combination of flags being used.
 
-             For a detailed explanation, see SetFlags()
 
-         @see Error(), LastError(), LastReadCount(),
 
-              SetFlags()
 
-     */
 
-     wxSocketBase& Read(void* buffer, wxUint32 nbytes);
 
-     /**
 
-         Receive a message sent by WriteMsg().
 
-         If the buffer passed to the function isn't big enough, the remaining
 
-         bytes will be discarded. This function always waits for the buffer to
 
-         be entirely filled, unless an error occurs.
 
-         Use LastReadCount() to verify the number of bytes actually read.
 
-         Use Error() to determine if the operation succeeded.
 
-         @param buffer
 
-             Buffer where to put read data.
 
-         @param nbytes
 
-             Size of the buffer.
 
-         @return Returns a reference to the current object.
 
-         @remarks
 
-             ReadMsg() will behave as if the @b wxSOCKET_WAITALL flag was always set
 
-             and it will always ignore the @b wxSOCKET_NOWAIT flag.
 
-             The exact behaviour of ReadMsg() depends on the @b wxSOCKET_BLOCK flag.
 
-             For a detailed explanation, see SetFlags().
 
-             For thread safety, in case ReadMsg() and WriteMsg() are called in
 
-             different threads, it is a good idea to call
 
-             SetFlags(wxSOCKET_WAITALL|wx_SOCKET_BLOCK) before the first calls
 
-             to ReadMsg() and WriteMsg() in different threads, as each of these
 
-             functions will call SetFlags() which performs read/modify/write.  By
 
-             setting these flags before the multi-threading, it will ensure that
 
-             they don't get reset by thread race conditions.
 
-         @see Error(), LastError(), LastReadCount(), SetFlags(), WriteMsg()
 
-     */
 
-     wxSocketBase& ReadMsg(void* buffer, wxUint32 nbytes);
 
-     /**
 
-         Use SetFlags to customize IO operation for this socket.
 
-         The @a flags parameter may be a combination of flags ORed together.
 
-         Notice that not all combinations of flags affecting the IO calls
 
-         (Read() and Write()) make sense, e.g. @b wxSOCKET_NOWAIT can't be
 
-         combined with @b wxSOCKET_WAITALL nor with @b wxSOCKET_BLOCK.
 
-         The following flags can be used:
 
-         @beginFlagTable
 
-         @flag{wxSOCKET_NONE}
 
-             Default mode: the socket will read some data in the IO calls and
 
-             will process events to avoid blocking UI while waiting for the data
 
-             to become available.
 
-         @flag{wxSOCKET_NOWAIT}
 
-             Don't wait for the socket to become ready in IO calls, read as much
 
-             data as is available -- potentially 0 bytes -- and return
 
-             immediately.
 
-         @flag{wxSOCKET_WAITALL}
 
-             Don't return before the entire amount of data specified in IO calls
 
-             is read or written unless an error occurs. If this flag is not
 
-             specified, the IO calls return as soon as any amount of data, even
 
-             less than the total number of bytes, is processed.
 
-         @flag{wxSOCKET_BLOCK}
 
-             Don't process the UI events while waiting for the socket to become
 
-             ready. This means that UI will be unresponsive during socket IO.
 
-         @flag{wxSOCKET_REUSEADDR}
 
-             Allows the use of an in-use port (wxServerSocket only).
 
-         @flag{wxSOCKET_BROADCAST}
 
-             Switches the socket to broadcast mode.
 
-         @flag{wxSOCKET_NOBIND}
 
-             Stops the socket from being bound to a specific adapter (normally
 
-             used in conjunction with @b wxSOCKET_BROADCAST).
 
-         @endFlagTable
 
-         For more information on socket events see @ref wxSocketFlags .
 
-     */
 
-     void SetFlags(wxSocketFlags flags);
 
-     /**
 
-         Set the local address and port to use.
 
-         This function must always be called for the server sockets but may also
 
-         be called for client sockets, if it is, @b bind() is called before @b
 
-         connect().
 
-     */
 
-     virtual bool SetLocal(const wxIPV4address& local);
 
-     /**
 
-         Set the default socket timeout in seconds.
 
-         This timeout applies to all IO calls, and also to the Wait() family of
 
-         functions if you don't specify a wait interval. Initially, the default
 
-         timeout is 10 minutes.
 
-     */
 
-     void SetTimeout(long seconds);
 
-     /**
 
-         Put the specified data into the input queue.
 
-         The data in the buffer will be returned by the next call to Read().
 
-         This function is not affected by wxSocket flags.
 
-         If you use LastCount(), it will always return @a nbytes.
 
-         If you use Error(), it will always return @false.
 
-         @param buffer
 
-             Buffer to be unread.
 
-         @param nbytes
 
-             Number of bytes.
 
-         @return Returns a reference to the current object.
 
-         @see Error(), LastCount(), LastError()
 
-     */
 
-     wxSocketBase& Unread(const void* buffer, wxUint32 nbytes);
 
-     /**
 
-         Wait for any socket event.
 
-         Possible socket events are:
 
-         @li The socket becomes readable.
 
-         @li The socket becomes writable.
 
-         @li An ongoing connection request has completed (wxSocketClient only)
 
-         @li An incoming connection request has arrived (wxSocketServer only)
 
-         @li The connection has been closed.
 
-         Note that it is recommended to use the individual @b WaitForXXX()
 
-         functions to wait for the required condition, instead of this one.
 
-         @param seconds
 
-             Number of seconds to wait.
 
-             If -1, it will wait for the default timeout,
 
-             as set with SetTimeout().
 
-         @param millisecond
 
-             Number of milliseconds to wait.
 
-         @return
 
-            @true when any of the above conditions is satisfied or @false if the
 
-            timeout was reached.
 
-         @see InterruptWait(), wxSocketServer::WaitForAccept(),
 
-              WaitForLost(), WaitForRead(),
 
-              WaitForWrite(), wxSocketClient::WaitOnConnect()
 
-     */
 
-     bool Wait(long seconds = -1, long millisecond = 0);
 
-     /**
 
-         Wait until the connection is lost.
 
-         This may happen if the peer gracefully closes the connection or if the
 
-         connection breaks.
 
-         @param seconds
 
-             Number of seconds to wait.
 
-             If -1, it will wait for the default timeout,
 
-             as set with SetTimeout().
 
-         @param millisecond
 
-             Number of milliseconds to wait.
 
-         @return Returns @true if the connection was lost, @false if the timeout
 
-                 was reached.
 
-         @see InterruptWait(), Wait()
 
-     */
 
-     bool WaitForLost(long seconds = -1, long millisecond = 0);
 
-     /**
 
-         Wait until the socket is readable.
 
-         This might mean that queued data is available for reading or, for streamed
 
-         sockets, that the connection has been closed, so that a read operation will
 
-         complete immediately without blocking (unless the @b wxSOCKET_WAITALL flag
 
-         is set, in which case the operation might still block).
 
-         Notice that this function should not be called if there is already data
 
-         available for reading on the socket.
 
-         @param seconds
 
-             Number of seconds to wait.
 
-             If -1, it will wait for the default timeout,
 
-             as set with SetTimeout().
 
-         @param millisecond
 
-             Number of milliseconds to wait.
 
-         @return Returns @true if the socket becomes readable, @false on timeout.
 
-         @see InterruptWait(), Wait()
 
-     */
 
-     bool WaitForRead(long seconds = -1, long millisecond = 0);
 
-     /**
 
-         Wait until the socket becomes writable.
 
-         This might mean that the socket is ready to send new data, or for streamed
 
-         sockets, that the connection has been closed, so that a write operation is
 
-         guaranteed to complete immediately (unless the @b wxSOCKET_WAITALL flag is set,
 
-         in which case the operation might still block).
 
-         Notice that this function should not be called if the socket is already
 
-         writable.
 
-         @param seconds
 
-             Number of seconds to wait.
 
-             If -1, it will wait for the default timeout,
 
-             as set with SetTimeout().
 
-         @param millisecond
 
-             Number of milliseconds to wait.
 
-         @return Returns @true if the socket becomes writable, @false on timeout.
 
-         @see InterruptWait(), Wait()
 
-     */
 
-     bool WaitForWrite(long seconds = -1, long millisecond = 0);
 
-     /**
 
-         Write up to the given number of bytes to the socket.
 
-         Use LastWriteCount() to verify the number of bytes actually written.
 
-         Use Error() to determine if the operation succeeded.
 
-         @param buffer
 
-             Buffer with the data to be sent.
 
-         @param nbytes
 
-             Number of bytes.
 
-         @return Returns a reference to the current object.
 
-         @remarks
 
-         The exact behaviour of Write() depends on the combination of flags being used.
 
-         For a detailed explanation, see SetFlags().
 
-         @see Error(), LastError(), LastWriteCount(), SetFlags()
 
-     */
 
-     wxSocketBase& Write(const void* buffer, wxUint32 nbytes);
 
-     /**
 
-         Sends a buffer which can be read using ReadMsg().
 
-         WriteMsg() sends a short header before the data so that ReadMsg()
 
-         knows how much data should be actually read.
 
-         This function always waits for the entire buffer to be sent, unless an
 
-         error occurs.
 
-         Use LastWriteCount() to verify the number of bytes actually written.
 
-         Use Error() to determine if the operation succeeded.
 
-         @param buffer
 
-             Buffer with the data to be sent.
 
-         @param nbytes
 
-             Number of bytes to send.
 
-         @return Returns a reference to the current object.
 
-         @remarks
 
-         WriteMsg() will behave as if the @b wxSOCKET_WAITALL flag was always set and
 
-         it will always ignore the @b wxSOCKET_NOWAIT flag. The exact behaviour of
 
-         WriteMsg() depends on the @b wxSOCKET_BLOCK flag. For a detailed explanation,
 
-         see SetFlags().
 
-         For thread safety, in case ReadMsg() and WriteMsg() are called in
 
-         different threads, it is a good idea to call
 
-         @code SetFlags(wxSOCKET_WAITALL|wx_SOCKET_BLOCK) @endcode before the
 
-         first calls to ReadMsg() and WriteMsg() in different threads, as each
 
-         of these functions calls SetFlags() which performs read/modify/write.
 
-         By setting these flags before the multi-threading, it will ensure that
 
-         they don't get reset by thread race conditions.
 
-         @see  Error(), LastError(), LastWriteCount(), SetFlags(), ReadMsg()
 
-     */
 
-     wxSocketBase& WriteMsg(const void* buffer, wxUint32 nbytes);
 
-     //@}
 
-     /**
 
-         @name Handling Socket Events
 
-     */
 
-     //@{
 
-     /**
 
-         Returns a pointer of the client data for this socket, as set with
 
-         SetClientData()
 
-     */
 
-     void* GetClientData() const;
 
-     /**
 
-         According to the @a notify value, this function enables
 
-         or disables socket events. If @a notify is @true, the events
 
-         configured with SetNotify() will
 
-         be sent to the application. If @a notify is @false; no events
 
-         will be sent.
 
-     */
 
-     void Notify(bool notify);
 
-     /**
 
-         Sets user-supplied client data for this socket. All socket events will
 
-         contain a pointer to this data, which can be retrieved with
 
-         the wxSocketEvent::GetClientData() function.
 
-     */
 
-     void SetClientData(void* data);
 
-     /**
 
-         Sets an event handler to be called when a socket event occurs. The
 
-         handler will be called for those events for which notification is
 
-         enabled with SetNotify() and
 
-         Notify().
 
-         @param handler
 
-             Specifies the event handler you want to use.
 
-         @param id
 
-             The id of socket event.
 
-         @see SetNotify(), Notify(), wxSocketEvent, wxEvtHandler
 
-     */
 
-     void SetEventHandler(wxEvtHandler& handler, int id = -1);
 
-     /**
 
-         Specifies which socket events are to be sent to the event handler.
 
-         The @a flags parameter may be combination of flags ORed together. The
 
-         following flags can be used:
 
-         @beginFlagTable
 
-         @flag{wxSOCKET_INPUT_FLAG} to receive @b wxSOCKET_INPUT.
 
-         @flag{wxSOCKET_OUTPUT_FLAG} to receive @b wxSOCKET_OUTPUT.
 
-         @flag{wxSOCKET_CONNECTION_FLAG} to receive @b wxSOCKET_CONNECTION.
 
-         @flag{wxSOCKET_LOST_FLAG} to receive @b wxSOCKET_LOST.
 
-         @endFlagTable
 
-         For example:
 
-         @code
 
-         sock.SetNotify(wxSOCKET_INPUT_FLAG | wxSOCKET_LOST_FLAG);
 
-         sock.Notify(true);
 
-         @endcode
 
-         In this example, the user will be notified about incoming socket data and
 
-         whenever the connection is closed.
 
-         For more information on socket events see @ref wxSocketEventFlags .
 
-     */
 
-     void SetNotify(wxSocketEventFlags flags);
 
-     /**
 
-         Returns the native socket descriptor.
 
-         This is intended to use with rarely used specific platform features
 
-         that can only be accessed via the actual socket descriptor.
 
-         Do not use this for reading or writing data from or to the socket as
 
-         this would almost surely interfere with wxSocket code logic and result
 
-         in unexpected behaviour.
 
-         The socket must be successfully initialized, e.g. connected for client
 
-         sockets, before this method can be called.
 
-         @return Returns the native socket descriptor.
 
-         @since 2.9.5
 
-     */
 
-     wxSOCKET_T GetSocket() const;
 
-     //@}
 
- };
 
- /**
 
-     @class wxDatagramSocket
 
-     @todo docme
 
-     @library{wxnet}
 
-     @category{net}
 
- */
 
- class wxDatagramSocket : public wxSocketBase
 
- {
 
- public:
 
-     /**
 
-         Constructor.
 
-         @param addr
 
-             The socket address.
 
-         @param flags
 
-             Socket flags (See wxSocketBase::SetFlags()).
 
-     */
 
-     wxDatagramSocket(const wxSockAddress& addr,
 
-                      wxSocketFlags flags = wxSOCKET_NONE);
 
-     /**
 
-         Destructor. Please see wxSocketBase::Destroy().
 
-     */
 
-     virtual ~wxDatagramSocket();
 
-     /**
 
-         Write a buffer of @a nbytes bytes to the socket.
 
-         Use wxSocketBase::LastWriteCount() to verify the number of bytes actually wrote.
 
-         Use wxSocketBase::Error() to determine if the operation succeeded.
 
-         @param address
 
-             The address of the destination peer for this data.
 
-         @param buffer
 
-             Buffer where read data is.
 
-         @param nbytes
 
-             Number of bytes.
 
-         @return Returns a reference to the current object.
 
-         @see wxSocketBase::LastError(), wxSocketBase::SetFlags()
 
-     */
 
-     wxDatagramSocket& SendTo(const wxSockAddress& address,
 
-                              const void* buffer, wxUint32 nbytes);
 
- };
 
 
  |