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>
40 #include <time.h> // for timeval
71 /* See below for an explanation on how events work.
84 GSOCK_INPUT_FLAG
= 1 << GSOCK_INPUT
,
85 GSOCK_OUTPUT_FLAG
= 1 << GSOCK_OUTPUT
,
86 GSOCK_CONNECTION_FLAG
= 1 << GSOCK_CONNECTION
,
87 GSOCK_LOST_FLAG
= 1 << GSOCK_LOST
90 typedef int GSocketEventFlags
;
95 typedef void (*GSocketCallback
)(GSocket
*socket
, GSocketEvent event
,
99 Class providing hooks abstracting the differences between console and GUI
100 applications for socket code.
102 We also have different implementations of this class for different platforms
103 allowing us to keep more things in the common code but the main reason for
104 its existence is that we want the same socket code work differently
105 depending on whether it's used from a console or a GUI program. This is
106 achieved by implementing the virtual methods of this class differently in
107 the objects returned by wxConsoleAppTraits::GetSocketFunctionsTable() and
108 the same method in wxGUIAppTraits.
113 // set the manager to use, we don't take ownership of it
115 // this should be called before GSocket_Init(), i.e. before the first
116 // wxSocket object is created, otherwise the manager returned by
117 // wxAppTraits::GetSocketManager() will be used
118 static void Set(GSocketManager
*manager
);
120 // return the manager to use
122 // this initializes the manager at first use
123 static GSocketManager
*Get()
131 // called before the first wxSocket is created and should do the
132 // initializations needed in order to use the network
134 // return true if initialized successfully
135 virtual bool OnInit() = 0;
137 // undo the initializations of OnInit()
138 virtual void OnExit() = 0;
141 // do manager-specific socket initializations (and undo it): this is called
142 // in the beginning/end of the socket initialization/destruction
143 virtual bool Init_Socket(GSocket
*socket
) = 0;
144 virtual void Destroy_Socket(GSocket
*socket
) = 0;
146 virtual void Install_Callback(GSocket
*socket
, GSocketEvent event
) = 0;
147 virtual void Uninstall_Callback(GSocket
*socket
, GSocketEvent event
) = 0;
149 virtual void Enable_Events(GSocket
*socket
) = 0;
150 virtual void Disable_Events(GSocket
*socket
) = 0;
152 virtual ~GSocketManager() { }
155 // get the manager to use if we don't have it yet
158 static GSocketManager
*ms_manager
;
162 Base class providing functionality common to BSD and Winsock sockets.
164 TODO: merge this in wxSocket itself, there is no reason to maintain the
165 separation between wxSocket and GSocket.
170 // static factory function: creates the low-level socket associated with
171 // the given wxSocket (and inherits its attributes such as timeout)
172 static GSocket
*Create(wxSocketBase
& wxsocket
);
174 virtual ~GSocketBase();
176 void SetTimeout(unsigned long millisec
);
178 GSocketError
SetLocal(GAddress
*address
);
179 GSocketError
SetPeer(GAddress
*address
);
180 GAddress
*GetLocal();
183 GSocketEventFlags
Select(GSocketEventFlags flags
);
185 virtual GSocket
*WaitConnection(wxSocketBase
& wxsocket
) = 0;
187 virtual void Close() = 0;
188 virtual void Shutdown();
190 void SetInitialSocketBuffers(int recv
, int send
)
192 m_initialRecvBufferSize
= recv
;
193 m_initialSendBufferSize
= send
;
196 // notify m_wxsocket about the given socket event by calling its (inaptly
197 // named) OnRequest() method
198 void NotifyOnStateChange(GSocketEvent event
);
200 // this is officially SOCKET (unsigned int) under Windows but we don't want
201 // to include winsock.h which defines SOCKET from here so just use int
202 // under all platforms
205 int m_initialRecvBufferSize
;
206 int m_initialSendBufferSize
;
210 GSocketError m_error
;
220 struct timeval m_timeout
;
222 GSocketEventFlags m_detected
;
225 GSocketBase(wxSocketBase
& wxsocket
);
228 // set in ctor and never changed except that it's reset to NULL when the
229 // socket is shut down
230 wxSocketBase
*m_wxsocket
;
232 DECLARE_NO_COPY_CLASS(GSocketBase
)
235 #if defined(__WINDOWS__)
236 #include "wx/msw/gsockmsw.h"
238 #include "wx/unix/gsockunx.h"
241 /* Global initializers */
243 /* GSocket_Init() must be called at the beginning (but after calling
244 * GSocketManager::Set() if a custom manager should be used) */
247 /* GSocket_Cleanup() must be called at the end */
248 void GSocket_Cleanup();
253 // Represents a socket endpoint, i.e. -- in spite of its name -- not an address
254 // but an (address, port) pair
257 struct sockaddr
*m_addr
;
260 GAddressType m_family
;
263 GSocketError m_error
;
266 GAddress
*GAddress_new();
267 GAddress
*GAddress_copy(GAddress
*address
);
268 void GAddress_destroy(GAddress
*address
);
270 void GAddress_SetFamily(GAddress
*address
, GAddressType type
);
271 GAddressType
GAddress_GetFamily(GAddress
*address
);
273 /* The use of any of the next functions will set the address family to
274 * the specific one. For example if you use GAddress_INET_SetHostName,
275 * address family will be implicitly set to AF_INET.
278 GSocketError
GAddress_INET_SetHostName(GAddress
*address
, const char *hostname
);
279 GSocketError
GAddress_INET_SetBroadcastAddress(GAddress
*address
);
280 GSocketError
GAddress_INET_SetAnyAddress(GAddress
*address
);
281 GSocketError
GAddress_INET_SetHostAddress(GAddress
*address
,
282 unsigned long hostaddr
);
283 GSocketError
GAddress_INET_SetPortName(GAddress
*address
, const char *port
,
284 const char *protocol
);
285 GSocketError
GAddress_INET_SetPort(GAddress
*address
, unsigned short port
);
287 GSocketError
GAddress_INET_GetHostName(GAddress
*address
, char *hostname
,
289 unsigned long GAddress_INET_GetHostAddress(GAddress
*address
);
290 unsigned short GAddress_INET_GetPort(GAddress
*address
);
292 GSocketError
_GAddress_translate_from(GAddress
*address
,
293 struct sockaddr
*addr
, int len
);
294 GSocketError
_GAddress_translate_to (GAddress
*address
,
295 struct sockaddr
**addr
, int *len
);
296 GSocketError
_GAddress_Init_INET(GAddress
*address
);
300 GSocketError
GAddress_INET6_SetHostName(GAddress
*address
, const char *hostname
);
301 GSocketError
GAddress_INET6_SetAnyAddress(GAddress
*address
);
302 GSocketError
GAddress_INET6_SetHostAddress(GAddress
*address
,
303 struct in6_addr hostaddr
);
304 GSocketError
GAddress_INET6_SetPortName(GAddress
*address
, const char *port
,
305 const char *protocol
);
306 GSocketError
GAddress_INET6_SetPort(GAddress
*address
, unsigned short port
);
308 GSocketError
GAddress_INET6_GetHostName(GAddress
*address
, char *hostname
,
310 GSocketError
GAddress_INET6_GetHostAddress(GAddress
*address
,struct in6_addr
*hostaddr
);
311 unsigned short GAddress_INET6_GetPort(GAddress
*address
);
315 // these functions are available under all platforms but only implemented under
316 // Unix ones, elsewhere they just return GSOCK_INVADDR
317 GSocketError
_GAddress_Init_UNIX(GAddress
*address
);
318 GSocketError
GAddress_UNIX_SetPath(GAddress
*address
, const char *path
);
319 GSocketError
GAddress_UNIX_GetPath(GAddress
*address
, char *path
, size_t sbuf
);
321 #endif /* wxUSE_SOCKETS */
323 #endif /* _WX_GSOCKET_H_ */