Index: /trunk/src/VBox/Devices/Serial/DrvTCP.cpp
===================================================================
--- /trunk/src/VBox/Devices/Serial/DrvTCP.cpp	(revision 73617)
+++ /trunk/src/VBox/Devices/Serial/DrvTCP.cpp	(revision 73618)
@@ -133,8 +133,21 @@
         else
         {
+            /* Always include error event. */
+            fEvts |= RTPOLL_EVT_ERROR;
+            rc = RTPollSetEventsChange(pThis->hPollSet, DRVTCP_POLLSET_ID_SOCKET, fEvts);
+            AssertRC(rc);
+        }
+    }
+
+    if (RT_SUCCESS(rc))
+    {
+        while (RT_SUCCESS(rc))
+        {
+            uint32_t fEvtsRecv = 0;
+            uint32_t idHnd = 0;
+
             /*
-             * Just return if the send buffer wasn't full till now and
-             * the caller wants to check whether writing is possible with
-             * the event set.
+             * Just check for data available to be read if the send buffer wasn't full till now and
+             * the caller wants to check whether writing is possible with the event set.
              *
              * On Windows the write event is only posted after a send operation returned
@@ -143,23 +156,7 @@
              */
             if (   (fEvts & RTPOLL_EVT_WRITE)
-                && !pThis->fXmitBufFull)
-            {
-                *pfEvts = RTPOLL_EVT_WRITE;
-                return VINF_SUCCESS;
-            }
-
-            /* Always include error event. */
-            fEvts |= RTPOLL_EVT_ERROR;
-            rc = RTPollSetEventsChange(pThis->hPollSet, DRVTCP_POLLSET_ID_SOCKET, fEvts);
-            AssertRC(rc);
-        }
-    }
-
-    if (RT_SUCCESS(rc))
-    {
-        while (RT_SUCCESS(rc))
-        {
-            uint32_t fEvtsRecv = 0;
-            uint32_t idHnd = 0;
+                && !pThis->fXmitBufFull
+                && pThis->fTcpSockInPollSet)
+                cMillies = 0;
 
             rc = RTPoll(pThis->hPollSet, cMillies, &fEvtsRecv, &idHnd);
@@ -209,8 +206,17 @@
                         if (fEvtsRecv & RTPOLL_EVT_WRITE)
                             pThis->fXmitBufFull = false;
+                        else if (!pThis->fXmitBufFull)
+                            fEvtsRecv |= RTPOLL_EVT_WRITE;
                         *pfEvts = fEvtsRecv;
                         break;
                     }
                 }
+            }
+            else if (   rc == VERR_TIMEOUT
+                     && !pThis->fXmitBufFull)
+            {
+                *pfEvts = RTPOLL_EVT_WRITE;
+                rc = VINF_SUCCESS;
+                break;
             }
         }
