X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/01ba4b6713fd096f5418754d375635237cc08e84..75d9e502238df95fa53c0030b1fac0d4f43e4025:/src/unix/gsocket.cpp diff --git a/src/unix/gsocket.cpp b/src/unix/gsocket.cpp index 6e0292a78b..e2423cdd2c 100644 --- a/src/unix/gsocket.cpp +++ b/src/unix/gsocket.cpp @@ -587,7 +587,7 @@ void GSocket::Shutdown() /* If socket has been created, shutdown it */ if (m_fd != INVALID_SOCKET) { - shutdown(m_fd, 2); + shutdown(m_fd, 1); Close(); } @@ -1168,17 +1168,16 @@ int GSocket::Read(char *buffer, int size) else ret = Recv_Dgram(buffer, size); - /* If recv returned zero, then the connection is lost, and errno is not set. + /* If recv returned zero, then the connection has been gracefully closed. * Otherwise, recv has returned an error (-1), in which case we have lost the * socket only if errno does _not_ indicate that there may be more data to read. */ if (ret == 0) { - m_error = GSOCK_IOERR; + /* Make sure wxSOCKET_LOST event gets sent and shut down the socket */ m_detected = GSOCK_LOST_FLAG; - Close(); - // Signal an error for return - return -1; + Detected_Read(); + return 0; } else if (ret == -1) { @@ -1752,6 +1751,12 @@ void GSocket::Detected_Read() { CALL_CALLBACK(this, GSOCK_CONNECTION); } + else if (num == 0) + { + /* graceful shutdown */ + CALL_CALLBACK(this, GSOCK_LOST); + Shutdown(); + } else { /* Do not throw a lost event in cases where the socket isn't really lost */