]> git.tdb.fi Git - libs/net.git/blobdiff - source/net/clientsocket.cpp
Move most platform-specific code into overlay directories
[libs/net.git] / source / net / clientsocket.cpp
index 80303de7ea9a136aa61ce54337effb80e049d934..04d07000a7bb1286c105a1697fdc71f0bc880901 100644 (file)
@@ -1,9 +1,4 @@
-#ifdef WIN32
-#include <winsock2.h>
-#else
-#include <cerrno>
-#include <sys/socket.h>
-#endif
+#include "platform_api.h"
 #include <msp/core/systemerror.h>
 #include "clientsocket.h"
 #include "socket_private.h"
@@ -32,6 +27,32 @@ ClientSocket::~ClientSocket()
        delete peer_addr;
 }
 
+void ClientSocket::shutdown(IO::Mode m)
+{
+       int how;
+       m = m&IO::M_RDWR;
+#ifdef _WIN32
+       if(m==IO::M_READ)
+               how = SD_RECEIVE;
+       else if(m==IO::M_WRITE)
+               how = SD_SEND;
+       else if(m==IO::M_RDWR)
+               how = SD_BOTH;
+#else
+       if(m==IO::M_READ)
+               how = SHUT_RD;
+       else if(m==IO::M_WRITE)
+               how = SHUT_WR;
+       else if(m==IO::M_RDWR)
+               how = SHUT_RDWR;
+#endif
+       else
+               return;
+
+       ::shutdown(priv->handle, how);
+       mode = mode&~m;
+}
+
 const SockAddr &ClientSocket::get_peer_address() const
 {
        if(peer_addr==0)
@@ -41,45 +62,31 @@ const SockAddr &ClientSocket::get_peer_address() const
 
 unsigned ClientSocket::do_write(const char *buf, unsigned size)
 {
+       check_access(IO::M_WRITE);
        if(!connected)
                throw bad_socket_state("not connected");
 
        if(size==0)
                return 0;
 
-       int ret = ::send(priv->handle, buf, size, 0);
-       if(ret<0)
-       {
-               if(errno==EAGAIN)
-                       return 0;
-               else
-                       throw system_error("send");
-       }
-
-       return ret;
+       return check_sys_error(::send(priv->handle, buf, size, 0), "send");
 }
 
 unsigned ClientSocket::do_read(char *buf, unsigned size)
 {
+       check_access(IO::M_READ);
        if(!connected)
                throw bad_socket_state("not connected");
 
        if(size==0)
                return 0;
 
-       int ret = ::recv(priv->handle, buf, size, 0);
-       if(ret<0)
-       {
-               if(errno==EAGAIN)
-                       return 0;
-               else
-                       throw system_error("recv");
-       }
-       else if(ret==0 && !eof_flag)
+       unsigned ret = check_sys_error(::recv(priv->handle, buf, size, 0), "recv");
+       if(ret==0 && !eof_flag)
        {
                eof_flag = true;
                signal_end_of_file.emit();
-               set_events(IO::P_NONE);
+               set_socket_events(S_NONE);
        }
 
        return ret;