* 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__
+ /* windows.h results in tons of warnings at max warning level */
+# ifdef _MSC_VER
+# pragma warning(push, 1)
+# endif
+# include <windows.h>
+# ifdef _MSC_VER
+# pragma warning(pop)
+# pragma warning(disable:4514)
+# endif
+#endif
+
#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__)
{
gs_gui_functions = guifunc;
}
-
+
int GSocket_Init(void)
{
WSADATA wsaData;
-
+
if (gs_gui_functions)
{
if ( !gs_gui_functions->GUI_Init() )
{
gs_gui_functions->GUI_Cleanup();
}
-
+
/* Cleanup WinSocket */
WSACleanup();
}
fd_set readfds;
fd_set writefds;
fd_set exceptfds;
- static const struct timeval tv = { 0, 0 };
assert(socket != NULL);
FD_ZERO(&writefds);
FD_ZERO(&exceptfds);
FD_SET(socket->m_fd, &readfds);
- FD_SET(socket->m_fd, &writefds);
+ if (flags & GSOCK_OUTPUT_FLAG || flags & GSOCK_CONNECTION_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;
}
{
socket->m_detected = GSOCK_LOST_FLAG;
socket->m_establishing = FALSE;
-
+
/* LOST event: Abort any further processing */
return (GSOCK_LOST_FLAG & flags);
}
}
}
+GSocketError GSocket_GetSockOpt(GSocket *socket, int level, int optname,
+ void *optval, int *optlen)
+{
+ if (getsockopt(socket->m_fd, level, optname, optval, optlen) == 0)
+ {
+ return GSOCK_NOERROR;
+ }
+ return GSOCK_OPTERR;
+}
+
+GSocketError GSocket_SetSockOpt(GSocket *socket, int level, int optname,
+ const void *optval, int optlen)
+{
+ if (setsockopt(socket->m_fd, level, optname, optval, optlen) == 0)
+ {
+ return GSOCK_NOERROR;
+ }
+ return GSOCK_OPTERR;
+}
+
+GSocketError GSocket_SetReuseAddr(GSocket *socket)
+{
+ /* allow a socket to re-bind if the socket is in the TIME_WAIT
+ state after being previously closed.
+ */
+ u_long arg = 1;
+ setsockopt(socket->m_fd, SOL_SOCKET, SO_REUSEADDR, (const char*)&arg, sizeof(u_long));
+}
+
+void GSocket_Streamed(GSocket *socket)
+{
+ socket->m_stream = TRUE;
+}
+
+void GSocket_Unstreamed(GSocket *socket)
+{
+ socket->m_stream = FALSE;
+}
+
/* Internals (IO) */
/* _GSocket_Input_Timeout:
}
address->m_family = GSOCK_INET;
- address->m_realfamily = PF_INET;
+ address->m_realfamily = AF_INET;
((struct sockaddr_in *)address->m_addr)->sin_family = AF_INET;
((struct sockaddr_in *)address->m_addr)->sin_addr.s_addr = INADDR_ANY;
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;