]> granicus.if.org Git - icinga2/commitdiff
Improved buffering behavior.
authorGunnar Beutner <gunnar.beutner@netways.de>
Wed, 28 Mar 2012 12:06:02 +0000 (14:06 +0200)
committerGunnar Beutner <gunnar.beutner@netways.de>
Wed, 28 Mar 2012 12:06:02 +0000 (14:06 +0200)
base/tcpclient.cpp

index 8cd95bf6b33f0192d0beb11110c0ead11aff7bbd..c353b50dabc1007bc928efba9bc13f46b6db135e 100644 (file)
@@ -34,14 +34,26 @@ int TCPClient::ReadableEventHandler(EventArgs::RefType ea)
        char buffer[4096];
        int rc;
 
-       rc = recv(GetFD(), buffer, sizeof(buffer), 0);
+       while (true) {
+               rc = recv(GetFD(), buffer, sizeof(buffer), 0);
 
-       if (rc <= 0) {
-               Close();
-               return 0;
-       }
+#ifdef _WIN32
+               if (rc < 0 && WSAGetLastError() == WSAEWOULDBLOCK)
+#else /* _WIN32 */
+               if (rc < 0 && errno == EAGAIN)
+#endif /* _WIN32 */
+                       break;
 
-       m_RecvQueue->Write(buffer, rc);
+               if (rc <= 0) {
+                       Close();
+                       return 0;
+               }
+
+               m_RecvQueue->Write(buffer, rc);
+
+               if (m_RecvQueue->GetSize() > 1024 * 1024)
+                       break;
+       }
 
        EventArgs::RefType dea = new_object<EventArgs>();
        dea->Source = shared_from_this();