From 46df608d795b112c50b685cea64dc6ab8347673a Mon Sep 17 00:00:00 2001 From: matv864 Date: Mon, 13 Jan 2025 02:35:49 +1000 Subject: [PATCH] socket is up --- task_5/CMakeLists.txt | 11 +++++++ task_5/main.cpp | 36 ++++++++++++++++++++++ task_5/readme.md | 3 ++ task_5/socket_handler.cpp | 0 task_5/socket_handler.h | 0 task_5/socket_up.cpp | 63 +++++++++++++++++++++++++++++++++++++++ task_5/socket_up.h | 24 +++++++++++++++ 7 files changed, 137 insertions(+) create mode 100644 task_5/CMakeLists.txt create mode 100644 task_5/main.cpp create mode 100644 task_5/readme.md create mode 100644 task_5/socket_handler.cpp create mode 100644 task_5/socket_handler.h create mode 100644 task_5/socket_up.cpp create mode 100644 task_5/socket_up.h diff --git a/task_5/CMakeLists.txt b/task_5/CMakeLists.txt new file mode 100644 index 0000000..76c46d7 --- /dev/null +++ b/task_5/CMakeLists.txt @@ -0,0 +1,11 @@ +cmake_minimum_required(VERSION 3.13) + +project(hello-world-cpp-logger) + + +add_library(socket_up STATIC socket_up.cpp) +add_library(socket_handler STATIC socket_handler.cpp) + +add_executable(main main.cpp) + +target_link_libraries(main socket_up socket_handler) \ No newline at end of file diff --git a/task_5/main.cpp b/task_5/main.cpp new file mode 100644 index 0000000..5dff931 --- /dev/null +++ b/task_5/main.cpp @@ -0,0 +1,36 @@ +#include "socket_up.h" +#include "socket_handler.h" +#include + + +int main() { + + SOCKET listenSocket = SocketUp::config_socket_windows(); + + // 6. Принятие входящего соединения + sockaddr_in clientAddr; + int clientAddrSize = sizeof(clientAddr); + SOCKET clientSocket = accept(listenSocket, (struct sockaddr*)&clientAddr, &clientAddrSize); + if (clientSocket == INVALID_SOCKET) { + std::cerr << "Accept failed with error: " << WSAGetLastError() << "\n"; + closesocket(listenSocket); + WSACleanup(); + return 1; + } + std::cout << "Client connected!\n"; + + + // 7. Отправка данных клиенту + const char* message = "new message from server!\n"; + int bytesSent = send(clientSocket, message, strlen(message), 0); + if (bytesSent == SOCKET_ERROR) { + std::cerr << "Send failed with error: " << WSAGetLastError() << "\n"; + closesocket(clientSocket); + closesocket(listenSocket); + WSACleanup(); + return 1; + } + std::cout << "Message sent to client.\n"; + + return 0; +} \ No newline at end of file diff --git a/task_5/readme.md b/task_5/readme.md new file mode 100644 index 0000000..e8c605d --- /dev/null +++ b/task_5/readme.md @@ -0,0 +1,3 @@ +# Here need to use flag -lws2_32 + +And I decide to make launch though ``make`` diff --git a/task_5/socket_handler.cpp b/task_5/socket_handler.cpp new file mode 100644 index 0000000..e69de29 diff --git a/task_5/socket_handler.h b/task_5/socket_handler.h new file mode 100644 index 0000000..e69de29 diff --git a/task_5/socket_up.cpp b/task_5/socket_up.cpp new file mode 100644 index 0000000..a9b50cf --- /dev/null +++ b/task_5/socket_up.cpp @@ -0,0 +1,63 @@ +#include "socket_up.h" + + + +// // Линковка библиотеки Winsock +// #pragma comment(lib, "ws2_32.lib") +// don't need but I think may shoot + +SOCKET SocketUp::config_socket_windows() { + // 1. Инициализация Winsock + WSADATA wsaData; + if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { + std::cerr << "WSAStartup failed with error: " << WSAGetLastError() << "\n"; + return 1; + } + + // 2. Создание сокета + SOCKET listenSocket = socket(AF_INET, SOCK_STREAM, 0); + if (listenSocket == INVALID_SOCKET) { + std::cerr << "Socket creation failed with error: " << WSAGetLastError() << "\n"; + WSACleanup(); + return 1; + } + + // 3. Настройка адреса сокета + sockaddr_in serverAddr; + memset(&serverAddr, 0, sizeof(serverAddr)); + serverAddr.sin_family = AF_INET; + serverAddr.sin_port = htons(8080); // Порт для привязки + serverAddr.sin_addr.s_addr = INADDR_ANY; // Привязка к любому интерфейсу + + // 4. Привязка сокета к адресу + if (bind(listenSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) { + std::cerr << "Bind failed with error: " << WSAGetLastError() << "\n"; + closesocket(listenSocket); + WSACleanup(); + return 1; + } + + // 5. Перевод сокета в режим прослушивания + if (listen(listenSocket, SOMAXCONN) == SOCKET_ERROR) { + std::cerr << "Listen failed with error: " << WSAGetLastError() << "\n"; + closesocket(listenSocket); + WSACleanup(); + return 1; + } + std::cout << "Server is listening on port 8080...\n"; + + + return listenSocket; + + + + // // 8. Закрытие клиентского сокета + // closesocket(clientSocket); + + // // 9. Закрытие серверного сокета и завершение Winsock + // closesocket(listenSocket); + // WSACleanup(); + + // std::cout << "Server shut down.\n"; + return 0; +} diff --git a/task_5/socket_up.h b/task_5/socket_up.h new file mode 100644 index 0000000..0173e1c --- /dev/null +++ b/task_5/socket_up.h @@ -0,0 +1,24 @@ +#ifdef _WIN32 + #include + #include + #include + #include +#else + #include +#endif + + +#include + + +class SocketUp { +public: + + #ifdef _WIN32 + static SOCKET config_socket_windows(); + #else + // SOCKET? + static SOCKET config_socket_unix(); + #endif +}; +