]> git.tdb.fi Git - libs/net.git/blobdiff - source/net/clientsocket.cpp
Implement an asynchronous name resolver class
[libs/net.git] / source / net / clientsocket.cpp
index 80303de7ea9a136aa61ce54337effb80e049d934..d28d0e90b930487b4a573cb751356baf10575666 100644 (file)
@@ -32,6 +32,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,6 +67,7 @@ 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");
 
@@ -61,6 +88,7 @@ unsigned ClientSocket::do_write(const char *buf, unsigned size)
 
 unsigned ClientSocket::do_read(char *buf, unsigned size)
 {
+       check_access(IO::M_READ);
        if(!connected)
                throw bad_socket_state("not connected");