Skip to content
Snippets Groups Projects
Verified Commit 98ba9fd3 authored by Benny Baumann's avatar Benny Baumann
Browse files

chg: Use auto_fd as early as possible

parent e1142588
No related branches found
No related tags found
No related merge requests found
...@@ -4,53 +4,60 @@ ...@@ -4,53 +4,60 @@
* Created on: 02.01.2021 * Created on: 02.01.2021
* Author: doralitze * Author: doralitze
*/ */
#include "net/tcp_server_socket.hpp" #include "net/tcp_server_socket.hpp"
#include <arpa/inet.h>
#include <unistd.h>
#include <fcntl.h> #include <fcntl.h>
#include <functional>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <netinet/in.h> #include <netinet/in.h>
#include <functional>
#include "macros.hpp" #include "macros.hpp"
#include "net/socketaddress.hpp"
namespace rmrf::net { namespace rmrf::net {
tcp_server_socket::tcp_server_socket(uint16_t port, incoming_client_listener_type client_listener_) : 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) { ss{nullptr}, client_listener(client_listener_), number_of_connected_clients(0) {
auto raw_socket_fd = socket(AF_INET, SOCK_STREAM, 0); auto_fd raw_socket_fd{socket(AF_INET6, SOCK_STREAM, 0)};
if(raw_socket_fd < 0) { if(!raw_socket_fd.valid()) {
// TODO implement propper error handling // TODO implement propper error handling
throw netio_exception("Failed to create socket fd."); throw netio_exception("Failed to create socket fd.");
} }
struct sockaddr_in addr; sockaddr_in6 addr;
addr.sin_family = AF_INET; addr.sin6_family = AF_INET6;
addr.sin_port = htons(port); addr.sin6_port = htons(port);
addr.sin_addr.s_addr = INADDR_ANY; // TODO FIXME addr.sin6_addr = IN6ADDR_ANY_INIT;
if (bind(raw_socket_fd, (struct sockaddr *) &addr, sizeof(addr)) != 0) { socketaddr sa{addr};
if (bind(raw_socket_fd.get(), sa.ptr(), sa.size()) != 0) {
std::string msg = "Failed to bind to all addresses (FIXME)"; std::string msg = "Failed to bind to all addresses (FIXME)";
if (port < 1024) { 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); throw netio_exception(msg);
} }
// Append the non blocking flag to the file state of the socket fd. // Append the non blocking flag to the file state of the socket fd.
// This might be linux only. We should check that // This might be linux only. We should check that
fcntl(raw_socket_fd, F_SETFL, fcntl(raw_socket_fd, F_GETFL, 0) | O_NONBLOCK); fcntl(raw_socket_fd.get(), F_SETFL, fcntl(raw_socket_fd.get(), F_GETFL, 0) | O_NONBLOCK);
if (listen(raw_socket_fd, 5) == -1) { if (listen(raw_socket_fd.get(), 5) == -1) {
throw netio_exception("Failed to enable listening mode for raw socket"); 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; using namespace std::placeholders;
this->ss->set_accept_handler(std::bind(&tcp_server_socket::await_raw_socket_incomming, this, _1, _2)); this->ss->set_accept_handler(std::bind(&tcp_server_socket::await_raw_socket_incomming, this, _1, _2));
} }
......
...@@ -20,7 +20,7 @@ class tcp_server_socket : public std::enable_shared_from_this<tcp_server_socket> ...@@ -20,7 +20,7 @@ class tcp_server_socket : public std::enable_shared_from_this<tcp_server_socket>
public: public:
typedef std::function<void(tcp_client)> incoming_client_listener_type; typedef std::function<void(tcp_client)> incoming_client_listener_type;
private: private:
std::shared_ptr<async_server_socket> ss; async_server_socket::self_ptr_type ss;
incoming_client_listener_type client_listener; incoming_client_listener_type client_listener;
int number_of_connected_clients; int number_of_connected_clients;
public: public:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment