diff --git a/lesson_04/connection/connection.cpp b/lesson_04/connection/connection.cpp index f2c1a59..f00c4fb 100644 --- a/lesson_04/connection/connection.cpp +++ b/lesson_04/connection/connection.cpp @@ -10,7 +10,7 @@ namespace azh { - Connection::Connection(boost::asio::io_context &ioContext) : _socket(ioContext) + Connection::Connection(io::ip::tcp::socket&& socket) : _socket(std::move(socket)) { } @@ -43,8 +43,8 @@ namespace azh }); } - Connection::pointer Connection::create(boost::asio::io_context &ioContext) + Connection::pointer Connection::create(io::ip::tcp::socket&& socket) { - return pointer(new Connection(ioContext)); + return pointer(new Connection(std::move(socket))); } } diff --git a/lesson_04/connection/connection.hpp b/lesson_04/connection/connection.hpp index 7dd7e55..ea5a9dc 100644 --- a/lesson_04/connection/connection.hpp +++ b/lesson_04/connection/connection.hpp @@ -13,20 +13,21 @@ namespace azh { using boost::asio::ip::tcp; + namespace io = boost::asio; class Connection : public std::enable_shared_from_this { public: using pointer = std::shared_ptr; - static pointer create(boost::asio::io_context& ioContext); + static pointer create(io::ip::tcp::socket&& socket); tcp::socket& socket(); void start(); private: tcp::socket _socket; std::string _message = "Hello, client!\n"; private: - explicit Connection(boost::asio::io_context& ioContext); + explicit Connection(io::ip::tcp::socket&& socket); }; } diff --git a/lesson_04/server/tcp_server.cpp b/lesson_04/server/tcp_server.cpp index db90e6c..133d5ef 100644 --- a/lesson_04/server/tcp_server.cpp +++ b/lesson_04/server/tcp_server.cpp @@ -33,33 +33,25 @@ namespace azh return 0; } + void TCPServer::broadcast(const std::string& message) + { + + } + void TCPServer::startAccept() { - auto connection = Connection::create(_ioContext); + _socket.emplace(_ioContext); - _connections.push_back(connection); - - _acceptor.async_accept(connection->socket(), [connection, this](const boost::system::error_code &error) + _acceptor.async_accept(*_socket, [this](const boost::system::error_code &error) { + auto connection = Connection::create(std::move(*_socket)); + + _connections.insert(connection); + if (!error) connection->start(); startAccept(); }); } - - template - void writeToConnection(int connectionIndex, const T& message) - { - - } - - template - using listenCallback = std::function; - - template - void registerListenCallback(int connectionIndex, listenCallback callback) - { - - } } diff --git a/lesson_04/server/tcp_server.hpp b/lesson_04/server/tcp_server.hpp index 9d29a60..ec8fdbd 100644 --- a/lesson_04/server/tcp_server.hpp +++ b/lesson_04/server/tcp_server.hpp @@ -10,10 +10,13 @@ #include #include #include -#include +#include +#include namespace azh { + namespace io = boost::asio; + enum class IPV { V4, V6 @@ -26,20 +29,15 @@ namespace azh int run(); - template - void writeToConnection(int connectionIndex, const T& message); - - template - using listenCallback = std::function; - - template - void registerListenCallback(int connectionIndex, listenCallback callback); + void broadcast(const std::string& message); private: IPV _ipVersion; int _port; - boost::asio::io_context _ioContext; - boost::asio::ip::tcp::acceptor _acceptor; - std::vector _connections; + + io::io_context _ioContext; + io::ip::tcp::acceptor _acceptor; + std::optional _socket; + std::unordered_set _connections; private: void startAccept(); };