X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b1a8a61082caeb85192182c9ad77993ba62cc8c2..37340c48fbdbd2e2aadfe371b504cea700816a83:/src/msw/gsocket.c diff --git a/src/msw/gsocket.c b/src/msw/gsocket.c index b4156f5afe..5cb994b838 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$ * ------------------------------------------------------------------------- */ @@ -25,6 +25,19 @@ * 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 +# ifdef _MSC_VER +# pragma warning(pop) +# pragma warning(disable:4514) +# endif +#endif + #endif /* _MSC_VER */ #include @@ -96,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() ) @@ -117,7 +130,7 @@ void GSocket_Cleanup(void) { gs_gui_functions->GUI_Cleanup(); } - + /* Cleanup WinSocket */ WSACleanup(); } @@ -759,14 +772,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) + if (flags & GSOCK_OUTPUT_FLAG || flags & GSOCK_CONNECTION_FLAG) FD_SET(socket->m_fd, &writefds); FD_SET(socket->m_fd, &exceptfds); @@ -785,7 +798,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); @@ -811,7 +824,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); } @@ -972,6 +985,45 @@ 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; +} + +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: @@ -1294,7 +1346,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; @@ -1347,7 +1399,7 @@ GSocketError GAddress_INET_SetHostAddress(GAddress *address, 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; } @@ -1436,7 +1488,7 @@ unsigned long GAddress_INET_GetHostAddress(GAddress *address) 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)