From 98ba9fd332c2eba4d9a4916efda4db43bb9df7ac Mon Sep 17 00:00:00 2001 From: Benny Baumann <BenBE@geshi.org> Date: Sun, 3 Jan 2021 16:25:25 +0100 Subject: [PATCH] chg: Use auto_fd as early as possible --- src/net/tcp_server_socket.cpp | 37 +++++++++++++++++++++-------------- src/net/tcp_server_socket.hpp | 2 +- 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/src/net/tcp_server_socket.cpp b/src/net/tcp_server_socket.cpp index 7a555c2..0af3789 100644 --- a/src/net/tcp_server_socket.cpp +++ b/src/net/tcp_server_socket.cpp @@ -4,53 +4,60 @@ * Created on: 02.01.2021 * Author: doralitze */ - #include "net/tcp_server_socket.hpp" -#include <arpa/inet.h> -#include <unistd.h> #include <fcntl.h> -#include <functional> #include <stdlib.h> #include <string.h> +#include <unistd.h> + +#include <arpa/inet.h> + #include <sys/types.h> #include <sys/socket.h> #include <sys/stat.h> #include <netinet/in.h> +#include <functional> + #include "macros.hpp" +#include "net/socketaddress.hpp" namespace rmrf::net { tcp_server_socket::tcp_server_socket(uint16_t port, incoming_client_listener_type client_listener_) : ss{nullptr}, client_listener(client_listener_), number_of_connected_clients(0) { - auto raw_socket_fd = socket(AF_INET, SOCK_STREAM, 0); - if(raw_socket_fd < 0) { + auto_fd raw_socket_fd{socket(AF_INET6, SOCK_STREAM, 0)}; + if(!raw_socket_fd.valid()) { // TODO implement propper error handling throw netio_exception("Failed to create socket fd."); } - struct sockaddr_in addr; - addr.sin_family = AF_INET; - addr.sin_port = htons(port); - addr.sin_addr.s_addr = INADDR_ANY; // TODO FIXME - if (bind(raw_socket_fd, (struct sockaddr *) &addr, sizeof(addr)) != 0) { + sockaddr_in6 addr; + addr.sin6_family = AF_INET6; + addr.sin6_port = htons(port); + addr.sin6_addr = IN6ADDR_ANY_INIT; + socketaddr sa{addr}; + + if (bind(raw_socket_fd.get(), sa.ptr(), sa.size()) != 0) { std::string msg = "Failed to bind to all addresses (FIXME)"; if (port < 1024) { - msg += "\tYou tried to bind to a port smaller than 1024. Are you root?"; + msg += "\nYou tried to bind to a port smaller than 1024. Are you root?"; } + throw netio_exception(msg); } // Append the non blocking flag to the file state of the socket fd. // This might be linux only. We should check that - fcntl(raw_socket_fd, F_SETFL, fcntl(raw_socket_fd, F_GETFL, 0) | O_NONBLOCK); - if (listen(raw_socket_fd, 5) == -1) { + fcntl(raw_socket_fd.get(), F_SETFL, fcntl(raw_socket_fd.get(), F_GETFL, 0) | O_NONBLOCK); + if (listen(raw_socket_fd.get(), 5) == -1) { throw netio_exception("Failed to enable listening mode for raw socket"); } - this->ss = std::make_shared<async_server_socket>(auto_fd(raw_socket_fd)); + this->ss = std::make_shared<async_server_socket>(std::forward<auto_fd>(raw_socket_fd)); + using namespace std::placeholders; this->ss->set_accept_handler(std::bind(&tcp_server_socket::await_raw_socket_incomming, this, _1, _2)); } diff --git a/src/net/tcp_server_socket.hpp b/src/net/tcp_server_socket.hpp index 1c28fa4..a011b6a 100644 --- a/src/net/tcp_server_socket.hpp +++ b/src/net/tcp_server_socket.hpp @@ -20,7 +20,7 @@ class tcp_server_socket : public std::enable_shared_from_this<tcp_server_socket> public: typedef std::function<void(tcp_client)> incoming_client_listener_type; private: - std::shared_ptr<async_server_socket> ss; + async_server_socket::self_ptr_type ss; incoming_client_listener_type client_listener; int number_of_connected_clients; public: -- GitLab