Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "Server.h"
- #include <iostream>
- #include <winsock2.h>
- #include <ws2tcpip.h>
- #pragma comment(lib, "ws2_32.lib")
- Server::Server(const std::string& address, int port)
- : address(address), port(port), connected(false), serverSocket(0), clientSocket(0) {
- WSADATA wsaData;
- if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
- std::cerr << "Ошибка при инициализации библиотеки WSA" << std::endl;
- return;
- }
- // Создание сокета
- serverSocket = socket(AF_INET, SOCK_STREAM, 0);
- if (serverSocket == INVALID_SOCKET) {
- std::cerr << "Ошибка при создании сокета" << std::endl;
- WSACleanup();
- return;
- }
- // Настройка адреса и порта сервера
- sockaddr_in serverAddress{};
- serverAddress.sin_family = AF_INET;
- serverAddress.sin_port = htons(port);
- if (inet_pton(AF_INET, address.c_str(), &(serverAddress.sin_addr)) <= 0) {
- std::cerr << "Некорректный адрес сервера" << std::endl;
- closesocket(serverSocket);
- WSACleanup();
- return;
- }
- // Привязка сокета к адресу и порту
- if (bind(serverSocket, (struct sockaddr*)&serverAddress, sizeof(serverAddress)) == SOCKET_ERROR) {
- std::cerr << "Ошибка при привязке сокета" << std::endl;
- closesocket(serverSocket);
- WSACleanup();
- return;
- }
- // Ожидание подключений
- if (listen(serverSocket, 1) == SOCKET_ERROR) {
- std::cerr << "Ошибка при ожидании подключений" << std::endl;
- closesocket(serverSocket);
- WSACleanup();
- return;
- }
- std::cout << "Сервер запущен и ожидает подключений..." << std::endl;
- connected = true;
- }
- Server::~Server() {
- if (connected) {
- // Остановка сервера
- connected = false;
- std::cout << "Сервер успешно остановлен из деструктора" << std::endl;
- }
- }
- void Server::start() {
- if (!connected) {
- std::cerr << "Сервер не был успешно запущен" << std::endl;
- return;
- }
- while (true) {
- sockaddr_in clientAddress{};
- int clientAddressLen = sizeof(clientAddress);
- // Принятие нового подключения
- clientSocket = accept(serverSocket, (struct sockaddr*)&clientAddress, &clientAddressLen);
- if (clientSocket == INVALID_SOCKET) {
- std::cerr << "Ошибка при принятии подключения" << std::endl;
- continue;
- }
- char clientIp[INET_ADDRSTRLEN];
- inet_ntop(AF_INET, &(clientAddress.sin_addr), clientIp, INET_ADDRSTRLEN);
- int clientPort = ntohs(clientAddress.sin_port);
- std::cout << "Получено новое соединение от " << clientIp << ":" << clientPort << std::endl;
- // Ваш код для обработки подключения
- // Закрытие сокета клиента
- closesocket(clientSocket);
- std::cout << "Соединение с " << clientIp << ":" << clientPort << " завершено" << std::endl;
- }
- }
- void Server::stop() {
- if (connected) {
- // Остановка сервера
- // Закрытие клиентского сокета (если активно)
- if (clientSocket != 0) {
- closesocket(clientSocket);
- clientSocket = 0;
- }
- // Закрытие серверного сокета
- closesocket(serverSocket);
- WSACleanup();
- connected = false;
- std::cout << "Сервер успешно остановлен" << std::endl;
- } else {
- std::cerr << "Сервер не был запущен" << std::endl;
- }
- }
- bool Server::isConnected() const {
- return connected;
- }
- bool Server::isRunning() const {
- if (connected) {
- if(serverSocket != 0) {
- return true;
- } else {
- return false;
- }
- } else {
- return false;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement