#include "udp-driver.h" #include #include UDPSocket::UDPSocket(const std::string& ip, uint16_t port) { #ifdef _WIN32 sockfd = INVALID_SOCKET; #else sockfd = -1; #endif if (!initialize()) { return; } // Создание сокета #ifdef _WIN32 sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (sockfd == INVALID_SOCKET) { std::cerr << "Socket creation failed: " << WSAGetLastError() << std::endl; return; } #else sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd < 0) { std::cerr << "Socket creation failed" << std::endl; return; } #endif // Настройка адреса назначения memset(&dest_addr, 0, sizeof(dest_addr)); dest_addr.sin_family = AF_INET; dest_addr.sin_port = htons(port); #ifdef _WIN32 dest_addr.sin_addr.s_addr = inet_addr(ip.c_str()); if (dest_addr.sin_addr.s_addr == INADDR_NONE) { std::cerr << "Invalid address: " << ip << std::endl; closesocket(sockfd); sockfd = INVALID_SOCKET; } #else if (inet_pton(AF_INET, ip.c_str(), &dest_addr.sin_addr) <= 0) { std::cerr << "Invalid address: " << ip << std::endl; close(sockfd); sockfd = -1; } #endif } bool UDPSocket::initialize() { #ifdef _WIN32 // Инициализация Winsock if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { std::cerr << "WSAStartup failed: " << WSAGetLastError() << std::endl; return false; } #endif return true; } UDPSocket::~UDPSocket() { #ifdef _WIN32 if (sockfd != INVALID_SOCKET) { closesocket(sockfd); } WSACleanup(); #else if (sockfd >= 0) { close(sockfd); } #endif } bool UDPSocket::sendFrame(const std::vector& data) { #ifdef _WIN32 if (sockfd == INVALID_SOCKET) return false; #else if (sockfd < 0) return false; #endif if (data.empty()) return false; // Отправка данных #ifdef _WIN32 int result = sendto(sockfd, reinterpret_cast(data.data()), data.size() * sizeof(uint16_t), 0, (sockaddr*)&dest_addr, sizeof(dest_addr)); if (result == SOCKET_ERROR) { std::cerr << "Send failed: " << WSAGetLastError() << std::endl; return false; } #else ssize_t result = sendto(sockfd, data.data(), data.size() * sizeof(uint16_t), 0, (sockaddr*)&dest_addr, sizeof(dest_addr)); if (result < 0) { std::cerr << "Send failed" << std::endl; return false; } #endif return true; }