From 837b134087deeead3b244230687227e4accfc0d0 Mon Sep 17 00:00:00 2001 From: R Date: Tue, 9 Feb 2021 23:02:05 -0500 Subject: [PATCH] Initial push --- CMakeLists.txt | 6 + client.cpp | 83 +++++++++++++ cmake-build-debug/Project_1 | Bin 0 -> 652486 bytes cmake-build-debug/Project_1.cbp | 97 +++++++++++++++ event.h | 24 ++++ linux.h | 8 ++ main.cpp | 207 ++++++++++++++++++++++++++++++++ osyncstream.h | 64 ++++++++++ server.h | 112 +++++++++++++++++ sockets.cpp | 112 +++++++++++++++++ sockets.h | 63 ++++++++++ switch_expression.h | 21 ++++ user_input.h | 42 +++++++ windows.h | 12 ++ 14 files changed, 851 insertions(+) create mode 100644 CMakeLists.txt create mode 100755 client.cpp create mode 100755 cmake-build-debug/Project_1 create mode 100644 cmake-build-debug/Project_1.cbp create mode 100755 event.h create mode 100755 linux.h create mode 100644 main.cpp create mode 100755 osyncstream.h create mode 100755 server.h create mode 100755 sockets.cpp create mode 100755 sockets.h create mode 100644 switch_expression.h create mode 100755 user_input.h create mode 100755 windows.h diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..e8ede7c --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,6 @@ +cmake_minimum_required(VERSION 3.17) +project(Project_1) + +set(CMAKE_CXX_STANDARD 17) + +add_executable(Project_1 main.cpp sockets.cpp switch_expression.h) \ No newline at end of file diff --git a/client.cpp b/client.cpp new file mode 100755 index 0000000..6f25323 --- /dev/null +++ b/client.cpp @@ -0,0 +1,83 @@ +#include +#include +#include +#include +#include +#include +#include +#define max_buffer 1024 +#define PORT 666 +#define SOCKET int + + std::queue message_queue_{}; + auto ufnk(const SOCKET socket)->std::string + { + if (!message_queue_.empty()) + { + auto message = message_queue_.front(); + message_queue_.pop(); + return message; + } + std::string data; + char message_buffer[max_buffer] = { 0 }; + auto length = max_buffer; + while (length == max_buffer) + { + length = ::recv(socket, message_buffer, max_buffer, 0); + for (auto i = 0; i < length; ++i) + if(message_buffer[i]) /*append until null.*/ + { + data += message_buffer[i]; + } + else + { + message_queue_.push(data); + data.clear(); + } + } + if (message_queue_.empty()) + return ""; + return ufnk(socket); //recurse. + } + + +int main(int argc, char const *argv[]) +{ + int sock = 0, valread = 1; + struct sockaddr_in serv_addr; + char *hello = "4"; + char buffer[1024] = {0}; + if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) + { + printf("\n Socket creation error \n"); + return -1; + } + + serv_addr.sin_family = AF_INET; + serv_addr.sin_port = htons(PORT); + + // Convert IPv4 and IPv6 addresses from text to binary form + if(inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr)<=0) + { + printf("\nInvalid address/ Address not supported \n"); + return -1; + } + + if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) + { + printf("\nConnection Failed \n"); + return -1; + } + send(sock , hello , strlen(hello)+1 , 0 ); + printf("sent date command\n"); + + + while(true) + { + auto text = ufnk(sock); + if (text == "") + break; + printf("%s\n", text.c_str()); + } + return 0; +} diff --git a/cmake-build-debug/Project_1 b/cmake-build-debug/Project_1 new file mode 100755 index 0000000000000000000000000000000000000000..be1f747bb9a866b0d96233ff756a937e97530c8b GIT binary patch literal 652486 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

