%% Modified by:
%% Created: 1999
%% RCS-ID: $Id$
-%% Copyright: (c) wxWindows team
+%% Copyright: (c) wxWidgets team
%% License: wxWindows license
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
wxSocketBase is the base class for all socket-related objects, and it
defines all basic IO functionality.
+Note: (Workaround for implementation limitation for wxWidgets up to 2.5.x)
+If you want to use sockets or derived classes such as wxFTP in a secondary thread,
+call wxSocketBase::Initialize() (undocumented) from the main thread before creating
+any sockets - in wxApp::OnInit for example.
+See http://wiki.wxwidgets.org/wiki.pl?WxSocket or
+http://www.litwindow.com/knowhow/knowhow.html for more details.
+
\wxheading{Derived from}
\helpref{wxObject}{wxobject}
<wx/socket.h>
+\wxheading{Library}
+
+\helpref{wxNet}{librarieslist}
+
\wxheading{wxSocket errors}
\twocolwidtha{7cm}
{\bf wxSOCKET\_OUTPUT} event.
The {\bf wxSOCKET\_CONNECTION} event is issued when a delayed connection
-request completes succesfully (client) or when a new connection arrives
+request completes successfully (client) or when a new connection arrives
at the incoming queue (server).
The {\bf wxSOCKET\_LOST} event is issued when a close indication is
\latexignore{\rtfignore{\wxheading{Function groups}}}
-\membersection{Construction and destruction}
+\membersection{Construction and destruction}\label{socketconstruction}
\helpref{wxSocketBase}{wxsocketbaseconstruct}\\
\helpref{\destruct{wxSocketBase}}{wxsocketbasedestruct}\\
\helpref{Destroy}{wxsocketbasedestroy}
-\membersection{Socket state}
+\membersection{Socket state}\label{socketstate}
Functions to retrieve current state and miscellaneous info.
\helpref{IsDisconnected}{wxsocketbaseisdisconnected}\\
\helpref{LastCount}{wxsocketbaselastcount}\\
\helpref{LastError}{wxsocketbaselasterror}\\
-\helpref{Ok}{wxsocketbaseok}\\
+\helpref{IsOk}{wxsocketbaseisok}\\
\helpref{SaveState}{wxsocketbasesavestate}\\
\helpref{RestoreState}{wxsocketbaserestorestate}
-\membersection{Basic IO}
+\membersection{Basic IO}\label{socketbasicio}
Functions that perform basic IO functionality.
\helpref{GetFlags}{wxsocketbasegetflags}\\
\helpref{SetFlags}{wxsocketbasesetflags}\\
-\helpref{SetTimeout}{wxsocketbasesettimeout}
+\helpref{SetTimeout}{wxsocketbasesettimeout}\\
+\helpref{SetLocal}{wxsocketbasesetlocal}\\
-\membersection{Handling socket events}
+\membersection{Handling socket events}\label{socketevents}
Functions that allow applications to receive socket events.
\helpref{SetClientData}{wxsocketbasesetclientdata}\\
\helpref{SetEventHandler}{wxsocketbaseseteventhandler}
-Callback functions are also available, but they are provided for backwards
-compatibility only. Their use is strongly discouraged in favour of events,
-and should be considered deprecated. Callbacks may be unsupported in future
-releases of wxWindows.
-
-\helpref{Callback}{wxsocketbasecallback}\\
-\helpref{CallbackData}{wxsocketbasecallbackdata}
-
% ---------------------------------------------------------------------------
% Members here
use \helpref{Destroy}{wxsocketbasedestroy} instead. Also, do not create
socket objects in the stack.
-%
-% Callback
-%
-\membersection{wxSocketBase::Callback}\label{wxsocketbasecallback}
-
-\func{wxSocketBase::wxSockCbk}{Callback}{\param{wxSocketBase::wxSockCbk}{ callback}}
-
-You can setup a callback function to be called when an event occurs.
-The function will be called only for those events for which notification
-has been enabled with \helpref{Notify}{wxsocketbasenotify} and
-\helpref{SetNotify}{wxsocketbasesetnotify}. The prototype of the
-callback must be as follows:
-
-\begin{verbatim}
-void SocketCallback(wxSocketBase& sock, wxSocketNotify evt, char *cdata);
-\end{verbatim}
-
-The first parameter is a reference to the socket object in which the
-event occurred. The second parameter tells you which event occurred.
-(See \helpref{wxSocket events}{wxsocketbase}). The third parameter
-is the user data you specified using \helpref{CallbackData}{wxsocketbasecallbackdata}.
-
-\wxheading{Return value}
-
-A pointer to the previous callback.
-
-\wxheading{Remark/Warning}
-
-Note that callbacks are now deprecated and unsupported, and they remain
-for backwards compatibility only. Use events instead.
-
-\wxheading{See also}
-
-\helpref{wxSocketBase::CallbackData}{wxsocketbasecallbackdata},
-\helpref{wxSocketBase::SetNotify}{wxsocketbasesetnotify},
-\helpref{wxSocketBase::Notify}{wxsocketbasenotify}
-
-%
-% CallbackData
-%
-\membersection{wxSocketBase::CallbackData}\label{wxsocketbasecallbackdata}
-
-\func{char *}{CallbackData}{\param{char *}{cdata}}
-
-This function sets the the user data which will be passed to a
-callback function set via \helpref{Callback}{wxsocketbasecallback}.
-
-\wxheading{Return value}
-
-A pointer to the previous user data.
-
-\wxheading{Remark/Warning}
-
-Note that callbacks are now deprecated and unsupported, and they remain
-for backwards compatibility only. Use events instead.
-
-\wxheading{See also}
-
-\helpref{wxSocketBase::Callback}{wxsocketbasecallback},
-\helpref{wxSocketBase::SetNotify}{wxsocketbasesetnotify},
-\helpref{wxSocketBase::Notify}{wxsocketbasenotify}
%
% Close
\wxheading{Return value}
-Always TRUE.
+Always true.
%
% Discard
Use \helpref{LastCount}{wxsocketbaselastcount} to verify the number of bytes actually discarded.
-If you use \helpref{Error}{wxsocketbaseerror}, it will always return FALSE.
+If you use \helpref{Error}{wxsocketbaseerror}, it will always return false.
%
% Error
\constfunc{bool}{Error}{\void}
-Returns TRUE if an error occurred in the last IO operation.
+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.
\wxheading{Return value}
-TRUE if no error happened, FALSE otherwise.
+true if no error happened, false otherwise.
%
% GetFlags
\wxheading{Return value}
-TRUE if no error happened, FALSE otherwise.
+true if no error happened, false otherwise.
%
% InterruptWait
\constfunc{bool}{IsConnected}{\void}
-Returns TRUE if the socket is connected.
+Returns true if the socket is connected.
%
% IsData
%
\constfunc{bool}{IsDisconnected}{\void}
-Returns TRUE if the socket is not connected.
+Returns true if the socket is not connected.
\membersection{wxSocketBase::LastCount}\label{wxsocketbaselastcount}
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 \helpref{Error}{wxsocketbaseerror} first, in order to determine
-if the last IO call failed. If this returns TRUE, use LastError
+if the last IO call failed. If this returns true, use LastError
to discover the cause of the error.
%
\func{void}{Notify}{\param{bool}{ notify}}
According to the {\it notify} value, this function enables
-or disables socket events. If {\it notify} is TRUE, the events
+or disables socket events. If {\it notify} is true, the events
configured with \helpref{SetNotify}{wxsocketbasesetnotify} will
-be sent to the application. If {\it notify} is FALSE; no events
+be sent to the application. If {\it notify} is false; no events
will be sent.
%
-% Ok
+% IsOk
%
-\membersection{wxSocketBase::Ok}\label{wxsocketbaseok}
+\membersection{wxSocketBase::IsOk}\label{wxsocketbaseisok}
-\constfunc{bool}{Ok}{\void}
+\constfunc{bool}{IsOk}{\void}
-Returns TRUE if the socket is initialized and ready and FALSE in other
+Returns true if the socket is initialized and ready and false in other
cases.
\wxheading{Remark/Warning}
-For \helpref{wxSocketClient}{wxsocketclient}, Ok won't return TRUE unless
+For \helpref{wxSocketClient}{wxsocketclient}, Ok won't return true unless
the client is connected to a server.
-For \helpref{wxSocketServer}{wxsocketserver}, Ok will return TRUE if the
+For \helpref{wxSocketServer}{wxsocketserver}, Ok will return true if the
server could bind to the specified address and is already listening for
new connections.
state includes flags, as set with \helpref{SetFlags}{wxsocketbasesetflags},
event mask, as set with \helpref{SetNotify}{wxsocketbasesetnotify} and
\helpref{Notify}{wxsocketbasenotify}, user data, as set with
-\helpref{SetClientData}{wxsocketbasesetclientdata}, and asynchronous
-callback settings, as set with \helpref{Callback}{wxsocketbasecallback}
-and \helpref{CallbackData}{wxsocketbasecallbackdata}.
+\helpref{SetClientData}{wxsocketbasesetclientdata}.
Calls to SaveState and RestoreState can be nested.
\func{void}{SetFlags}{\param{wxSocketFlags}{ flags}}
Use SetFlags to customize IO operation for this socket.
-The {\it flags} parameter may be a combination of flags ORed toghether.
+The {\it flags} parameter may be a combination of flags ORed together.
The following flags can be used:
\twocolwidtha{7cm}
\twocolitem{{\bf wxSOCKET\_NOWAIT}}{Read/write as much data as possible and return immediately.}
\twocolitem{{\bf wxSOCKET\_WAITALL}}{Wait for all required data to be read/written unless an error occurs.}
\twocolitem{{\bf wxSOCKET\_BLOCK}}{Block the GUI (do not yield) while reading/writing data.}
+\twocolitem{{\bf wxSOCKET\_REUSEADDR}}{Allows the use of an in-use port (wxServerSocket only)}
+\twocolitem{{\bf wxSOCKET\_BROADCAST}}{Switches the socket to broadcast mode}
+\twocolitem{{\bf wxSOCKET\_NOBIND}}{Stops the socket from being bound to a specific adapter (normally used in conjunction with {\bf wxSOCKET\_BROADCAST})}
\end{twocollist}
A brief overview on how to use these flags follows.
completes. If it is not used, then the application must take extra
care to avoid unwanted reentrance.
+The {\bf wxSOCKET\_REUSEADDR} flag controls the use of the SO\_REUSEADDR standard
+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.
+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 behavior, so check the documentation for
+your platform's implementation of setsockopt(). Note that on BSD-based systems (e.g. Mac OS X),
+use of wxSOCKET\_REUSEADDR implies SO\_REUSEPORT in addition to SO\_REUSEADDR to be consistent
+with Windows.
+
+The {\bf wxSOCKET\_BROADCAST} flag controls the use of the SO\_BROADCAST standard
+setsockopt() flag. This flag allows the socket to use the broadcast address, and is generally
+used in conjunction with {\bf wxSOCKET\_NOBIND} and \helpref{wxIPaddress::BroadcastAddress}{wxipaddressbroadcastaddress}.
+
So:
{\bf wxSOCKET\_NONE} will try to read at least SOME data, no matter how much.
{\bf wxSOCKET\_BLOCK} has nothing to do with the previous flags and
it controls whether the GUI blocks.
+{\bf wxSOCKET\_REUSEADDR} controls special platform-specific behavior for
+reusing local addresses/ports.
+
+%
+% SetLocal
+%
+\membersection{wxSocketBase::SetLocal}\label{wxsocketbasesetlocal}
+
+\func{bool}{SetLocal}{\param{wxIPV4address\&}{ local}}
+
+This function allows you to set the local address and port,
+useful when an application needs to reuse a particular port. When
+a local port is set for a \helpref{wxSocketClient}{wxsocketclient},
+{\bf bind} will be called before {\bf connect}.
+
%
% SetNotify
%
\func{void}{SetNotify}{\param{wxSocketEventFlags}{ flags}}
SetNotify specifies which socket events are to be sent to the event handler.
-The {\it flags} parameter may be combination of flags ORed toghether. The
+The {\it flags} parameter may be combination of flags ORed together. The
following flags can be used:
\twocolwidtha{7cm}
\begin{verbatim}
sock.SetNotify(wxSOCKET_INPUT_FLAG | wxSOCKET_LOST_FLAG);
- sock.Notify(TRUE);
+ sock.Notify(true);
\end{verbatim}
In this example, the user will be notified about incoming socket data and
If you use \helpref{LastCount}{wxsocketbaselastcount}, it will always return {\it nbytes}.
-If you use \helpref{Error}{wxsocketbaseerror}, it will always return FALSE.
+If you use \helpref{Error}{wxsocketbaseerror}, it will always return false.
\wxheading{Parameters}
\func{bool}{Wait}{\param{long}{ seconds = -1}, \param{long}{ millisecond = 0}}
-This function waits until any of the following conditions is TRUE:
+This function waits until any of the following conditions is true:
\begin{itemize}
\item The socket becomes readable.
\wxheading{Return value}
-Returns TRUE when any of the above conditions is satisfied,
-FALSE if the timeout was reached.
+Returns true when any of the above conditions is satisfied,
+false if the timeout was reached.
\wxheading{See also}
\wxheading{Return value}
-Returns TRUE if the connection was lost, FALSE if the timeout was reached.
+Returns true if the connection was lost, false if the timeout was reached.
\wxheading{See also}
\wxheading{Return value}
-Returns TRUE if the socket becomes readable, FALSE on timeout.
+Returns true if the socket becomes readable, false on timeout.
\wxheading{See also}
\wxheading{Return value}
-Returns TRUE if the socket becomes writable, FALSE on timeout.
+Returns true if the socket becomes writable, false on timeout.
\wxheading{See also}
\wxheading{Derived from}
-\helpref{wxSocketBase}{wxsocketbase}
+\helpref{wxSocketBase}{wxsocketbase}\\
+\helpref{wxObject}{wxobject}
\wxheading{Include files}
<wx/socket.h>
+\wxheading{Library}
+
+\helpref{wxNet}{librarieslist}
+
\latexignore{\rtfignore{\wxheading{Members}}}
% ---------------------------------------------------------------------------
%
% wxSocketClient
%
-\membersection{wxSocketClient::wxSocketClient}
+\membersection{wxSocketClient::wxSocketClient}\label{wxsocketclientctor}
-\func{}{wxSocketClient}{\param{wxSocketFlags}{ flags = wxSOCKET_NONE}}
+\func{}{wxSocketClient}{\param{wxSocketFlags}{ flags = wxSOCKET\_NONE}}
Constructor.
%
% ~wxSocketClient
%
-\membersection{wxSocketClient::\destruct{wxSocketClient}}
+\membersection{wxSocketClient::\destruct{wxSocketClient}}\label{wxsocketclientdtor}
\func{}{\destruct{wxSocketClient}}{\void}
%
\membersection{wxSocketClient::Connect}\label{wxsocketclientconnect}
-\func{bool}{Connect}{\param{wxSockAddress\&}{ address}, \param{bool}{ wait = TRUE}}
+\func{bool}{Connect}{\param{wxSockAddress\&}{ address}, \param{bool}{ wait = true}}
+
+\func{bool}{Connect}{\param{wxSockAddress\&}{ address}, \param{wxSockAddress\&}{ local},
+\param{bool}{ wait = true}}
Connects to a server using the specified address.
-If {\it wait} is TRUE, Connect will wait until the connection
+If {\it wait} is true, Connect will wait until the connection
completes. {\bf Warning:} This will block the GUI.
-If {\it wait} is FALSE, Connect will try to establish the connection and
+If {\it 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.
+Connect returns false, the connection request can be completed later.
To detect this, use \helpref{WaitOnConnect}{wxsocketclientwaitonconnect},
or catch {\bf wxSOCKET\_CONNECTION} events (for successful establishment)
and {\bf wxSOCKET\_LOST} events (for connection failure).
\docparam{address}{Address of the server.}
-\docparam{wait}{If TRUE, waits for the connection to complete.}
+\docparam{local}{Bind to the specified local address and port before connecting.
+The local address and port can also be set using \helpref{SetLocal}{wxsocketbasesetlocal},
+and then using the 2-parameter Connect method.}
+
+\docparam{wait}{If true, waits for the connection to complete.}
\wxheading{Return value}
-Returns TRUE if the connection is established and no error occurs.
+Returns true if the connection is established and no error occurs.
-If {\it wait} was TRUE, and Connect returns FALSE, an error occurred
+If {\it wait} was true, and Connect returns false, an error occurred
and the connection failed.
-If {\it wait} was FALSE, and Connect returns FALSE, you should still
+If {\it wait} was false, and Connect returns false, you should still
be prepared to handle the completion of this connection request, either
with \helpref{WaitOnConnect}{wxsocketclientwaitonconnect} or by
watching {\bf wxSOCKET\_CONNECTION} and {\bf wxSOCKET\_LOST} events.
Wait until a connection request completes, or until the specified timeout
elapses. Use this function after issuing a call
-to \helpref{Connect}{wxsocketclientconnect} with {\it wait} set to FALSE.
+to \helpref{Connect}{wxsocketclientconnect} with {\it wait} set to false.
\wxheading{Parameters}
\wxheading{Return value}
-WaitOnConnect returns TRUE if the connection request completes. This
-does not necessarily mean that the connection was succesfully established;
+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
\helpref{IsConnected}{wxsocketbaseisconnected} to distinguish between
these two situations.
-If the timeout elapses, WaitOnConnect returns FALSE.
+If the timeout elapses, WaitOnConnect returns false.
These semantics allow code like this:
\begin{verbatim}
// Issue the connection request
-client->Connect(addr, FALSE);
+client->Connect(addr, false);
// Wait until the request completes or until we decide to give up
-bool waitmore = TRUE;
+bool waitmore = true;
while ( !client->WaitOnConnect(seconds, millis) && waitmore )
{
// possibly give some feedback to the user,
\wxheading{Derived from}
-\helpref{wxEvent}{wxevent}
+\helpref{wxEvent}{wxevent}\\
+\helpref{wxObject}{wxobject}
\wxheading{Include files}
<wx/socket.h>
+\wxheading{Library}
+
+\helpref{wxNet}{librarieslist}
+
\wxheading{Event table macros}
To process a socket event, use these event handler macros to direct input
\latexignore{\rtfignore{\wxheading{Members}}}
-\membersection{wxSocketEvent::wxSocketEvent}
+\membersection{wxSocketEvent::wxSocketEvent}\label{wxsocketeventctor}
\func{}{wxSocketEvent}{\param{int}{ id = 0}}
Returns the socket event type.
-% ---------------------------------------------------------------------------
-% CLASS: wxSocketServer
-% ---------------------------------------------------------------------------
-\section{\class{wxSocketServer}}\label{wxsocketserver}
-
-\wxheading{Derived from}
-
-\helpref{wxSocketBase}{wxsocketbase}
-
-\wxheading{Include files}
-
-<wx/socket.h>
-
-% ---------------------------------------------------------------------------
-% Members
-% ---------------------------------------------------------------------------
-\latexignore{\rtfignore{\wxheading{Members}}}
-
-%
-% wxSocketServer
-%
-\membersection{wxSocketServer::wxSocketServer}\label{wxsocketserverconstr}
-
-\func{}{wxSocketServer}{\param{wxSockAddress\&}{ address}, \param{wxSocketFlags}{ flags = wxSOCKET_NONE}}
-
-Constructs a new server and tries to bind to the specified {\it address}.
-Before trying to accept new connections, test whether it succeeded with
-\helpref{wxSocketBase::Ok}{wxsocketbaseok}.
-
-\wxheading{Parameters}
-
-\docparam{address}{Specifies the local address for the server (e.g. port number).}
-
-\docparam{flags}{Socket flags (See \helpref{wxSocketBase::SetFlags}{wxsocketbasesetflags})}
-
-%
-% ~wxSocketServer
-%
-\membersection{wxSocketServer::\destruct{wxSocketServer}}
-
-\func{}{\destruct{wxSocketServer}}{\void}
-
-Destructor (it doesn't close the accepted connections).
-
-%
-% Accept
-%
-\membersection{wxSocketServer::Accept}\label{wxsocketserveraccept}
-
-\func{wxSocketBase *}{Accept}{\param{bool}{ wait = TRUE}}
-
-Accepts an incoming connection request, and creates a new
-\helpref{wxSocketBase}{wxsocketbase} object which represents
-the server-side of the connection.
-
-If {\it wait} is TRUE and there are no pending connections to be
-accepted, it will wait for the next incoming connection to
-arrive. {\bf Warning:} This will block the GUI.
-
-If {\it 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 \helpref{WaitForAccept}{wxsocketserverwaitforaccept}
-or catch {\bf wxSOCKET\_CONNECTION} events, then call Accept once you know
-that there is an incoming connection waiting to be accepted.
-
-\wxheading{Return value}
-
-Returns an opened socket connection, or NULL if an error occurred or
-if the {\it wait} parameter was FALSE and there were no pending
-connections.
-
-\wxheading{See also}
-
-\helpref{wxSocketServer::WaitForAccept}{wxsocketserverwaitforaccept},
-\helpref{wxSocketBase::SetNotify}{wxsocketbasesetnotify},
-\helpref{wxSocketBase::Notify}{wxsocketbasenotify},
-\helpref{wxSocketServer::AcceptWith}{wxsocketserveracceptwith}
-
-%
-% AcceptWith
-%
-\membersection{wxSocketServer::AcceptWith}\label{wxsocketserveracceptwith}
-
-\func{bool}{AcceptWith}{\param{wxSocketBase\&}{ socket}, \param{bool}{ wait = TRUE}}
-
-Accept an incoming connection using the specified socket object.
-
-\wxheading{Parameters}
-
-\docparam{socket}{Socket to be initialized}
-
-\wxheading{Return value}
-
-Returns TRUE on success, or FALSE if an error occurred or if the
-{\it wait} parameter was FALSE and there were no pending
-connections.
-
-\helpref{wxSocketServer::WaitForAccept}{wxsocketserverwaitforaccept},
-\helpref{wxSocketBase::SetNotify}{wxsocketbasesetnotify},
-\helpref{wxSocketBase::Notify}{wxsocketbasenotify},
-\helpref{wxSocketServer::Accept}{wxsocketserveraccept}
-
-%
-% WaitForAccept
-%
-\membersection{wxSocketServer::WaitForAccept}\label{wxsocketserverwaitforaccept}
-
-\func{bool}{WaitForAccept}{\param{long}{ seconds = -1}, \param{long}{ millisecond = 0}}
-
-This function waits for an incoming connection. Use it if you want to call
-\helpref{Accept}{wxsocketserveraccept} or \helpref{AcceptWith}{wxsocketserveracceptwith}
-with {\it wait} set to FALSE, to detect when an incoming connection is waiting
-to be accepted.
-
-\wxheading{Parameters}
-
-\docparam{seconds}{Number of seconds to wait.
-If -1, it will wait for the default timeout,
-as set with \helpref{SetTimeout}{wxsocketbasesettimeout}.}
-
-\docparam{millisecond}{Number of milliseconds to wait.}
-
-\wxheading{Return value}
-
-Returns TRUE if an incoming connection arrived, FALSE if the timeout elapsed.
-
-\wxheading{See also}
-
-\helpref{wxSocketServer::Accept}{wxsocketserveraccept},
-\helpref{wxSocketServer::AcceptWith}{wxsocketserveracceptwith},
-\helpref{wxSocketBase::InterruptWait}{wxsocketbaseinterruptwait}
-