#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__)
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 (USE_GUI())
+ if (!USE_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);
+ if (flags & GSOCK_OUTPUT_FLAG)
+ FD_SET(socket->m_fd, &writefds);
FD_SET(socket->m_fd, &exceptfds);
/* Check 'sticky' CONNECTION flag first */
}
/* Try select now */
- if (select(socket->m_fd + 1, &readfds, &writefds, &exceptfds, &tv) <= 0)
+ if (select(socket->m_fd + 1, &readfds, &writefds, &exceptfds,
+ &socket->m_timeout) <= 0)
{
/* What to do here? */
return (result & flags);
{
char c;
- if (recv(socket->m_fd, &c, 1, MSG_PEEK) > 0)
+ if (!socket->m_stream || recv(socket->m_fd, &c, 1, MSG_PEEK) > 0)
{
result |= GSOCK_INPUT_FLAG;
}
return (result & flags);
}
- else /* !USE_GUI() */
+ else /* USE_GUI() */
{
assert(socket != NULL);
return flags & socket->m_detected;
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;