добавил все для наземной станции
This commit is contained in:
111
ground/udp-driver.cpp
Normal file
111
ground/udp-driver.cpp
Normal file
@@ -0,0 +1,111 @@
|
||||
#include "udp-driver.h"
|
||||
#include <iostream>
|
||||
#include <cstring>
|
||||
|
||||
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<uint16_t>& 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<const char*>(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;
|
||||
}
|
||||
Reference in New Issue
Block a user