* Name: gsocket.c
* Author: Guillermo Rodriguez Garcia <guille@iies.es>
* Purpose: GSocket main MSW file
- * Licence: The wxWindows licence
+ * Licence: The wxWidgets licence
* CVSID: $Id$
* -------------------------------------------------------------------------
*/
* warning: unreferenced formal parameter.
*/
# pragma warning(disable:4100)
+
+#ifdef __WXWINCE__
+ /*
+ "unreferenced inline function has been removed": this is not
+ suppressed by push above as it is given at the end of the
+ compilation unit
+ */
+# pragma warning(disable:4514)
+#endif /* __WXWINCE__ */
#endif /* _MSC_VER */
#include <winsock.h>
#ifndef __GSOCKET_STANDALONE__
-# include "wx/defs.h"
-# include "wx/setup.h"
+# include "wx/platform.h"
+# include "wx/setup.h"
#endif
#if wxUSE_SOCKETS || defined(__GSOCKET_STANDALONE__)
# include "gsocket.h"
#endif /* __GSOCKET_STANDALONE__ */
-/* Redefine some GUI-only functions to do nothing in console mode */
-#if defined(wxUSE_GUI) && !wxUSE_GUI
-# define _GSocket_GUI_Init(socket) (1)
-# define _GSocket_GUI_Destroy(socket)
-# define _GSocket_Enable_Events(socket)
-# define _GSocket_Disable_Events(socket)
-#endif /* wxUSE_GUI */
-
#ifndef __WXWINCE__
#include <assert.h>
#else
ioctlsocket(sck->m_fd, FIONBIO, (u_long FAR *) &arg);
_GSocket_Enable_Events(sck);
+ /* allow a socket to re-bind if the socket is in the TIME_WAIT
+ state after being previously closed.
+ */
+ setsockopt(sck->m_fd, SOL_SOCKET, SO_REUSEADDR, (const char*)&arg, sizeof(u_long));
+
/* Bind to the local address,
* retrieve the actual address bound,
* and listen up to 5 connections.
*/
GSocketEventFlags GSocket_Select(GSocket *socket, GSocketEventFlags flags)
{
-#if defined(wxUSE_GUI) && !wxUSE_GUI
-
- GSocketEventFlags result = 0;
- fd_set readfds;
- fd_set writefds;
- fd_set exceptfds;
- static const struct timeval tv = { 0, 0 };
-
- assert(socket != NULL);
-
- FD_ZERO(&readfds);
- FD_ZERO(&writefds);
- FD_ZERO(&exceptfds);
- FD_SET(socket->m_fd, &readfds);
- FD_SET(socket->m_fd, &writefds);
- FD_SET(socket->m_fd, &exceptfds);
-
- /* Check 'sticky' CONNECTION flag first */
- result |= (GSOCK_CONNECTION_FLAG & socket->m_detected);
-
- /* If we have already detected a LOST event, then don't try
- * to do any further processing.
- */
- if ((socket->m_detected & GSOCK_LOST_FLAG) != 0)
+ if (!USE_GUI())
{
- socket->m_establishing = FALSE;
+ GSocketEventFlags result = 0;
+ fd_set readfds;
+ fd_set writefds;
+ fd_set exceptfds;
+
+ assert(socket != NULL);
- return (GSOCK_LOST_FLAG & flags);
- }
+ FD_ZERO(&readfds);
+ FD_ZERO(&writefds);
+ FD_ZERO(&exceptfds);
+ FD_SET(socket->m_fd, &readfds);
+ if (flags & GSOCK_OUTPUT_FLAG || flags & GSOCK_CONNECTION_FLAG)
+ FD_SET(socket->m_fd, &writefds);
+ FD_SET(socket->m_fd, &exceptfds);
- /* Try select now */
- if (select(socket->m_fd + 1, &readfds, &writefds, &exceptfds, &tv) <= 0)
- {
- /* What to do here? */
- return (result & flags);
- }
+ /* Check 'sticky' CONNECTION flag first */
+ result |= (GSOCK_CONNECTION_FLAG & socket->m_detected);
- /* Check for readability */
- if (FD_ISSET(socket->m_fd, &readfds))
- {
- char c;
+ /* If we have already detected a LOST event, then don't try
+ * to do any further processing.
+ */
+ if ((socket->m_detected & GSOCK_LOST_FLAG) != 0)
+ {
+ socket->m_establishing = FALSE;
+
+ return (GSOCK_LOST_FLAG & flags);
+ }
- if (recv(socket->m_fd, &c, 1, MSG_PEEK) > 0)
+ /* Try select now */
+ if (select(socket->m_fd + 1, &readfds, &writefds, &exceptfds,
+ &socket->m_timeout) <= 0)
{
- result |= GSOCK_INPUT_FLAG;
+ /* What to do here? */
+ return (result & flags);
}
- else
+
+ /* Check for readability */
+ if (FD_ISSET(socket->m_fd, &readfds))
{
- if (socket->m_server && socket->m_stream)
+ char c;
+
+ if (!socket->m_stream || recv(socket->m_fd, &c, 1, MSG_PEEK) > 0)
{
- result |= GSOCK_CONNECTION_FLAG;
- socket->m_detected |= GSOCK_CONNECTION_FLAG;
+ result |= GSOCK_INPUT_FLAG;
}
else
{
- socket->m_detected = GSOCK_LOST_FLAG;
- socket->m_establishing = FALSE;
-
- /* LOST event: Abort any further processing */
- return (GSOCK_LOST_FLAG & flags);
+ if (socket->m_server && socket->m_stream)
+ {
+ result |= GSOCK_CONNECTION_FLAG;
+ socket->m_detected |= GSOCK_CONNECTION_FLAG;
+ }
+ else
+ {
+ socket->m_detected = GSOCK_LOST_FLAG;
+ socket->m_establishing = FALSE;
+
+ /* LOST event: Abort any further processing */
+ return (GSOCK_LOST_FLAG & flags);
+ }
}
}
- }
- /* Check for writability */
- if (FD_ISSET(socket->m_fd, &writefds))
- {
- if (socket->m_establishing && !socket->m_server)
+ /* Check for writability */
+ if (FD_ISSET(socket->m_fd, &writefds))
{
- int error;
- SOCKLEN_T len = sizeof(error);
+ if (socket->m_establishing && !socket->m_server)
+ {
+ int error;
+ SOCKLEN_T len = sizeof(error);
- socket->m_establishing = FALSE;
+ socket->m_establishing = FALSE;
- getsockopt(socket->m_fd, SOL_SOCKET, SO_ERROR, (void*)&error, &len);
+ getsockopt(socket->m_fd, SOL_SOCKET, SO_ERROR, (void*)&error, &len);
- if (error)
- {
- socket->m_detected = GSOCK_LOST_FLAG;
+ if (error)
+ {
+ socket->m_detected = GSOCK_LOST_FLAG;
- /* LOST event: Abort any further processing */
- return (GSOCK_LOST_FLAG & flags);
+ /* LOST event: Abort any further processing */
+ return (GSOCK_LOST_FLAG & flags);
+ }
+ else
+ {
+ result |= GSOCK_CONNECTION_FLAG;
+ socket->m_detected |= GSOCK_CONNECTION_FLAG;
+ }
}
else
{
- result |= GSOCK_CONNECTION_FLAG;
- socket->m_detected |= GSOCK_CONNECTION_FLAG;
+ result |= GSOCK_OUTPUT_FLAG;
}
}
- else
+
+ /* Check for exceptions and errors (is this useful in Unices?) */
+ if (FD_ISSET(socket->m_fd, &exceptfds))
{
- result |= GSOCK_OUTPUT_FLAG;
+ socket->m_establishing = FALSE;
+ socket->m_detected = GSOCK_LOST_FLAG;
+
+ /* LOST event: Abort any further processing */
+ return (GSOCK_LOST_FLAG & flags);
}
- }
- /* Check for exceptions and errors (is this useful in Unices?) */
- if (FD_ISSET(socket->m_fd, &exceptfds))
+ return (result & flags);
+ }
+ else /* USE_GUI() */
{
- socket->m_establishing = FALSE;
- socket->m_detected = GSOCK_LOST_FLAG;
-
- /* LOST event: Abort any further processing */
- return (GSOCK_LOST_FLAG & flags);
+ assert(socket != NULL);
+ return flags & socket->m_detected;
}
-
- return (result & flags);
-
-#else
-
- assert(socket != NULL);
- return flags & socket->m_detected;
-
-#endif /* !wxUSE_GUI */
}
/* Attributes */
CHECK_ADDRESS(address, INET);
addr = &(((struct sockaddr_in *)address->m_addr)->sin_addr);
- addr->s_addr = hostaddr;
+ addr->s_addr = htonl(hostaddr);;
return GSOCK_NOERROR;
}
addr = (struct sockaddr_in *)address->m_addr;
- return addr->sin_addr.s_addr;
+ return ntohl(addr->sin_addr.s_addr);
}
unsigned short GAddress_INET_GetPort(GAddress *address)
GSocketError GAddress_UNIX_SetPath(GAddress *address, const char *path)
{
+#if defined(__BORLANDC__)
+ /* prevents unused variable message in Borland */
+ (void)path;
+#endif
assert (address != NULL);
address->m_error = GSOCK_INVADDR;
return GSOCK_INVADDR;
GSocketError GAddress_UNIX_GetPath(GAddress *address, char *path, size_t sbuf)
{
+#if defined(__BORLANDC__)
+ /* prevents unused variable message in Borland */
+ (void)path;
+ (void)sbuf;
+#endif
assert (address != NULL);
address->m_error = GSOCK_INVADDR;
return GSOCK_INVADDR;