hello-world-cpp/task_5/socket_up.cpp

93 lines
2.9 KiB
C++
Raw Normal View History

2025-01-13 02:35:49 +10:00
#include "socket_up.h"
2025-01-13 23:44:26 +00:00
#ifdef _WIN32
2025-01-13 02:35:49 +10:00
// // Линковка библиотеки 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. Создание сокета
2025-01-13 23:44:26 +00:00
SOCKET listen_socket = socket(AF_INET, SOCK_STREAM, 0);
if (listen_socket == INVALID_SOCKET) {
2025-01-13 02:35:49 +10:00
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. Привязка сокета к адресу
2025-01-13 23:44:26 +00:00
if (bind(listen_socket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
2025-01-13 02:35:49 +10:00
std::cerr << "Bind failed with error: " << WSAGetLastError() << "\n";
2025-01-13 23:44:26 +00:00
closesocket(listen_socket);
2025-01-13 02:35:49 +10:00
WSACleanup();
return 1;
}
// 5. Перевод сокета в режим прослушивания
2025-01-13 23:44:26 +00:00
if (listen(listen_socket, SOMAXCONN) == SOCKET_ERROR) {
2025-01-13 02:35:49 +10:00
std::cerr << "Listen failed with error: " << WSAGetLastError() << "\n";
2025-01-13 23:44:26 +00:00
closesocket(listen_socket);
2025-01-13 02:35:49 +10:00
WSACleanup();
return 1;
}
std::cout << "Server is listening on port 8080...\n";
2025-01-13 23:44:26 +00:00
return listen_socket;
2025-01-13 02:35:49 +10:00
2025-01-13 04:58:58 +10:00
// 8. Закрытие клиентского сокета
2025-01-13 02:35:49 +10:00
// closesocket(clientSocket);
// // 9. Закрытие серверного сокета и завершение Winsock
2025-01-13 23:44:26 +00:00
// closesocket(listen_socket);
2025-01-13 02:35:49 +10:00
// WSACleanup();
2025-01-13 04:58:58 +10:00
return 0;
}
2025-01-13 23:44:26 +00:00
#else
2025-01-13 02:35:49 +10:00
2025-01-13 04:58:58 +10:00
int SocketUp::config_socket_unix() {
2025-01-13 23:44:26 +00:00
int server_socket = socket(AF_INET, SOCK_STREAM, 0);
if (server_socket == -1) {
perror("server socket can't be created");
return 1;
}
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; // Привязка к любому интерфейсу
if (bind(server_socket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) == -1) {
perror("Bind failed");
close(server_socket);
return 1;
}
if (listen(server_socket, SOMAXCONN) == -1) {
perror("Listen failed");
close(server_socket);
return 1;
}
std::cout << "Server is listening on port 8080...\n";
return server_socket;
2025-01-13 02:35:49 +10:00
}
2025-01-13 23:44:26 +00:00
#endif