Browse Source

Add close functionality to Socket class (windows)

- add close functionality to Socket class for
windows systems (unstable)
Patrick-Christopher Mattulat 3 years ago
parent
commit
963ac41f67
2 changed files with 41 additions and 4 deletions
  1. 6 3
      include/ls_std/network/Socket.hpp
  2. 35 1
      source/ls_std/network/Socket.cpp

+ 6 - 3
include/ls_std/network/Socket.hpp

@@ -29,9 +29,9 @@ namespace ls_std {
     public:
 
       Socket();
-      ~Socket() override = default;
+      ~Socket() override;
 
-      bool close() const;
+      bool close();
       bool create(ls_std::AddressFamily _addressFamily, ls_std::SocketType _socketType, ls_std::NetworkProtocol _networkProtocol);
 
     private:
@@ -43,10 +43,13 @@ namespace ls_std {
         SOCKET descriptor {};
       #endif
 
+      bool _close();
+      #ifdef _WIN32
+        bool _closeOnWindows() const;
+      #endif
       static int _convertAddressFamily(ls_std::AddressFamily _addressFamily);
       static int _convertNetworkProtocol(ls_std::NetworkProtocol _networkProtocol);
       static int _convertSocketType(ls_std::SocketType _socketType);
-
       #if defined(unix) || defined(__APPLE__)
         static int _create(ls_std::AddressFamily _addressFamily, ls_std::SocketType _socketType, ls_std::NetworkProtocol _networkProtocol);
       #endif

+ 35 - 1
source/ls_std/network/Socket.cpp

@@ -8,6 +8,7 @@
  * */
 
 #include <ls_std/network/Socket.hpp>
+#include <ls_std/base/Types.hpp>
 
 #if defined(unix) || defined(__APPLE__)
 #include <sys/socket.h>
@@ -16,12 +17,19 @@
 #endif
 #ifdef _WIN32
 #include <http.h>
+#include <iostream>
+#include <ls_std/utils/WindowsUtils.hpp>
 #endif
 
 ls_std::Socket::Socket() : ls_std::Class("Socket")
 {}
 
-bool ls_std::Socket::close() const
+ls_std::Socket::~Socket()
+{
+  this->_close();
+}
+
+bool ls_std::Socket::close()
 {
   bool closed;
 
@@ -29,6 +37,9 @@ bool ls_std::Socket::close() const
     int result = ::close(this->descriptor);
     closed = result == 0;
   #endif
+  #ifdef _WIN32
+    closed = this->_close();
+  #endif
 
   return closed;
 }
@@ -49,6 +60,29 @@ bool ls_std::Socket::create(ls_std::AddressFamily _addressFamily, ls_std::Socket
   return created;
 }
 
+bool ls_std::Socket::_close()
+{
+  bool closed;
+
+  #ifdef _WIN32
+    closed = this->_closeOnWindows();
+  #endif
+
+  return closed;
+}
+
+bool ls_std::Socket::_closeOnWindows() const
+{
+  int result = closesocket(this->descriptor);
+  bool closed = result == 0;
+
+  if(!closed) {
+    std::cout << ls_std::WindowsUtils::getMessageFromErrorCode(WSAGetLastError()) << std::endl; // TODO: use logger
+  }
+
+  return closed;
+}
+
 int ls_std::Socket::_convertAddressFamily(ls_std::AddressFamily _addressFamily)
 {
   int addressFamily;