]> git.tdb.fi Git - libs/net.git/blobdiff - source/net/clientsocket.cpp
Add a dynamic receiver class for more flexible packet handling
[libs/net.git] / source / net / clientsocket.cpp
index e6e10e9af3047384af78186513da9e21c05acde2..51a8dfa01b7913485397438ddcc3c24b5e9ae35b 100644 (file)
@@ -1,8 +1,10 @@
 #include "platform_api.h"
-#include <msp/core/systemerror.h>
 #include "clientsocket.h"
+#include <msp/core/systemerror.h>
 #include "socket_private.h"
 
+using namespace std;
+
 namespace Msp {
 namespace Net {
 
@@ -72,18 +74,22 @@ size_t ClientSocket::do_read(char *buf, size_t size)
        if(!connected)
                throw bad_socket_state("not connected");
 
+       // XXX This breaks level-triggered semantics on Windows
        if(size==0)
                return 0;
 
-       size_t ret = check_sys_error(::recv(priv->handle, buf, size, 0), "recv");
-       if(ret==0 && !eof_flag)
+       make_signed<size_t>::type ret = ::recv(priv->handle, buf, size, 0);
+       if(ret==0)
        {
-               eof_flag = true;
-               set_socket_events(S_NONE);
-               signal_end_of_file.emit();
+               if(!eof_flag)
+               {
+                       set_socket_events(S_NONE);
+                       set_eof();
+               }
+               return 0;
        }
 
-       return ret;
+       return check_sys_error(ret, "recv");
 }
 
 } // namespace Net