]> git.saurik.com Git - wxWidgets.git/commitdiff
When recv returns 0, the connection has been remotely closed or dropped. Changes...
authorKevin Hock <hockkn@yahoo.com>
Wed, 5 Oct 2005 23:20:10 +0000 (23:20 +0000)
committerKevin Hock <hockkn@yahoo.com>
Wed, 5 Oct 2005 23:20:10 +0000 (23:20 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@35802 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/unix/gsocket.cpp

index 874098d3b648c7a006486039d1a17cf4dd0336d7..eaa732bb784a69c5ad56e602bcde6041a28ae265 100644 (file)
@@ -882,7 +882,13 @@ int GSocket::Read(char *buffer, int size)
     else
       ret = Recv_Dgram(buffer, size);
 
-    if (ret == -1) {
+    /* If recv returned zero, then the connection is lost, and errno is not set.
+     * 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;
+    else if (ret == -1) {
       if ((errno == EWOULDBLOCK) || (errno == EAGAIN))
         m_error = GSOCK_WOULDBLOCK;
       else
@@ -1026,7 +1032,12 @@ GSocketEventFlags GSocket::Select(GSocketEventFlags flags)
           result |= GSOCK_CONNECTION_FLAG;
           m_detected |= GSOCK_CONNECTION_FLAG;
         }
-        else if ((errno != EWOULDBLOCK) && (errno != EAGAIN) && (errno != EINTR))
+        /* If recv returned zero, then the connection is lost, and errno is not set.
+         * 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.
+         */
+        else if (num == 0 ||
+                 (errno != EWOULDBLOCK) && (errno != EAGAIN) && (errno != EINTR))
         {
           m_detected = GSOCK_LOST_FLAG;
           m_establishing = false;