Utils: Implement more flexible SystemException
[senf.git] / Socket / SocketProtocol.cc
index fc5fd4c..13ee94e 100644 (file)
@@ -24,6 +24,7 @@
     \brief SocketProtocol and ConcreteSocketProtocol non-inline non-template implementation
  */
 
+#include <sys/socket.h>
 #include "SocketProtocol.hh"
 //#include "SocketProtocol.ih"
 
 //#include "SocketProtocol.mpp"
 #define prefix_
 ///////////////////////////////cc.p////////////////////////////////////////
+prefix_ void senf::SocketProtocol::close()
+    const
+{
+    if (::shutdown(body().fd(),SHUT_RDWR) < 0)
+        throwErrno();
+    if (::close(body().fd()) < 0)
+        throwErrno();
+}
+
+prefix_ void senf::SocketProtocol::terminate()
+    const
+{
+    struct linger ling;
+    ling.l_onoff = 0;
+    ling.l_linger = 0;
+
+    // We purposely IGNORE any errors: this method is used to try and
+    // terminate the connection ignoring any possible problems
+
+    ::setsockopt(body().fd(),SOL_SOCKET,SO_LINGER,&ling,sizeof(ling));
+    ::shutdown(body().fd(),SHUT_RDWR);
+    ::close(body().fd());
+}
 
 prefix_ void senf::SocketProtocol::state(SocketStateMap & map, unsigned lod)
     const
@@ -49,4 +73,5 @@ prefix_ void senf::SocketProtocol::state(SocketStateMap & map, unsigned lod)
 // indent-tabs-mode: nil
 // ispell-local-dictionary: "american"
 // compile-command: "scons -u test"
+// comment-column: 40
 // End: