1 /* -------------------------------------------------------------------------
2 * Project: GSocket (Generic Socket)
4 * Author: Guilhem Lavaux
5 * Guillermo Rodriguez Garcia <guille@iies.es>
6 * Copyright: (c) Guilhem Lavaux
7 * (c) 2007,2008 Vadim Zeitlin <vadim@wxwidgets.org>
8 * Licence: wxWindows Licence
9 * Purpose: GSocket include file (system independent)
11 * -------------------------------------------------------------------------
14 #ifndef _WX_GSOCKET_H_
15 #define _WX_GSOCKET_H_
21 #include "wx/dlimpexp.h" /* for WXDLLIMPEXP_NET */
23 class WXDLLIMPEXP_FWD_NET wxSocketBase
;
28 Including sys/types.h under Cygwin results in the warnings about "fd_set
29 having been defined in sys/types.h" when winsock.h is included later and
30 doesn't seem to be necessary anyhow. It's not needed under Mac neither.
32 #if !defined(__WXMAC__) && !defined(__CYGWIN__) && !defined(__WXWINCE__)
33 #include <sys/types.h>
69 /* See below for an explanation on how events work.
82 GSOCK_INPUT_FLAG
= 1 << GSOCK_INPUT
,
83 GSOCK_OUTPUT_FLAG
= 1 << GSOCK_OUTPUT
,
84 GSOCK_CONNECTION_FLAG
= 1 << GSOCK_CONNECTION
,
85 GSOCK_LOST_FLAG
= 1 << GSOCK_LOST
88 typedef int GSocketEventFlags
;
93 typedef void (*GSocketCallback
)(GSocket
*socket
, GSocketEvent event
,
97 Class providing hooks abstracting the differences between console and GUI
98 applications for socket code.
100 We also have different implementations of this class for different platforms
101 allowing us to keep more things in the common code but the main reason for
102 its existence is that we want the same socket code work differently
103 depending on whether it's used from a console or a GUI program. This is
104 achieved by implementing the virtual methods of this class differently in
105 the objects returned by wxConsoleAppTraits::GetSocketFunctionsTable() and
106 the same method in wxGUIAppTraits.
111 // set the manager to use, we don't take ownership of it
113 // this should be called before GSocket_Init(), i.e. before the first
114 // wxSocket object is created, otherwise the manager returned by
115 // wxAppTraits::GetSocketManager() will be used
116 static void Set(GSocketManager
*manager
);
118 // return the manager to use
120 // this initializes the manager at first use
121 static GSocketManager
*Get()
129 // called before the first wxSocket is created and should do the
130 // initializations needed in order to use the network
132 // return true if initialized successfully
133 virtual bool OnInit() = 0;
135 // undo the initializations of OnInit()
136 virtual void OnExit() = 0;
139 // do manager-specific socket initializations (and undo it): this is called
140 // in the beginning/end of the socket initialization/destruction
141 virtual bool Init_Socket(GSocket
*socket
) = 0;
142 virtual void Destroy_Socket(GSocket
*socket
) = 0;
144 virtual void Install_Callback(GSocket
*socket
, GSocketEvent event
) = 0;
145 virtual void Uninstall_Callback(GSocket
*socket
, GSocketEvent event
) = 0;
147 virtual void Enable_Events(GSocket
*socket
) = 0;
148 virtual void Disable_Events(GSocket
*socket
) = 0;
150 virtual ~GSocketManager() { }
153 // get the manager to use if we don't have it yet
156 static GSocketManager
*ms_manager
;
160 Base class providing functionality common to BSD and Winsock sockets.
162 TODO: merge this in wxSocket itself, there is no reason to maintain the
163 separation between wxSocket and GSocket.
168 // static factory function: creates the low-level socket associated with
169 // the given wxSocket (and inherits its attributes such as timeout)
170 static GSocket
*Create(wxSocketBase
& wxsocket
);
172 void SetTimeout(unsigned long millisec
);
173 virtual ~GSocketBase();
175 GSocketEventFlags
Select(GSocketEventFlags flags
);
177 virtual GSocket
*WaitConnection(wxSocketBase
& wxsocket
) = 0;
179 virtual void Close() = 0;
180 virtual void Shutdown();
182 void SetInitialSocketBuffers(int recv
, int send
)
184 m_initialRecvBufferSize
= recv
;
185 m_initialSendBufferSize
= send
;
188 // notify m_wxsocket about the given socket event by calling its (inaptly
189 // named) OnRequest() method
190 void NotifyOnStateChange(GSocketEvent event
);
192 // this is officially SOCKET (unsigned int) under Windows but we don't want
193 // to include winsock.h which defines SOCKET from here so just use int
194 // under all platforms
197 int m_initialRecvBufferSize
;
198 int m_initialSendBufferSize
;
202 GSocketError m_error
;
213 struct timeval m_timeout
;
215 unsigned long m_timeout
;
218 GSocketEventFlags m_detected
;
221 GSocketBase(wxSocketBase
& wxsocket
);
224 // set in ctor and never changed except that it's reset to NULL when the
225 // socket is shut down
226 wxSocketBase
*m_wxsocket
;
228 DECLARE_NO_COPY_CLASS(GSocketBase
)
231 #if defined(__WINDOWS__)
232 #include "wx/msw/gsockmsw.h"
234 #include "wx/unix/gsockunx.h"
237 /* Global initializers */
239 /* GSocket_Init() must be called at the beginning (but after calling
240 * GSocketManager::Set() if a custom manager should be used) */
243 /* GSocket_Cleanup() must be called at the end */
244 void GSocket_Cleanup();
249 // Represents a socket endpoint, i.e. -- in spite of its name -- not an address
250 // but an (address, port) pair
253 struct sockaddr
*m_addr
;
256 GAddressType m_family
;
259 GSocketError m_error
;
262 GAddress
*GAddress_new();
263 GAddress
*GAddress_copy(GAddress
*address
);
264 void GAddress_destroy(GAddress
*address
);
266 void GAddress_SetFamily(GAddress
*address
, GAddressType type
);
267 GAddressType
GAddress_GetFamily(GAddress
*address
);
269 /* The use of any of the next functions will set the address family to
270 * the specific one. For example if you use GAddress_INET_SetHostName,
271 * address family will be implicitly set to AF_INET.
274 GSocketError
GAddress_INET_SetHostName(GAddress
*address
, const char *hostname
);
275 GSocketError
GAddress_INET_SetBroadcastAddress(GAddress
*address
);
276 GSocketError
GAddress_INET_SetAnyAddress(GAddress
*address
);
277 GSocketError
GAddress_INET_SetHostAddress(GAddress
*address
,
278 unsigned long hostaddr
);
279 GSocketError
GAddress_INET_SetPortName(GAddress
*address
, const char *port
,
280 const char *protocol
);
281 GSocketError
GAddress_INET_SetPort(GAddress
*address
, unsigned short port
);
283 GSocketError
GAddress_INET_GetHostName(GAddress
*address
, char *hostname
,
285 unsigned long GAddress_INET_GetHostAddress(GAddress
*address
);
286 unsigned short GAddress_INET_GetPort(GAddress
*address
);
288 GSocketError
_GAddress_translate_from(GAddress
*address
,
289 struct sockaddr
*addr
, int len
);
290 GSocketError
_GAddress_translate_to (GAddress
*address
,
291 struct sockaddr
**addr
, int *len
);
292 GSocketError
_GAddress_Init_INET(GAddress
*address
);
296 GSocketError
GAddress_INET6_SetHostName(GAddress
*address
, const char *hostname
);
297 GSocketError
GAddress_INET6_SetAnyAddress(GAddress
*address
);
298 GSocketError
GAddress_INET6_SetHostAddress(GAddress
*address
,
299 struct in6_addr hostaddr
);
300 GSocketError
GAddress_INET6_SetPortName(GAddress
*address
, const char *port
,
301 const char *protocol
);
302 GSocketError
GAddress_INET6_SetPort(GAddress
*address
, unsigned short port
);
304 GSocketError
GAddress_INET6_GetHostName(GAddress
*address
, char *hostname
,
306 GSocketError
GAddress_INET6_GetHostAddress(GAddress
*address
,struct in6_addr
*hostaddr
);
307 unsigned short GAddress_INET6_GetPort(GAddress
*address
);
311 // these functions are available under all platforms but only implemented under
312 // Unix ones, elsewhere they just return GSOCK_INVADDR
313 GSocketError
_GAddress_Init_UNIX(GAddress
*address
);
314 GSocketError
GAddress_UNIX_SetPath(GAddress
*address
, const char *path
);
315 GSocketError
GAddress_UNIX_GetPath(GAddress
*address
, char *path
, size_t sbuf
);
317 #endif /* wxUSE_SOCKETS */
319 #endif /* _WX_GSOCKET_H_ */