From 31b2280f295a9afb86fc53ee534bbf48ecca8903 Mon Sep 17 00:00:00 2001 From: littleblack111 Date: Mon, 26 May 2025 14:07:35 +0800 Subject: v1, sigabrt on client disconnect --- src/server.cpp | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) (limited to 'src/server.cpp') diff --git a/src/server.cpp b/src/server.cpp index db92481..cd0c698 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -2,6 +2,7 @@ #include "log.hpp" #include #include +#include #include CServer::CServer(uint16_t port) @@ -11,20 +12,24 @@ CServer::CServer(uint16_t port) constexpr int opt = 1; constexpr int size = sizeof(opt); - if (setsockopt(m_sockfd->get(), SOL_SOCKET, SO_REUSEADDR, &opt, size) < 0) - log(stderr, WARN, "setsockopt(SO_REUSEADDR) failed"); - - if (setsockopt(m_sockfd->get(), SOL_SOCKET, SO_KEEPALIVE, &opt, size) < 0) - log(stderr, WARN, "setsockopt(SO_KEEPALIVE) failed"); - - memset(&m_addr, 0, sizeof(m_addr)); - m_addr.sin_family = AF_INET; - m_addr.sin_port = htons(port); - m_addr.sin_addr.s_addr = INADDR_ANY; - bind(m_sockfd->get(), reinterpret_cast(&m_addr), sizeof(m_addr)) || - listen(m_sockfd->get(), 5) - ? throw std::runtime_error("Failed to bind or listen") - : log(LOG, "Server started on port: {}", port); + { + std::lock_guard lock(m_mutex); + + if (setsockopt(m_sockfd->get(), SOL_SOCKET, SO_REUSEADDR, &opt, size) < 0) + log(stderr, WARN, "setsockopt(SO_REUSEADDR) failed"); + + if (setsockopt(m_sockfd->get(), SOL_SOCKET, SO_KEEPALIVE, &opt, size) < 0) + log(stderr, WARN, "setsockopt(SO_KEEPALIVE) failed"); + + memset(&m_addr, 0, sizeof(m_addr)); + m_addr.sin_family = AF_INET; + m_addr.sin_port = htons(port); + m_addr.sin_addr.s_addr = INADDR_ANY; + bind(m_sockfd->get(), reinterpret_cast(&m_addr), sizeof(m_addr)) || + listen(m_sockfd->get(), 5) + ? throw std::runtime_error("Failed to bind or listen") + : log(LOG, "Server started on port: {}", port); + } log(LOG, "Server: initialized"); }; -- cgit v1.2.3