g 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%0D&%Tzw}ksI{zB{=kHa%^y{ZF1Kj(oo3$< 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

alPYt`I=ecVmJBhcHpR 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 + + + + + diff --git a/event.h b/event.h new file mode 100755 index 0000000..a5036c1 --- /dev/null +++ b/event.h @@ -0,0 +1,24 @@ +#pragma once +#include + +template +class event +{ + std::vector > callbacks; +public: + auto operator+=(std::function callback) -> event& + { + callbacks.emplace_back(callback); + return *this; + } + auto reset() -> void + { + callbacks.clear(); + } + auto execute(T... data) -> void + { + for (auto& callback : callbacks) + if (callback(data...)) /* true = handled... */ + break; + } +}; diff --git a/linux.h b/linux.h new file mode 100755 index 0000000..058ecf2 --- /dev/null +++ b/linux.h @@ -0,0 +1,8 @@ +#pragma once +#include +#include +#include +#include +#define SOCKET_ERROR -1 +#define INVALID_SOCKET 0 +typedef int SOCKET; \ No newline at end of file diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..05385c1 --- /dev/null +++ b/main.cpp @@ -0,0 +1,207 @@ +#if WIN32 +#define NOMINMAX +#endif +#include "sockets.h" +#include "user_input.h" +#include +#include "server.h" +#include "osyncstream.h" +#include "switch_expression.h" + +/* + * + auto server(const addrinfo_up& address) noexcept -> void +{ + + const auto socket = net::socket(AF_INET, SOCK_STREAM, 0); + net::bind(socket, address); + net::listen(socket); + std::cout << "[ Server Started ]" << std::endl; + + //below needs update. + do + { + auto const client = accept(socket, nullptr, nullptr); + if (!client) + continue; + printf("Got a client.\n"); + + + auto operation = net::recv(client); + try + { + switch (std::stoi(operation)) + { + case 1: + net::send(client, net::system("date /t")); + break; + case 4: + net::send(client, net::system("netstat -ant")); + break; + default: + net::send(client, "INVALID INPUT!"); + break; + } + } + catch (std::exception&) + { + net::send(client, "INVALID INPUT!"); + } + net::send(client, "<=> T123 <=>"); + net::closesocket(client); + printf("Closed Client\n"); + + } while (true); +} + +auto client(const addrinfo_up& address) noexcept -> void +{ + while(true) + { + const auto operation = get_input("Select Command:\n\t1. Date", ""); + const auto total_clients = get_input("Input Number of Clients: ", ""); + + std::vector threads; + + for(auto i = 0u; i < total_clients; ++i) + { + const auto prefix = "[client " + std::to_string(i) + "]: "; + try + { + threads.emplace_back(std::thread([=, &address]() + { + sscout << prefix << "started" << std::endl; + const auto socket = net::socket(AF_INET, SOCK_STREAM, 0); + net::connect(socket, address); + net::send(socket, std::to_string(operation)); + sscout << prefix << "sent command" << std::endl; + const auto& response = net::recv(socket); + sscout << prefix << "got response\n" << prefix << response << std::endl; + net::closesocket(socket); + sscout << prefix << "closed" << std::endl; + })); + } + catch (std::exception&) { sscout << prefix << " failed to init " << std::endl; } + } + for (auto& thread : threads) + thread.join(); + } +} + + + * + */ + +bool onClientConnected(networked& client) +{ + sscout << "Accepted Client on Server.\n"; + + using namespace std::chrono_literals; + auto start = std::chrono::high_resolution_clock::now(); + //std::this_thread::sleep_for(2000ms); + + return true; +} +auto onClientMessaged(networked& client, std::string& message) +{ + sscout << "message was " << message << "\n"; + + client.send_message("thanks for the message!"); + client.disconnect(); + return true; +} + +inline auto resolve_selection(const int selection) -> std::string +{ + if (selection == 1) + return "Server"; + else if (selection == 2) + return "Client"; + return ""; +} + +int main() +{ + net::prologue(); + const auto mode = get_input("Select Mode\n\t1. Server\n\t2. Client\n>:","Invalid Choice!",math::is_between<0,3>); + while (true) + { + std::string ipaddress{}; + std::uint16_t port{}; + if (mode == 1) + ipaddress = "0.0.0.0"; + else + ipaddress = get_input("Enter IP: "); + port = get_input("Enter Port:"); + sscout << resolve_selection(mode) << " selected, ip/port is " << ipaddress << "/" << port << ".\n"; + if (mode == 2) + { + client net_client{}; + net_client.message_received += [](std::string& what){ + sscout << "GOT " << what << ".\n"; + return true; + }; + if(net_client.connect(ipaddress, port)) + { + net_client.send_message("!Hello!\n"); + net_client.send_message("Second Message\n"); + net_client.send_message("Final Message!\n"); + while(net_client.is_valid()){} + } + else + { + sscout << "NO NET\n"; + } + net_client.disconnect(); + } + } + + + auto listen_server = []() + { + server srv{}; + srv.client_connected += onClientConnected; + srv.message_received += onClientMessaged; + auto thread = srv.listen("0.0.0.0", 80); + if(thread.joinable()) + { + thread.join(); + }else{ + sscout << "Thread is bad!\n"; + } + }; + + net::epilogue(); + return 0; +/* + * + const auto selection = get_input("Select Mode\n\t1. Server\n\t2. Client\n>:", "Invalid Choice!", [](const auto x) {return x > 0 && x < 3; }); + + auto address = std::string("0.0.0.0"); + auto port = 0_p; + addrinfo_up address_binding{}; + while(!address_binding.get()) + { + if (selection == 2) + address = get_input("Enter Remote IP (aaa.bbb.ccc.ddd): ", ""); + port = get_input("Enter Port: ", ""); + address_binding = net::getaddrinfo(address, std::to_string(port)); + } + + try + { + std::cout << "You have selected " << (selection == 1 ? "Server" : "Client") << std::endl; + std::cout << "Address: " << address << ":" << port << std::endl; + }catch(std::exception&){} + + + if (selection == 2) + client(address_binding); + else + listen_server(address_binding); + * + */ + net::epilogue(); +} + + diff --git a/osyncstream.h b/osyncstream.h new file mode 100755 index 0000000..e7c5454 --- /dev/null +++ b/osyncstream.h @@ -0,0 +1,64 @@ +/* + * osyncstream - A wrapper around ostream that properly locks while consuming stream operators + * Copyright Riley Strickland 2021 + */ +#pragma once +#include +#include +#include + +class osyncstream_locked final +{ + std::unique_lock lock_; + std::ostream& stream_; +public: + osyncstream_locked(std::recursive_mutex& mtx, std::ostream& stream) : lock_(mtx), stream_(stream) {} //construct and lock the mutex from osyncstream. + osyncstream_locked(const osyncstream_locked& o) = delete; + /* A recursive mutex isn't great here (reference forwarding would be better except...only a recursive mutex can assure lock-before-release on ownership transfer */ + template + friend auto operator<<(osyncstream_locked&& os, const T& d) -> osyncstream_locked&& + { + os.stream_ << d; + return std::move(os); /* move semantics :( ... thanks Clang/GCC */ + } + friend auto operator<<(osyncstream_locked&& os, std::ostream& (*func)(std::ostream&)) -> std::ostream& + { + return os.stream_ << func; + } + osyncstream_locked(osyncstream_locked&& o) noexcept : osyncstream_locked(*o.lock_.mutex(), o.stream_) {} //could be better... max depth 2, usual depth 1. + osyncstream_locked& operator=(osyncstream_locked&) = delete; //disallow + osyncstream_locked& operator=(osyncstream_locked&&) = delete; //disallow + ~osyncstream_locked() = default; +}; + +class osyncstream final +{ + std::recursive_mutex mutex_{}; + std::ostream& stream_; +public: + explicit osyncstream(std::ostream& stream) : stream_(stream) {} + template + friend auto operator<<(osyncstream& os, const T& d) -> osyncstream_locked + { + std::unique_lock lock(os.mutex_); + os.stream_ << d; + return osyncstream_locked { os.mutex_, os.stream_ }; + } + friend auto operator<<(osyncstream& os, std::ostream& (*func)(std::ostream&)) -> osyncstream_locked + { + std::unique_lock lock(os.mutex_); + os.stream_ << func; + return osyncstream_locked{ os.mutex_, os.stream_ }; + } +}; + +struct streams +{ + static std::ostream& cout; + static std::ostream& cerr; +}; + +inline std::ostream& streams::cout = std::cout; +inline std::ostream& streams::cerr = std::cerr; +inline osyncstream sscout(streams::cout); +inline osyncstream sscerr(streams::cerr); \ No newline at end of file diff --git a/server.h b/server.h new file mode 100755 index 0000000..0fda599 --- /dev/null +++ b/server.h @@ -0,0 +1,112 @@ +#pragma once +#include "sockets.h" +#include "event.h" +#include + +#include "osyncstream.h" + +class networked +{ +protected: + SOCKET socket; +public: + explicit networked(SOCKET existing) + { + socket = existing; + } + auto disconnect() -> void + { + if (!is_valid()) return; //socket is closed. + net::closesocket(socket); + socket = INVALID_SOCKET; + } + [[nodiscard]] auto receive_message() const -> std::string { if (!is_valid()) return ""; return net::recv(socket); } + auto send_message(const std::string& message) const -> void { if (!is_valid()) return; net::send(socket, message);} + [[nodiscard]] auto is_valid() const -> bool { return socket != INVALID_SOCKET; } +}; + + +class client : public networked +{ + auto accept_message() -> void //add const later + { + while(is_valid()) /* Accept all messages */ + { + auto message = receive_message(); + if (message.empty() && is_valid()) + { + sscout << "Server Connection Lost\n"; + disconnect(); + break; + } + message_received.execute(message); + } + } +public: + event message_received {}; + explicit client() : networked(net::socket(AF_INET, SOCK_STREAM, 0)){} + auto connect(const std::string& ip, const port port) -> bool + { + const auto address = net::getaddrinfo(ip, std::to_string(port)); + auto remote_address = net::getaddrinfo(ip, std::to_string(port)); + if (net::connect(socket, remote_address) < 0) + return false; + std::thread(&client::accept_message, this).detach(); + return true; + } +}; + +class server : networked +{ + auto accept_clients() -> void + { + while(is_valid()) + { + auto client = networked(accept(socket, nullptr, nullptr)); + client_connected.execute(client); +#ifdef THREADED + std::thread(&server::accept_client_message, this, client).detach(); +#else + std::thread(&server::accept_client_message, this, client).join(); +#endif + } + } + + auto accept_client_message(networked client) -> void //add const later + { + using namespace std::chrono_literals; + std::this_thread::sleep_for(2000ms); + while(client.is_valid()) /* Accept all messages */ + { + auto message = client.receive_message(); + if (message.empty() && client.is_valid()) //Client could have disconnected after check but PRIOR to recv. + { + sscout << "Client Connection Lost\n"; + client.disconnect(); + break; + } + message_received.execute(client, message); + } + } + +public: + event client_connected {}; + event message_received {}; + auto listen(const std::string& ip, const port port) -> std::thread + { + const auto address = net::getaddrinfo(ip, std::to_string(port)); + if (net::bind(socket, address) < 0) + { + sscout << "Error binding.\n"; + return std::thread(); + } + if (net::listen(socket) < 0) + { + sscout << "Error listening.\n"; + return std::thread(); + } + sscout << "Listening ... \n"; + return std::thread(&server::accept_clients, this); + } + explicit server() : networked(net::socket(AF_INET, SOCK_STREAM, 0)){} +}; diff --git a/sockets.cpp b/sockets.cpp new file mode 100755 index 0000000..e0eebcb --- /dev/null +++ b/sockets.cpp @@ -0,0 +1,112 @@ +#include "sockets.h" +#include "osyncstream.h" +#include +#include +#include +#include + + +constexpr auto max_buffer = 1024; +decltype(net::message_queue) net::message_queue{}; + + +auto net::recv(const SOCKET socket) noexcept -> std::string +{ + static std::recursive_mutex mutex{}; //allows for multiple thread access to our recv. + std::unique_lock lock(mutex); + try + { + auto& my_queue = message_queue[socket]; + if (!my_queue.empty()) + { + std::string message = my_queue.front(); // ReSharper disable All Just shut up resharper. I would use auto here normally, but the linter wants to make message a reference.....even though it won't be valid next line. + my_queue.pop(); + lock.unlock(); + return message; + } + lock.unlock(); //release lock so as to not deadlock on recv. + std::string data; + auto length = max_buffer; + while (length == max_buffer) /* queue all future messages from the stream */ + { + char message_buffer[max_buffer] = { 0 }; + + length = ::recv(socket, message_buffer, max_buffer, 0); + if (length < 0) + throw std::runtime_error("Closed Socket"); + for (auto i = 0; i < length; ++i) + if (message_buffer[i]) /*append until null. [free message framing ;)]*/ + { + data += message_buffer[i]; + } + else + { + lock.lock(); + my_queue.push(data); + data.clear(); + lock.unlock(); + } + } + + if(!data.empty()) //improperly terminated message, don't drop it! + { + lock.lock(); + my_queue.push(data); + data.clear(); + lock.unlock(); + } + if (my_queue.empty()) /* empty response */ + { + return ""; + } + return recv(socket); //recurse. + }catch(std::exception& err) /* shouldn't happen. */ + { + return {}; //empty + } +} +auto net::system(const std::string& command) noexcept -> std::string +{ + try + { + std::array output{ 0 }; //size is arbitrary + std::string data{}; + const popen_up pipe(popen(command.c_str(), "r")); + if (!pipe) + return ""; + while (fgets(output.data(), output.size(), pipe.get()) != nullptr) + data += output.data(); + return data; + }catch(std::exception&) + { + return ""; + } +} + +#if WIN32 +auto net::closesocket(const SOCKET socket) noexcept -> unsigned +{ + message_queue.erase(socket); + return ::closesocket(socket); +} +auto net::prologue() noexcept -> void +{ + WSADATA wsa_data; + const auto result = WSAStartup(win_sock_ver, &wsa_data); + if (result) + { + std::cout << "FATAL ERROR IN PROLOGUE " << result << std::endl; + exit(-1); + } +} +auto net::epilogue() noexcept -> void { WSACleanup(); } + +#else +auto net::closesocket(const SOCKET socket) noexcept -> unsigned +{ + message_queue.erase(socket); + return close(socket); +} +auto net::prologue() noexcept -> void {} //not required on Linux. +auto net::epilogue() noexcept -> void {} //not required on Linux. +#endif \ No newline at end of file diff --git a/sockets.h b/sockets.h new file mode 100755 index 0000000..7e9443a --- /dev/null +++ b/sockets.h @@ -0,0 +1,63 @@ +#pragma once +#if WIN32 +#include "windows.h" +#else +#include "linux.h" +#endif +#include +#include +#include +#include +#include +#include +#include + +typedef std::uint16_t port; +inline port operator "" _p(const unsigned long long value) { return static_cast(value); } + +struct addrinfo_up_deleter { void operator()(addrinfo* ptr) const { ::freeaddrinfo(ptr); } }; +typedef std::unique_ptr addrinfo_up; /* Modern C++ shared pointer for addrinfo. */ + +struct popen_up_deleter { void operator()(FILE* ptr) const { pclose(ptr); } }; +typedef std::unique_ptr popen_up; /* Modern C++ shared pointer for popen. */ + +class net +{ + // ReSharper disable once CppInconsistentNaming + static std::unordered_map> message_queue; +public: + /* inlined functions*/ + static auto bind(SOCKET socket, const addrinfo_up& address) noexcept -> int + { + return ::bind(socket, address->ai_addr, address->ai_addrlen); + } + static auto connect(SOCKET socket, const addrinfo_up& address) noexcept -> int + { + return ::connect(socket, address->ai_addr, address->ai_addrlen); + } + static auto getaddrinfo(const std::string& address, const std::string& port) noexcept -> addrinfo_up + { + addrinfo* result{}; + addrinfo hints{}; + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_INET; + hints.ai_socktype = SOCK_STREAM; + hints.ai_protocol = IPPROTO_TCP; + hints.ai_flags = AI_PASSIVE; + ::getaddrinfo(address.c_str(), port.c_str(), &hints, &result); + return addrinfo_up(result); + } + static auto listen(const SOCKET socket) noexcept -> int { return ::listen(socket, SOMAXCONN); } + static auto send(SOCKET socket, const std::string& message) noexcept -> unsigned + { + return ::send(socket, message.c_str(), static_cast(message.length() + 1u), MSG_NOSIGNAL); //make sure to include null terminator, this is our delim. + } + static auto socket(int af, int type, int protocol) noexcept -> SOCKET { return ::socket(af, type, protocol); } + /* extern functions */ + static void prologue() noexcept; + static void epilogue() noexcept; + static auto closesocket(const SOCKET socket) noexcept -> unsigned; + static auto recv(SOCKET socket) noexcept -> std::string; + static auto system(const std::string& command) noexcept -> std::string; + +}; diff --git a/switch_expression.h b/switch_expression.h new file mode 100644 index 0000000..4a3193d --- /dev/null +++ b/switch_expression.h @@ -0,0 +1,21 @@ +#pragma once + +#include + +template +void on(T what, std::tuple> match) +{ + auto [a,b] = match; + if (what == a) + b; +} + +template +void on(T what, std::tuple> match, std::tuple> others) +{ + auto [a,b] = match; + if (what == a) + b; + else + on(what, others); +} \ No newline at end of file diff --git a/user_input.h b/user_input.h new file mode 100755 index 0000000..c32b685 --- /dev/null +++ b/user_input.h @@ -0,0 +1,42 @@ +#pragma once +#include +#include +#include +#include +#include + + +constexpr auto all = std::numeric_limits::max(); + +namespace math +{ + template::value, bool> = true> + constexpr auto is_between(typeof(lb) x) -> bool { return (ub > x) && (x > lb); } +} + +template +T get_input(const std::string& prompt, const std::string& on_error, std::function validator) noexcept +{ + T user_input{}; + try + { + while (true) + { + printf("%s", prompt.c_str()); + std::cin >> user_input; + if (std::cin.fail() || !validator(user_input)) + { + std::cout << on_error << std::endl; + std::cin.clear(); + std::cin.ignore(all, '\n'); + continue; + } + break; + } + return user_input; + } + catch (std::exception&) { return user_input; } /* This should not happen ..... cin/cout are not configured to throw...*/ +} + +template +T get_input(const std::string& prompt) { return get_input(prompt, "", [](auto) {return true; }); } \ No newline at end of file diff --git a/windows.h b/windows.h new file mode 100755 index 0000000..b08920d --- /dev/null +++ b/windows.h @@ -0,0 +1,12 @@ +#pragma once +// ReSharper disable CppInconsistentNaming, cppcoreguidelines-macro-usage +#define popen _popen +#define pclose _pclose +#define WIN32_LEAN_AND_MEAN +#define NOMINMAX +// ReSharper restore CppInconsistentNaming, cppcoreguidelines-macro-usage +#include +#include +#include +#pragma comment(lib, "Ws2_32.lib") +constexpr auto win_sock_ver = 514; //2.2 \ No newline at end of file