--- a/src/Socket.cpp Sat Aug 06 00:33:40 2022 +0200
+++ b/src/Socket.cpp Sat Aug 06 00:54:03 2022 +0200
@@ -124,25 +124,28 @@
};
+template<class SocketClass> static std::shared_ptr<Socket> openClientSocket(const SocketOptions& options, int socketType, int protocol) {
+ AddressInfos remoteAddresses = AddressInfos::getAddressInfos(
+ findOption(options, OPTION_HOST, true),
+ findOption(options, OPTION_PORT, true),
+ socketType,
+ protocol);
+
+ return std::shared_ptr<SocketClass>(new SocketClass(remoteAddresses));
+}
+
class UDPClientSocket : public Socket {
private:
AddressInfos remoteAddresses;
+public:
+
UDPClientSocket(AddressInfos remoteAddresses) : remoteAddresses(remoteAddresses) {
}
-public:
-
static std::shared_ptr<Socket> open(const SocketOptions& options) {
- auto protocol = findOption(options, OPTION_PROTOCOL);
-
- AddressInfos remoteAddresses = AddressInfos::getAddressInfos(
- findOption(options, OPTION_HOST, true),
- findOption(options, OPTION_PORT, true),
- protocol == PROTOCOL_SCTP ? SOCK_SEQPACKET : SOCK_DGRAM,
- protocol == PROTOCOL_SCTP ? IPPROTO_SCTP : IPPROTO_UDP);
-
- return std::shared_ptr<UDPClientSocket>(new UDPClientSocket(remoteAddresses));
+ bool sctp = findOption(options, OPTION_PROTOCOL) == PROTOCOL_SCTP;
+ return openClientSocket<UDPClientSocket>(options, sctp ? SOCK_SEQPACKET : SOCK_DGRAM, sctp ? IPPROTO_SCTP : IPPROTO_UDP);
}
void send(const std::string& message) override {
@@ -162,18 +165,13 @@
private:
AddressInfos remoteAddresses;
+public:
+
TCPClientSocket(AddressInfos remoteAddresses) : remoteAddresses(remoteAddresses) {
}
-public:
static std::shared_ptr<Socket> open(const SocketOptions& options) {
- AddressInfos remoteAddresses = AddressInfos::getAddressInfos(
- findOption(options, OPTION_HOST, true),
- findOption(options, OPTION_PORT, true),
- SOCK_STREAM,
- IPPROTO_TCP);
-
- return std::shared_ptr<TCPClientSocket>(new TCPClientSocket(remoteAddresses));
+ return openClientSocket<TCPClientSocket>(options, SOCK_STREAM, IPPROTO_TCP);
}
void send(const std::string& message) override {
@@ -182,6 +180,7 @@
check(::connect(s.getFD(), ai->ai_addr, ai->ai_addrlen), "connect socket");
ssize_t written = ::write(s.getFD(), message.c_str(), message.size());
if (written != message.size()) throw std::logic_error("writing to the socket failed");
+ // TODO: partial writes, repeat
}
const std::string receive() override {