diff --git a/Client/src/client.cpp b/Client/src/client.cpp index 3302816..71bf1fb 100644 --- a/Client/src/client.cpp +++ b/Client/src/client.cpp @@ -11,5 +11,4 @@ int main() { sock.connect(serveraddr); spdlog::info("Connection established from {}, {}", sock, (std::string)serveraddr); - sleep(10); } \ No newline at end of file diff --git a/Server/include/ServerController.hpp b/Server/include/ServerController.hpp new file mode 100644 index 0000000..3f59c93 --- /dev/null +++ b/Server/include/ServerController.hpp @@ -0,0 +1,2 @@ +#pragma once + diff --git a/Server/src/server.cpp b/Server/src/server.cpp index 825ea30..77be6cb 100644 --- a/Server/src/server.cpp +++ b/Server/src/server.cpp @@ -16,23 +16,20 @@ int main() { struct Chattr::TCPSocket sock; struct Chattr::Address serveraddr; + struct Chattr::TCPSocket clientSock; + struct Chattr::Address clientAddr; if (config.ipVersion == 4) { sock.init(AF_INET); serveraddr.set(AF_INET, INADDR_ANY, config.listenPort); + clientAddr.setType(AF_INET); } else if (config.ipVersion == 6) { sock.init(AF_INET6); serveraddr.set(AF_INET6, in6addr_any, config.listenPort); + clientAddr.setType(AF_INET6); } sock.bind(&serveraddr.addr, serveraddr.length); sock.listen(SOMAXCONN); - struct Chattr::TCPSocket clientSock; - struct Chattr::Address clientAddr; - - if (config.ipVersion == 4) - clientAddr.length = sizeof(sockaddr_in); - else - clientAddr.length = sizeof(sockaddr_in6); while (true) { spdlog::info("Waiting for connection..."); diff --git a/impl/Socket/Address.cpp b/impl/Socket/Address.cpp new file mode 100644 index 0000000..6d72137 --- /dev/null +++ b/impl/Socket/Address.cpp @@ -0,0 +1,109 @@ +#include "Socket/Address.hpp" +#include "precomp.hpp" +#include + +namespace Chattr { + +Address::Address() { + zeroFill(); +} + +Address::Address(int type, gsl::czstring presentationAddr, std::uint16_t port) { + set(type, presentationAddr, port); +} + +void Address::zeroFill() { + memset(&addr_in6, 0, sizeof(addr_in6)); +} + +void Address::set(int type, gsl::czstring presentationAddr, std::uint16_t port) { + zeroFill(); + + if (type == AF_INET) { + addr_in.sin_family = AF_INET; + ::inet_pton(AF_INET, presentationAddr, &addr_in.sin_addr); + addr_in.sin_port = htons(port); + length = sizeof(sockaddr_in); + } + else if (type == AF_INET6) { + addr_in6.sin6_family = AF_INET6; + ::inet_pton(AF_INET6, presentationAddr, &addr_in6.sin6_addr); + addr_in6.sin6_port = htons(port); + length = sizeof(sockaddr_in6); + } +} + +void Address::set(int type, in_addr_t addr, std::uint16_t port) { + zeroFill(); + + if (type == AF_INET) { + addr_in.sin_family = AF_INET; + addr_in.sin_addr.s_addr = htonl(addr); + addr_in.sin_port = htons(port); + length = sizeof(sockaddr_in); + } +} + +void Address::set(int type, in_addr addr, std::uint16_t port) { + zeroFill(); + + if (type == AF_INET) { + addr_in.sin_family = AF_INET; + addr_in.sin_addr = addr; + addr_in.sin_port = htons(port); + length = sizeof(sockaddr_in); + } +} + +void Address::set(int type, in6_addr addr, std::uint16_t port) { + zeroFill(); + + if (type == AF_INET6) { + addr_in6.sin6_family = AF_INET6; + addr_in6.sin6_addr = addr; + addr_in6.sin6_port = htons(port); + length = sizeof(sockaddr_in6); + } +} + +void Address::setType(int type) { + zeroFill(); + + if (type == AF_INET) + length = sizeof(sockaddr_in); + else if (type == AF_INET6) + length = sizeof(sockaddr_in6); +} + +Address::operator std::string() { + std::optional port = getPort(); + + if (!port) + return std::string(); + + if (length == sizeof(addr_in)) { + char addrStr[INET_ADDRSTRLEN]; + ::inet_ntop(AF_INET, &addr_in.sin_addr, addrStr, sizeof(addrStr)); + + return std::format("{}:{}", addrStr, port.value()); + } + else if (length == sizeof(addr_in6)) { + char addrStr[INET6_ADDRSTRLEN]; + ::inet_ntop(AF_INET6, &addr_in6.sin6_addr, addrStr, sizeof(addrStr)); + + return std::format("{}:{}", addrStr, port.value()); + } + + return std::string(); +} + +std::optional Address::getPort() { + if (length == sizeof(addr_in)) + return ntohs(addr_in.sin_port); + else if (length == sizeof(addr_in6)) + return ntohs(addr_in6.sin6_port); + else + return std::nullopt; +} + +} \ No newline at end of file diff --git a/impl/Socket/WSAManager.cpp b/impl/Socket/WSAManager.cpp new file mode 100644 index 0000000..d3bc555 --- /dev/null +++ b/impl/Socket/WSAManager.cpp @@ -0,0 +1,21 @@ +#include "Socket/WSAManager.hpp" +#include "Socket/Log.hpp" + +#include "precomp.hpp" + +namespace Chattr { +WSAManager::WSAManager() { +#ifdef _WIN32 + WSADATA wsa; + if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) + log::critical("WSAStartup()"); +#endif +} + +WSAManager::~WSAManager() { +#ifdef _WIN32 + WSACleanup(); +#endif +} + +} \ No newline at end of file diff --git a/impl/Utils/StringTokenizer.cpp b/impl/Utils/StringTokenizer.cpp new file mode 100644 index 0000000..b8a930f --- /dev/null +++ b/impl/Utils/StringTokenizer.cpp @@ -0,0 +1,82 @@ +#pragma once +#include "Utils/StringTokenizer.hpp" + +namespace Chattr { + +StringTokenizer::StringTokenizer(gsl::czstring string, std::uint32_t size) { + set(string, size); +} + +void StringTokenizer::set(gsl::czstring string, std::uint32_t size) { + int length = 0; + bool token = false; + bool quote = false, doubleQuote = false; + + for (int i = 0; i < size; i++) { + if (string[i] == ' ' && token != true) + continue; + + if (token == false) + tokens.push(&string[i]); + token = true; + + switch (string[i]) { + case '\"': + doubleQuote = !doubleQuote; + length++; + break; + case '\'': + quote = !quote; + length++; + break; + case '\t': + case '\n': + case ' ': + if (quote || doubleQuote) { + length++; + break; + } + tokens_length.push(length); + length = 0; + token = false; + break; + case '\0': + tokens_length.push(length); + length = 0; + break; + default: + length++; + } + } + + if (quote || doubleQuote) { + spdlog::error("quote or doublequote is not closed"); + tokens = std::queue(); + tokens_length = std::queue(); + } + + if (length != 0) + tokens_length.push(length); +} + +std::vector StringTokenizer::get() { + std::vector retValue; + + while (!tokens.empty()) { + if (tokens_length.front() != 0) + retValue.push_back(std::string(tokens.front(), tokens_length.front())); + tokens.pop(); + tokens_length.pop(); + } + + while (!tokens_length.empty()) + tokens_length.pop(); + + return retValue; +} + +StringTokenizer::operator std::vector() { + return get(); +} + +} \ No newline at end of file diff --git a/include/Socket/Address.hpp b/include/Socket/Address.hpp index a0a4391..5340479 100644 --- a/include/Socket/Address.hpp +++ b/include/Socket/Address.hpp @@ -1,100 +1,20 @@ #pragma once -#include "precomp.hpp" -#include namespace Chattr { struct Address { - Address() { - zeroFill(); - } + Address(); + Address(int type, gsl::czstring presentationAddr, std::uint16_t port); - Address(int type, gsl::czstring presentationAddr, std::uint16_t port) { - set(type, presentationAddr, port); - } + void zeroFill(); + void set(int type, gsl::czstring presentationAddr, std::uint16_t port); + void set(int type, in_addr_t addr, std::uint16_t port); + void set(int type, in_addr addr, std::uint16_t port); + void set(int type, in6_addr addr, std::uint16_t port); + void setType(int type); - void zeroFill() { - memset(&addr_in6, 0, sizeof(addr_in6)); - } - - void set(int type, gsl::czstring presentationAddr, std::uint16_t port) { - zeroFill(); - - if (type == AF_INET) { - addr_in.sin_family = AF_INET; - ::inet_pton(AF_INET, presentationAddr, &addr_in.sin_addr); - addr_in.sin_port = htons(port); - length = sizeof(sockaddr_in); - } else if (type == AF_INET6) { - addr_in6.sin6_family = AF_INET6; - ::inet_pton(AF_INET6, presentationAddr, &addr_in6.sin6_addr); - addr_in6.sin6_port = htons(port); - length = sizeof(sockaddr_in6); - } - } - - void set(int type, in_addr_t addr, std::uint16_t port) { - zeroFill(); - - if (type == AF_INET) { - addr_in.sin_family = AF_INET; - addr_in.sin_addr.s_addr = htonl(addr); - addr_in.sin_port = htons(port); - length = sizeof(sockaddr_in); - } - } - - void set(int type, in_addr addr, std::uint16_t port) { - zeroFill(); - - if (type == AF_INET) { - addr_in.sin_family = AF_INET; - addr_in.sin_addr = addr; - addr_in.sin_port = htons(port); - length = sizeof(sockaddr_in); - } - } - - void set(int type, in6_addr addr, std::uint16_t port) { - zeroFill(); - - if (type == AF_INET6) { - addr_in6.sin6_family = AF_INET6; - addr_in6.sin6_addr = addr; - addr_in6.sin6_port = htons(port); - length = sizeof(sockaddr_in6); - } - } - - operator std::string() { - std::optional port = getPort(); - - if (!port) - return std::string(); - - if (length == sizeof(addr_in)) { - char addrStr[INET_ADDRSTRLEN]; - ::inet_ntop(AF_INET, &addr_in.sin_addr, addrStr, sizeof(addrStr)); - - return std::format("{}:{}", addrStr, port.value()); - } else if (length == sizeof(addr_in6)) { - char addrStr[INET6_ADDRSTRLEN]; - ::inet_ntop(AF_INET6, &addr_in6.sin6_addr, addrStr, sizeof(addrStr)); - - return std::format("{}:{}", addrStr, port.value()); - } - - return std::string(); - } - - std::optional getPort() { - if (length == sizeof(addr_in)) - return ntohs(addr_in.sin_port); - else if (length == sizeof(addr_in6)) - return ntohs(addr_in6.sin6_port); - else - return std::nullopt; - } + operator std::string(); + std::optional getPort(); union { struct sockaddr addr; diff --git a/include/Socket/Log.hpp b/include/Socket/Log.hpp index b8ece9c..2b45816 100644 --- a/include/Socket/Log.hpp +++ b/include/Socket/Log.hpp @@ -1,5 +1,4 @@ #pragma once -#include "precomp.hpp" namespace Chattr::log { void setDefaultLogger(spdlog::level::level_enum logLevel, gsl::czstring logFileName, std::uint32_t logFileSize, std::uint32_t logFileCount); diff --git a/include/Socket/Socket.hpp b/include/Socket/Socket.hpp index d4320d3..7fcb73f 100644 --- a/include/Socket/Socket.hpp +++ b/include/Socket/Socket.hpp @@ -1,9 +1,10 @@ #pragma once -#include "precomp.hpp" -#include "Address.hpp" +#include "Socket/Address.hpp" namespace Chattr { +struct Address; + class Socket { public: Socket() = default; diff --git a/include/Socket/TCPSocket.hpp b/include/Socket/TCPSocket.hpp index a39670e..3a53d54 100644 --- a/include/Socket/TCPSocket.hpp +++ b/include/Socket/TCPSocket.hpp @@ -1,6 +1,5 @@ #pragma once #include "Socket.hpp" -#include "precomp.hpp" namespace Chattr { diff --git a/include/Socket/WSAManager.hpp b/include/Socket/WSAManager.hpp index 1a8b180..07428f2 100644 --- a/include/Socket/WSAManager.hpp +++ b/include/Socket/WSAManager.hpp @@ -1,24 +1,10 @@ #pragma once -#include "precomp.hpp" -#include "Socket/Log.hpp" - namespace Chattr { + struct WSAManager { - - WSAManager() { -#ifdef _WIN32 - WSADATA wsa; - if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) - log::critical("WSAStartup()"); -#endif - } - - ~WSAManager() { -#ifdef _WIN32 - WSACleanup(); -#endif - } - + WSAManager(); + ~WSAManager(); }; + } \ No newline at end of file diff --git a/include/Utils/StringTokenizer.hpp b/include/Utils/StringTokenizer.hpp index 4213a4b..1e0439a 100644 --- a/include/Utils/StringTokenizer.hpp +++ b/include/Utils/StringTokenizer.hpp @@ -1,5 +1,4 @@ #pragma once -#include "precomp.hpp" #include namespace Chattr {