Создание класса клиента
This commit is contained in:
parent
e83f355fa3
commit
994b0f8712
106
DroneClientCpp/Client.cpp
Normal file
106
DroneClientCpp/Client.cpp
Normal file
@ -0,0 +1,106 @@
|
||||
#pragma once
|
||||
|
||||
#include "Client.h"
|
||||
|
||||
Client::Client(const char* ip, int port) : running(true), Connection(INVALID_SOCKET)
|
||||
{
|
||||
if (!ConnectToServer(ip, port))
|
||||
{
|
||||
std::cerr << "Failed to connect to server!" << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
Client::~Client()
|
||||
{
|
||||
Stop();
|
||||
CloseConnection();
|
||||
}
|
||||
|
||||
bool Client::ConnectToServer(const char* ip, int port)
|
||||
{
|
||||
WSAData wsaData;
|
||||
WORD DLLVersion = MAKEWORD(2, 2);
|
||||
|
||||
if (WSAStartup(DLLVersion, &wsaData) != 0)
|
||||
{
|
||||
std::cerr << "Error: WSAStartup failed" << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
SOCKADDR_IN addr;
|
||||
inet_pton(AF_INET, ip, &addr.sin_addr);
|
||||
addr.sin_port = htons(port);
|
||||
addr.sin_family = AF_INET;
|
||||
|
||||
Connection = socket(AF_INET, SOCK_STREAM, 0);
|
||||
if (Connection == INVALID_SOCKET)
|
||||
{
|
||||
std::cerr << "Error: Failed to create socket" << std::endl;
|
||||
WSACleanup();
|
||||
return false;
|
||||
}
|
||||
|
||||
if (connect(Connection, (SOCKADDR*)&addr, sizeof(addr)) != 0)
|
||||
{
|
||||
std::cerr << "Error: Failed to connect to server" << std::endl;
|
||||
closesocket(Connection);
|
||||
WSACleanup();
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void Client::CloseConnection()
|
||||
{
|
||||
if (Connection != INVALID_SOCKET)
|
||||
{
|
||||
closesocket(Connection);
|
||||
WSACleanup();
|
||||
Connection = INVALID_SOCKET;
|
||||
}
|
||||
}
|
||||
|
||||
void Client::ReceiveHandler()
|
||||
{
|
||||
while (running)
|
||||
{
|
||||
DataIn tempData;
|
||||
int result = recv(Connection, (char*)&tempData, sizeof(tempData), 0);
|
||||
|
||||
if (result <= 0)
|
||||
{
|
||||
std::cerr << "Error: Connection lost (recv failed)" << std::endl;
|
||||
running = false;
|
||||
break;
|
||||
}
|
||||
|
||||
std::lock_guard<std::mutex> lock(dataMutex);
|
||||
dataIn = tempData;
|
||||
}
|
||||
}
|
||||
|
||||
void Client::SendHandler()
|
||||
{
|
||||
while (running)
|
||||
{
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(dataMutex);
|
||||
send(Connection, (char*)&dataOut, sizeof(dataOut), 0);
|
||||
}
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
||||
}
|
||||
}
|
||||
|
||||
void Client::Start()
|
||||
{
|
||||
recvThread = std::thread(&Client::ReceiveHandler, this);
|
||||
sendThread = std::thread(&Client::SendHandler, this);
|
||||
}
|
||||
|
||||
void Client::Stop()
|
||||
{
|
||||
running = false;
|
||||
if (recvThread.joinable()) recvThread.join();
|
||||
if (sendThread.joinable()) sendThread.join();
|
||||
}
|
44
DroneClientCpp/Client.h
Normal file
44
DroneClientCpp/Client.h
Normal file
@ -0,0 +1,44 @@
|
||||
#pragma once
|
||||
|
||||
#include <iostream>
|
||||
#include <WinSock2.h>
|
||||
#include <WS2tcpip.h>
|
||||
#include <thread>
|
||||
#include <atomic>
|
||||
#include <mutex>
|
||||
|
||||
#pragma comment(lib, "Ws2_32.lib")
|
||||
|
||||
class Client
|
||||
{
|
||||
public:
|
||||
Client(const char* ip, int port);
|
||||
~Client();
|
||||
|
||||
void Start(); // Запуск потоков
|
||||
void Stop(); // Остановка потоков
|
||||
struct DataIn
|
||||
{
|
||||
float AccX, AccY, AccZ;
|
||||
float GyrX, GyrY, GyrZ;
|
||||
float PosX, PosY, LaserRange;
|
||||
} dataIn;
|
||||
|
||||
struct DataOut
|
||||
{
|
||||
float MotorUL, MotorUR, MotorDL, MotorDR;
|
||||
} dataOut;
|
||||
bool ConnectToServer(const char* ip, int port);
|
||||
void CloseConnection();
|
||||
|
||||
private:
|
||||
std::atomic<bool> running;
|
||||
std::mutex dataMutex;
|
||||
|
||||
SOCKET Connection;
|
||||
std::thread recvThread;
|
||||
std::thread sendThread;
|
||||
|
||||
void ReceiveHandler();
|
||||
void SendHandler();
|
||||
};
|
@ -118,9 +118,11 @@
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="Client.cpp" />
|
||||
<ClCompile Include="FormMain.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="Client.h" />
|
||||
<ClInclude Include="FormMain.h">
|
||||
<FileType>CppForm</FileType>
|
||||
</ClInclude>
|
||||
|
@ -18,10 +18,16 @@
|
||||
<ClCompile Include="FormMain.cpp">
|
||||
<Filter>Исходные файлы</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Client.cpp">
|
||||
<Filter>Исходные файлы</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="FormMain.h">
|
||||
<Filter>Файлы заголовков</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Client.h">
|
||||
<Filter>Файлы заголовков</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
</Project>
|
Loading…
x
Reference in New Issue
Block a user