Bläddra i källkod

Add bind method to Socket class

Patrick-Christopher Mattulat 2 år sedan
förälder
incheckning
79faefbe2f

+ 2 - 1
include/ls_std/core/interface/IPosixSocket.hpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2022-12-09
- * Changed:         2022-12-09
+ * Changed:         2022-12-10
  *
  * */
 
@@ -20,6 +20,7 @@ namespace ls::std::core::interface_type
 
       virtual ~IPosixSocket() = default;
 
+      virtual int bind(int _socketFileDescriptor, const struct sockaddr* _address, socklen_t _addressLength) = 0;
       virtual int connect(int _socketFileDescriptor, const struct sockaddr* _address, socklen_t _addressLength) = 0;
       virtual int create(int _domain, int _type, int _protocol) = 0; // constructor
   };

+ 1 - 0
include/ls_std/network/socket/MockPosixSocket.hpp

@@ -22,6 +22,7 @@ namespace ls_std_network_test
       MockPosixSocket() = default;
       ~MockPosixSocket() override = default;
 
+      MOCK_METHOD(int, bind, (int _socketFileDescriptor, const struct sockaddr *_address, socklen_t _addressLength), (override));
       MOCK_METHOD(int, connect, (int _socketFileDescriptor, const struct sockaddr *_address, socklen_t _addressLength), (override));
       MOCK_METHOD(int, create, (int _domain, int _type, int _protocol), (override));
   };

+ 2 - 1
include/ls_std/network/socket/PosixSocket.hpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2022-12-09
- * Changed:         2022-12-09
+ * Changed:         2022-12-10
  *
  * */
 
@@ -21,6 +21,7 @@ namespace ls::std::network
       PosixSocket() = default;
       ~PosixSocket() override = default;
 
+      int bind(int _socketFileDescriptor, const struct sockaddr *_address, socklen_t _addressLength) override;
       int connect(int _socketFileDescriptor, const struct sockaddr *_address, socklen_t _addressLength) override;
       int create(int _domain, int _type, int _protocol) override;
   };

+ 2 - 0
include/ls_std/network/socket/Socket.hpp

@@ -28,6 +28,7 @@ namespace ls::std::network
       explicit Socket(const ls::std::network::SocketParameter& _parameter);
       ~Socket() override = default;
 
+      [[nodiscard]] bool bind();
       [[nodiscard]] bool connect();
       [[nodiscard]] bool isInitialized() const;
 
@@ -41,6 +42,7 @@ namespace ls::std::network
       #endif
 
       #if defined(unix) || defined(__APPLE__)
+      [[nodiscard]] bool _bindUnix();
       [[nodiscard]] bool _connectUnix();
       #endif
       [[nodiscard]] SocketAddressMapperParameter _createSocketAddressMapperParameter() const;

+ 6 - 1
source/ls_std/network/socket/PosixSocket.cpp

@@ -3,13 +3,18 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2022-12-09
- * Changed:         2022-12-09
+ * Changed:         2022-12-10
  *
  * */
 
 #include <ls_std/network/socket/PosixSocket.hpp>
 #include <sys/socket.h>
 
+int ls::std::network::PosixSocket::bind(int _socketFileDescriptor, const struct sockaddr *_address, socklen_t _addressLength)
+{
+  return ::bind(_socketFileDescriptor, _address, _addressLength);
+}
+
 int ls::std::network::PosixSocket::connect(int _socketFileDescriptor, const struct sockaddr *_address, socklen_t _addressLength)
 {
   return ::connect(_socketFileDescriptor, _address, _addressLength);

+ 14 - 0
source/ls_std/network/socket/Socket.cpp

@@ -25,6 +25,13 @@ parameter(_parameter)
   #endif
 }
 
+bool ls::std::network::Socket::bind()
+{
+  #if defined(unix) || defined(__APPLE__)
+  return ls::std::network::Socket::_bindUnix();
+  #endif
+}
+
 bool ls::std::network::Socket::connect()
 {
   #if defined(unix) || defined(__APPLE__)
@@ -38,6 +45,13 @@ bool ls::std::network::Socket::isInitialized() const
 }
 
 #if defined(unix) || defined(__APPLE__)
+
+bool ls::std::network::Socket::_bindUnix()
+{
+  ls::std::network::ConvertedSocketAddress convertedSocketAddress = ls::std::network::SocketAddressMapper::from(ls::std::network::Socket::_createSocketAddressMapperParameter());
+  return this->posixSocket->bind(this->unixDescriptor, reinterpret_cast<const sockaddr *>(&convertedSocketAddress.socketAddressUnix), sizeof(convertedSocketAddress.socketAddressUnix)) == 0;
+}
+
 bool ls::std::network::Socket::_connectUnix()
 {
   ls::std::network::ConvertedSocketAddress convertedSocketAddress = ls::std::network::SocketAddressMapper::from(ls::std::network::Socket::_createSocketAddressMapperParameter());

+ 17 - 0
test/cases/network/socket/SocketTest.cpp

@@ -49,6 +49,23 @@ namespace
     ASSERT_STREQ("Socket", Socket{generateSocketParameter()}.getClassName().c_str());
   }
 
+  TEST_F(SocketTest, bind)
+  {
+    #if defined(unix) || defined(__APPLE__)
+    MockPosixSocket mockPosixSocket{};
+    EXPECT_CALL(mockPosixSocket, create(_, _, _)).Times(AtLeast(1));
+    ON_CALL(mockPosixSocket, create(_, _, _)).WillByDefault(Return(0));
+    EXPECT_CALL(mockPosixSocket, bind(_, _, _)).Times(AtLeast(1));
+    ON_CALL(mockPosixSocket, bind(_, _, _)).WillByDefault(Return(0));
+    #endif
+
+    SocketParameter parameter = generateSocketParameter();
+    parameter.mockSocketApi = true;
+    Socket socket{parameter};
+
+    ASSERT_TRUE(socket.bind());
+  }
+
   TEST_F(SocketTest, connect)
   {
     #if defined(unix) || defined(__APPLE__)