X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/716a5baa6ecd0d5d0c31914567e4da3165ca6ff0..d16619f8d0f0a3bff7dd51cf57d1ba0f70176309:/src/msw/gsocket.cpp diff --git a/src/msw/gsocket.cpp b/src/msw/gsocket.cpp index d72e553f28..2edc3ab247 100644 --- a/src/msw/gsocket.cpp +++ b/src/msw/gsocket.cpp @@ -222,7 +222,7 @@ void GSocket::Shutdown() /* If socket has been created, shutdown it */ if (m_fd != INVALID_SOCKET) { - shutdown(m_fd, 2); + shutdown(m_fd, 1 /* SD_SEND */); Close(); } @@ -399,8 +399,9 @@ GSocketError GSocket::SetServer() /* allow a socket to re-bind if the socket is in the TIME_WAIT state after being previously closed. */ - if (m_reusable) { - setsockopt(m_fd, SOL_SOCKET, SO_REUSEADDR, (const char*)&arg, sizeof(u_long)); + if (m_reusable) + { + setsockopt(m_fd, SOL_SOCKET, SO_REUSEADDR, (const char*)&arg, sizeof(arg)); } /* Bind to the local address, @@ -596,7 +597,7 @@ GSocketError GSocket::Connect(GSocketStream stream) // If the reuse flag is set, use the applicable socket reuse flag if (m_reusable) { - setsockopt(m_fd, SOL_SOCKET, SO_REUSEADDR, (const char*)&arg, sizeof(u_long)); + setsockopt(m_fd, SOL_SOCKET, SO_REUSEADDR, (const char*)&arg, sizeof(arg)); } // If a local address has been set, then we need to bind to it before calling connect @@ -701,6 +702,11 @@ GSocketError GSocket::SetNonOriented() ioctlsocket(m_fd, FIONBIO, (u_long FAR *) &arg); gs_gui_functions->Enable_Events(this); + if (m_reusable) + { + setsockopt(m_fd, SOL_SOCKET, SO_REUSEADDR, (const char*)&arg, sizeof(arg)); + } + /* Bind to the local address, * and retrieve the actual address bound. */ @@ -848,30 +854,28 @@ GSocketEventFlags GSocket::Select(GSocketEventFlags flags) return (result & flags); } + /* Check for exceptions and errors */ + if (FD_ISSET(m_fd, &exceptfds)) + { + m_establishing = false; + m_detected = GSOCK_LOST_FLAG; + + /* LOST event: Abort any further processing */ + return (GSOCK_LOST_FLAG & flags); + } + /* Check for readability */ if (FD_ISSET(m_fd, &readfds)) { - char c; + result |= GSOCK_INPUT_FLAG; - if (!m_stream || recv(m_fd, &c, 1, MSG_PEEK) > 0) + if (m_server && m_stream) { - result |= GSOCK_INPUT_FLAG; - } - else - { - if (m_server && m_stream) - { - result |= GSOCK_CONNECTION_FLAG; - m_detected |= GSOCK_CONNECTION_FLAG; - } - else - { - m_detected = GSOCK_LOST_FLAG; - m_establishing = false; - - /* LOST event: Abort any further processing */ - return (GSOCK_LOST_FLAG & flags); - } + /* This is a TCP server socket that detected a connection. + While the INPUT_FLAG is also set, it doesn't matter on + this kind of sockets, as we can only Accept() from them. */ + result |= GSOCK_CONNECTION_FLAG; + m_detected |= GSOCK_CONNECTION_FLAG; } } @@ -906,16 +910,6 @@ GSocketEventFlags GSocket::Select(GSocketEventFlags flags) } } - /* Check for exceptions and errors (is this useful in Unices?) */ - if (FD_ISSET(m_fd, &exceptfds)) - { - m_establishing = false; - m_detected = GSOCK_LOST_FLAG; - - /* LOST event: Abort any further processing */ - return (GSOCK_LOST_FLAG & flags); - } - return (result & flags); } else /* USE_GUI() */