/
tytyshka
/
Typing_Race_Game
Обзор
Документация
Войти
/
tytyshka
/
Typing_Race_Game
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
acceptor.cpp
79 строк
2 KB
tytyshka
Client
16 дек 2025, 21:37
16 дек 2025, 21:37
f770ab5
Код
Авторство
О чём код?
#include "acceptor.h" #include <ws2tcpip.h> #include <iostream> #pragma comment(lib, "Ws2_32.lib") Acceptor::Acceptor(int port, on_new_conn_t cb) : port_(port), cb_(cb), running_(false), listen_sock_(INVALID_SOCKET) { } Acceptor::~Acceptor() { stop(); } bool Acceptor::start() { WSADATA wsa; if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) { std::cerr << "[Acceptor] WSAStartup failed\n"; return false; } listen_sock_ = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (listen_sock_ == INVALID_SOCKET) { std::cerr << "[Acceptor] socket() failed: " << WSAGetLastError() << "\n"; WSACleanup(); return false; } int opt = 1; setsockopt(listen_sock_, SOL_SOCKET, SO_REUSEADDR, (const char*)&opt, sizeof(opt)); sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_addr.s_addr = INADDR_ANY; addr.sin_port = htons((u_short)port_); if (bind(listen_sock_, (sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR) { std::cerr << "[Acceptor] bind failed: " << WSAGetLastError() << "\n"; closesocket(listen_sock_); WSACleanup(); return false; } if (listen(listen_sock_, SOMAXCONN) == SOCKET_ERROR) { std::cerr << "[Acceptor] listen failed: " << WSAGetLastError() << "\n"; closesocket(listen_sock_); WSACleanup(); return false; } running_ = true; th_ = std::thread(&Acceptor::accept_loop, this); std::cout << "[Acceptor] Listening on port " << port_ << "\n"; return true; } void Acceptor::stop() { if (!running_) return; running_ = false; if (listen_sock_ != INVALID_SOCKET) { closesocket(listen_sock_); listen_sock_ = INVALID_SOCKET; } if (th_.joinable()) th_.join(); WSACleanup(); } void Acceptor::accept_loop() { while (running_) { sockaddr_in client; int len = sizeof(client); SOCKET client_sock = accept(listen_sock_, (sockaddr*)&client, &len); if (client_sock == INVALID_SOCKET) { if (running_) std::cerr << "[Acceptor] accept failed: " << WSAGetLastError() << "\n"; break; } if (cb_) cb_(client_sock); } }