X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f925e7b4f3d017b33749bd23a64592c1985e8f98..ba2a81d747036d40bb917d09c82b3562de707e99:/src/msw/gsocket.c diff --git a/src/msw/gsocket.c b/src/msw/gsocket.c index 86cfc7b913..74783e0b1b 100644 --- a/src/msw/gsocket.c +++ b/src/msw/gsocket.c @@ -3,7 +3,7 @@ * Name: gsocket.c * Author: Guillermo Rodriguez Garcia * Purpose: GSocket main MSW file - * Licence: The wxWindows licence + * Licence: The wxWidgets licence * CVSID: $Id$ * ------------------------------------------------------------------------- */ @@ -27,13 +27,17 @@ # 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__ */ + /* windows.h results in tons of warnings at max warning level */ +# ifdef _MSC_VER +# pragma warning(push, 1) +# endif +# include +# ifdef _MSC_VER +# pragma warning(pop) +# pragma warning(disable:4514) +# endif +#endif + #endif /* _MSC_VER */ #include @@ -105,11 +109,11 @@ void GSocket_SetGUIFunctions(struct GSocketGUIFunctionsTable *guifunc) { gs_gui_functions = guifunc; } - + int GSocket_Init(void) { WSADATA wsaData; - + if (gs_gui_functions) { if ( !gs_gui_functions->GUI_Init() ) @@ -126,7 +130,7 @@ void GSocket_Cleanup(void) { gs_gui_functions->GUI_Cleanup(); } - + /* Cleanup WinSocket */ WSACleanup(); } @@ -156,6 +160,7 @@ GSocket *GSocket_new(void) socket->m_timeout.tv_sec = 10 * 60; /* 10 minutes */ socket->m_timeout.tv_usec = 0; socket->m_establishing = FALSE; + socket->m_reusable = FALSE; /* Per-socket GUI-specific initialization */ success = _GSocket_GUI_Init_Socket(socket); @@ -371,7 +376,6 @@ GSocketError GSocket_SetServer(GSocket *sck) /* Initialize all fields */ sck->m_server = TRUE; sck->m_stream = TRUE; - sck->m_oriented = TRUE; /* Create the socket */ sck->m_fd = socket(sck->m_local->m_realfamily, SOCK_STREAM, 0); @@ -388,7 +392,9 @@ GSocketError GSocket_SetServer(GSocket *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)); + if (sck->m_reusable) { + setsockopt(sck->m_fd, SOL_SOCKET, SO_REUSEADDR, (const char*)&arg, sizeof(u_long)); + } /* Bind to the local address, * retrieve the actual address bound, @@ -473,7 +479,6 @@ GSocket *GSocket_WaitConnection(GSocket *sck) /* Initialize all fields */ connection->m_server = FALSE; connection->m_stream = TRUE; - connection->m_oriented = TRUE; /* Setup the peer address field */ connection->m_peer = GAddress_new(); @@ -498,6 +503,24 @@ GSocket *GSocket_WaitConnection(GSocket *sck) return connection; } +/* GSocket_SetReusable: +* Simply sets the m_resuable flag on the socket. GSocket_SetServer will +* make the appropriate setsockopt() call. +* Implemented as a GSocket function because clients (ie, wxSocketServer) +* don't have access to the GSocket struct information. +* Returns TRUE if the flag was set correctly, FALSE if an error occured +* (ie, if the parameter was NULL) +*/ +int GSocket_SetReusable(GSocket *socket) +{ + /* socket must not be null, and must not be in use/already bound */ + if (NULL != socket && socket->m_fd == INVALID_SOCKET) { + socket->m_reusable = TRUE; + return TRUE; + } + return FALSE; +} + /* Client specific parts */ /* GSocket_Connect: @@ -547,7 +570,6 @@ GSocketError GSocket_Connect(GSocket *sck, GSocketStream stream) /* Streamed or dgram socket? */ sck->m_stream = (stream == GSOCK_STREAMED); - sck->m_oriented = TRUE; sck->m_server = FALSE; sck->m_establishing = FALSE; @@ -647,7 +669,6 @@ GSocketError GSocket_SetNonOriented(GSocket *sck) /* Initialize all fields */ sck->m_stream = FALSE; sck->m_server = FALSE; - sck->m_oriented = FALSE; /* Create the socket */ sck->m_fd = socket(sck->m_local->m_realfamily, SOCK_DGRAM, 0); @@ -773,14 +794,14 @@ GSocketEventFlags GSocket_Select(GSocket *socket, GSocketEventFlags flags) fd_set readfds; fd_set writefds; fd_set exceptfds; - + assert(socket != NULL); FD_ZERO(&readfds); FD_ZERO(&writefds); FD_ZERO(&exceptfds); FD_SET(socket->m_fd, &readfds); - if (flags & GSOCK_OUTPUT_FLAG || flags & GSOCK_CONNECTION_FLAG) + if (flags & GSOCK_OUTPUT_FLAG || flags & GSOCK_CONNECTION_FLAG) FD_SET(socket->m_fd, &writefds); FD_SET(socket->m_fd, &exceptfds); @@ -799,7 +820,7 @@ GSocketEventFlags GSocket_Select(GSocket *socket, GSocketEventFlags flags) /* Try select now */ if (select(socket->m_fd + 1, &readfds, &writefds, &exceptfds, - &socket->m_timeout) <= 0) + &socket->m_timeout) <= 0) { /* What to do here? */ return (result & flags); @@ -825,7 +846,7 @@ GSocketEventFlags GSocket_Select(GSocket *socket, GSocketEventFlags flags) { socket->m_detected = GSOCK_LOST_FLAG; socket->m_establishing = FALSE; - + /* LOST event: Abort any further processing */ return (GSOCK_LOST_FLAG & flags); } @@ -986,6 +1007,26 @@ void GSocket_UnsetCallback(GSocket *socket, GSocketEventFlags 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; +} + /* Internals (IO) */ /* _GSocket_Input_Timeout: @@ -1308,7 +1349,7 @@ GSocketError _GAddress_Init_INET(GAddress *address) } 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;