X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fnet%2Fclientsocket.cpp;h=51a8dfa01b7913485397438ddcc3c24b5e9ae35b;hb=HEAD;hp=89e2d082a65bddee2cdfd1f32334f2fb0f3a57bf;hpb=3ab65d35cfd696002e09768a38f98e6a2e1ade81;p=libs%2Fnet.git diff --git a/source/net/clientsocket.cpp b/source/net/clientsocket.cpp index 89e2d08..51a8dfa 100644 --- a/source/net/clientsocket.cpp +++ b/source/net/clientsocket.cpp @@ -1,8 +1,10 @@ #include "platform_api.h" -#include #include "clientsocket.h" +#include #include "socket_private.h" +using namespace std; + namespace Msp { namespace Net { @@ -19,8 +21,6 @@ ClientSocket::ClientSocket(const Private &p, const SockAddr &paddr): ClientSocket::~ClientSocket() { signal_flush_required.emit(); - - delete peer_addr; } void ClientSocket::shutdown(IO::Mode m) @@ -74,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::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