Разделение классов на заголовочный и реализацию

This commit is contained in:
Dizel 2025-04-10 09:54:09 +03:00
parent 6d8765ce4f
commit 303328b26d
30 changed files with 375 additions and 311 deletions

197
DroneClientCpp/Drone.cpp Normal file
View File

@ -0,0 +1,197 @@
#include "Drone.h"
namespace DroneClient {
// Реализация статического метода GetBytes
array<Byte>^ Drone::GetBytes(Object^ data)
{
int size = Marshal::SizeOf(data);
array<Byte>^ arr = gcnew array<Byte>(size);
IntPtr ptr = IntPtr::Zero;
try
{
ptr = Marshal::AllocHGlobal(size);
Marshal::StructureToPtr(data, ptr, true);
Marshal::Copy(ptr, arr, 0, size);
}
finally
{
Marshal::FreeHGlobal(ptr);
}
return arr;
}
// Реализация статического метода FromBytes
Object^ Drone::FromBytes(array<Byte>^ arr, Type^ type)
{
Object^ mem = gcnew Object();
int size = Marshal::SizeOf(type);
IntPtr ptr = IntPtr::Zero;
try
{
ptr = Marshal::AllocHGlobal(size);
Marshal::Copy(arr, 0, ptr, size);
mem = Marshal::PtrToStructure(ptr, type);
}
finally
{
Marshal::FreeHGlobal(ptr);
}
return mem;
}
// Реализация приватного метода SendDataMotor4
array<Byte>^ Drone::SendDataMotor4()
{
DroneData::DataMotor4 mot4;
mot4.Head.Size = Marshal::SizeOf(DroneData::DataMotor4::typeid);
mot4.Head.Mode = DroneData::DataMode::Response;
mot4.Head.Type = DroneData::DataType::DataMotor4;
mot4.UL = MotorUL;
mot4.UR = MotorUR;
mot4.DL = MotorDL;
mot4.DR = MotorDR;
return GetBytes(mot4);
}
// Реализация приватного метода RecvDataIMU
array<Byte>^ Drone::RecvDataIMU(array<Byte>^ data)
{
DroneData::DataIMU imu = (DroneData::DataIMU)FromBytes(data, DroneData::DataIMU::typeid);
AccX = imu.Acc.X; AccY = imu.Acc.Y; AccZ = imu.Acc.Z;
GyrX = imu.Gyr.X; GyrY = imu.Gyr.Y; GyrZ = imu.Gyr.Z;
return gcnew array<Byte>(0);
}
// Реализация приватного метода RecvDataPos
array<Byte>^ Drone::RecvDataPos(array<Byte>^ data)
{
DroneData::DataPos pos = (DroneData::DataPos)FromBytes(data, DroneData::DataPos::typeid);
PosX = pos.Local.X; PosY = pos.Local.Y;
LaserRange = pos.LiDAR;
return gcnew array<Byte>(0);
}
// Реализация приватного метода ClientRequestResponse
array<Byte>^ Drone::ClientRequestResponse(DroneData::DataHead head, array<Byte>^ body)
{
array<Byte>^ zero = gcnew array<Byte>(0);
switch (head.Type)
{
case DroneData::DataType::DataIMU:
if (head.Mode == DroneData::DataMode::Request)
{
return zero; // Запрос данных (не реализовано)
}
else
{
return RecvDataIMU(body); // Пришли данные
}
case DroneData::DataType::DataPos:
if (head.Mode == DroneData::DataMode::Request)
{
return zero; // Запрос данных (не реализовано)
}
else
{
return RecvDataPos(body); // Пришли данные
}
case DroneData::DataType::DataMotor4:
if (head.Mode == DroneData::DataMode::Request)
{
return SendDataMotor4(); // Запрос данных
}
else
{
return zero; // Пришли данные (не реализовано)
}
}
return zero;
}
// Реализация конструктора
Drone::Drone()
{
DroneStreamData = gcnew array<Byte>(DroneStreamCount); // Инициализация массива
DroneStreamIndex = 0;
DroneStreamHead.Mode = DroneData::DataMode::None;
DroneStreamHead.Size = 0;
DroneStreamHead.Type = DroneData::DataType::None;
}
// Реализация метода DataStream
System::Collections::Generic::List<array<Byte>^>^ Drone::DataStream(array<Byte>^ data, int size)
{
System::Collections::Generic::List<array<Byte>^>^ ret = gcnew System::Collections::Generic::List<array<Byte>^>();
if (data == nullptr) return ret; // Последовательность не сформирована
if (size + DroneStreamIndex > DroneStreamCount) return nullptr; // Ошибка переполнения
Array::Copy(data, 0, DroneStreamData, DroneStreamIndex, size);
DroneStreamIndex += size;
while (true)
{
if (DroneStreamHead.Size == 0) // Заголовок еще не получен
{
if (DroneStreamIndex < DroneData::DataHead::StrLen) return ret;
DroneStreamHead = (DroneData::DataHead)FromBytes(DroneStreamData, DroneData::DataHead::typeid);
}
if (DroneStreamHead.Size > DroneStreamIndex) break; // Пакет еще не полный
array<Byte>^ body = gcnew array<Byte>(DroneStreamHead.Size);
Array::Copy(DroneStreamData, 0, body, 0, DroneStreamHead.Size);
int shift = DroneStreamHead.Size;
DroneStreamIndex -= shift;
Array::Copy(DroneStreamData, shift, DroneStreamData, 0, DroneStreamIndex); // Сдвиг массива
DroneStreamHead.Size = 0; // Сброс заголовка
ret->Add(ClientRequestResponse(DroneStreamHead, body));
}
return ret;
}
// Реализация метода SendRequest
array<Byte>^ Drone::SendRequest()
{
DroneData::DataHead imu;
imu.Size = DroneData::DataHead::StrLen;
imu.Mode = DroneData::DataMode::Request;
imu.Type = DroneData::DataType::DataIMU;
DroneData::DataHead pos;
pos.Size = DroneData::DataHead::StrLen;
pos.Mode = DroneData::DataMode::Request;
pos.Type = DroneData::DataType::DataPos;
array<Byte>^ si = GetBytes(imu);
array<Byte>^ sp = GetBytes(pos);
array<Byte>^ sm = SendDataMotor4();
array<Byte>^ send = gcnew array<Byte>(si->Length + sp->Length + sm->Length);
Array::Copy(si, 0, send, 0, si->Length);
Array::Copy(sp, 0, send, si->Length, sp->Length);
Array::Copy(sm, 0, send, si->Length + sp->Length, sm->Length);
return send;
}
}

View File

@ -23,194 +23,24 @@ namespace DroneClient {
float MotorUL, MotorUR, MotorDL, MotorDR; float MotorUL, MotorUR, MotorDL, MotorDR;
static array<Byte>^ GetBytes(Object^ data) static array<Byte>^ GetBytes(Object^ data);
{ static Object^ FromBytes(array<Byte>^ arr, Type^ type);
int size = Marshal::SizeOf(data);
array<Byte>^ arr = gcnew array<Byte>(size);
IntPtr ptr = IntPtr::Zero;
try
{
ptr = Marshal::AllocHGlobal(size);
Marshal::StructureToPtr(data, ptr, true);
Marshal::Copy(ptr, arr, 0, size);
}
finally
{
Marshal::FreeHGlobal(ptr);
}
return arr;
}
static Object^ FromBytes(array<Byte>^ arr, Type^ type)
{
Object^ mem = gcnew Object();
int size = Marshal::SizeOf(type);
IntPtr ptr = IntPtr::Zero;
try
{
ptr = Marshal::AllocHGlobal(size);
Marshal::Copy(arr, 0, ptr, size);
mem = Marshal::PtrToStructure(ptr, type);
}
finally
{
Marshal::FreeHGlobal(ptr);
}
return mem;
}
private: private:
array<Byte>^ SendDataMotor4() array<Byte>^ SendDataMotor4();
{ array<Byte>^ RecvDataIMU(array<Byte>^ data);
DroneData::DataMotor4 mot4; array<Byte>^ RecvDataPos(array<Byte>^ data);
array<Byte>^ ClientRequestResponse(DroneData::DataHead head, array<Byte>^ body);
mot4.Head.Size = Marshal::SizeOf(DroneData::DataMotor4::typeid);
mot4.Head.Mode = DroneData::DataMode::Response;
mot4.Head.Type = DroneData::DataType::DataMotor4;
mot4.UL = MotorUL;
mot4.UR = MotorUR;
mot4.DL = MotorDL;
mot4.DR = MotorDR;
return GetBytes(mot4);
}
array<Byte>^ RecvDataIMU(array<Byte>^ data)
{
DroneData::DataIMU imu = (DroneData::DataIMU)FromBytes(data, DroneData::DataIMU::typeid);
AccX = imu.Acc.X; AccY = imu.Acc.Y; AccZ = imu.Acc.Z;
GyrX = imu.Gyr.X; GyrY = imu.Gyr.Y; GyrZ = imu.Gyr.Z;
return gcnew array<Byte>(0);
}
array<Byte>^ RecvDataPos(array<Byte>^ data)
{
DroneData::DataPos pos = (DroneData::DataPos)FromBytes(data, DroneData::DataPos::typeid);
PosX = pos.Local.X; PosY = pos.Local.Y;
LaserRange = pos.LiDAR;
return gcnew array<Byte>(0);
}
array<Byte>^ ClientRequestResponse(DroneData::DataHead head, array<Byte>^ body)
{
array<Byte>^ zero = gcnew array<Byte>(0);
switch (head.Type)
{
case DroneData::DataType::DataIMU:
if (head.Mode == DroneData::DataMode::Request)
{
return zero; // Запрос данных (не реализовано)
}
else
{
return RecvDataIMU(body); // Пришли данные
}
case DroneData::DataType::DataPos:
if (head.Mode == DroneData::DataMode::Request)
{
return zero; // Запрос данных (не реализовано)
}
else
{
return RecvDataPos(body); // Пришли данные
}
case DroneData::DataType::DataMotor4:
if (head.Mode == DroneData::DataMode::Request)
{
return SendDataMotor4(); // Запрос данных
}
else
{
return zero; // Пришли данные (не реализовано)
}
}
return zero;
}
literal int DroneStreamCount = 512; literal int DroneStreamCount = 512;
array<Byte>^ DroneStreamData = gcnew array<Byte>(DroneStreamCount); array<Byte>^ DroneStreamData;
int DroneStreamIndex = 0; int DroneStreamIndex;
DroneData::DataHead DroneStreamHead; // Исправлено: без явной инициализации DroneData::DataHead DroneStreamHead;
public: public:
// Конструктор для явной инициализации Drone(); // Конструктор для инициализации
Drone()
{
DroneStreamHead.Mode = DroneData::DataMode::None;
DroneStreamHead.Size = 0;
DroneStreamHead.Type = DroneData::DataType::None;
}
System::Collections::Generic::List<array<Byte>^>^ DataStream(array<Byte>^ data, int size) System::Collections::Generic::List<array<Byte>^>^ DataStream(array<Byte>^ data, int size);
{ array<Byte>^ SendRequest();
System::Collections::Generic::List<array<Byte>^>^ ret = gcnew System::Collections::Generic::List<array<Byte>^>();
if (data == nullptr) return ret; // Последовательность не сформирована
if (size + DroneStreamIndex > DroneStreamCount) return nullptr; // Ошибка переполнения
Array::Copy(data, 0, DroneStreamData, DroneStreamIndex, size);
DroneStreamIndex += size;
while (true)
{
if (DroneStreamHead.Size == 0) // Заголовок еще не получен
{
if (DroneStreamIndex < DroneData::DataHead::StrLen) return ret;
DroneStreamHead = (DroneData::DataHead)FromBytes(DroneStreamData, DroneData::DataHead::typeid);
}
if (DroneStreamHead.Size > DroneStreamIndex) break; // Пакет еще не полный
array<Byte>^ body = gcnew array<Byte>(DroneStreamHead.Size);
Array::Copy(DroneStreamData, 0, body, 0, DroneStreamHead.Size);
int shift = DroneStreamHead.Size;
DroneStreamIndex -= shift;
Array::Copy(DroneStreamData, shift, DroneStreamData, 0, DroneStreamIndex); // Сдвиг массива
DroneStreamHead.Size = 0; // Сброс заголовка
ret->Add(ClientRequestResponse(DroneStreamHead, body));
}
return ret;
}
array<Byte>^ SendRequest()
{
DroneData::DataHead imu;
imu.Size = DroneData::DataHead::StrLen;
imu.Mode = DroneData::DataMode::Request;
imu.Type = DroneData::DataType::DataIMU;
DroneData::DataHead pos;
pos.Size = DroneData::DataHead::StrLen;
pos.Mode = DroneData::DataMode::Request;
pos.Type = DroneData::DataType::DataPos;
array<Byte>^ si = GetBytes(imu);
array<Byte>^ sp = GetBytes(pos);
array<Byte>^ sm = SendDataMotor4();
array<Byte>^ send = gcnew array<Byte>(si->Length + sp->Length + sm->Length);
Array::Copy(si, 0, send, 0, si->Length);
Array::Copy(sp, 0, send, si->Length, sp->Length);
Array::Copy(sm, 0, send, si->Length + sp->Length, sm->Length);
return send;
}
}; };
} }

View File

@ -118,7 +118,9 @@
<Reference Include="System.Xml" /> <Reference Include="System.Xml" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="Drone.cpp" />
<ClCompile Include="FormMain.cpp" /> <ClCompile Include="FormMain.cpp" />
<ClCompile Include="NetClient.cpp" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="Drone.h" /> <ClInclude Include="Drone.h" />

View File

@ -18,6 +18,12 @@
<ClCompile Include="FormMain.cpp"> <ClCompile Include="FormMain.cpp">
<Filter>Исходные файлы</Filter> <Filter>Исходные файлы</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="NetClient.cpp">
<Filter>Исходные файлы</Filter>
</ClCompile>
<ClCompile Include="Drone.cpp">
<Filter>Исходные файлы</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="FormMain.h"> <ClInclude Include="FormMain.h">

Binary file not shown.

View File

@ -2,7 +2,7 @@
<Project> <Project>
<ProjectOutputs> <ProjectOutputs>
<ProjectOutput> <ProjectOutput>
<FullPath>D:\Projects\Simulator\DroneClientCpp\x64\Debug\DroneClientCpp.exe</FullPath> <FullPath>C:\Projects\Simulator\DroneClientCpp\x64\Debug\DroneClientCpp.exe</FullPath>
</ProjectOutput> </ProjectOutput>
</ProjectOutputs> </ProjectOutputs>
<ContentFiles /> <ContentFiles />

View File

@ -1,3 +1,5 @@
 FormMain.cpp  FormMain.cpp
FormMain.obj : обнаружен модуль MSIL; для MSIL последовательная компоновка отключена; выполняется полная компоновка NetClient.cpp
DroneClientCpp.vcxproj -> D:\Projects\Simulator\DroneClientCpp\x64\Debug\DroneClientCpp.exe Создание кода...
Drone.obj : обнаружен модуль MSIL; для MSIL последовательная компоновка отключена; выполняется полная компоновка
DroneClientCpp.vcxproj -> C:\Projects\Simulator\DroneClientCpp\x64\Debug\DroneClientCpp.exe

View File

@ -1,2 +1,4 @@
D:\Projects\Simulator\DroneClientCpp\FormMain.cpp;D:\Projects\Simulator\DroneClientCpp\DroneClientCpp\x64\Debug\FormMain.obj C:\Projects\Simulator\DroneClientCpp\Drone.cpp;C:\Projects\Simulator\DroneClientCpp\DroneClientCpp\x64\Debug\Drone.obj
D:\Projects\Simulator\DroneClientCpp\DroneClientCpp\x64\Debug\.NETFramework,Version=v4.7.2.AssemblyAttributes.cpp;D:\Projects\Simulator\DroneClientCpp\DroneClientCpp\x64\Debug\.NETFramework,Version=v4.7.2.AssemblyAttributes.obj C:\Projects\Simulator\DroneClientCpp\FormMain.cpp;C:\Projects\Simulator\DroneClientCpp\DroneClientCpp\x64\Debug\FormMain.obj
C:\Projects\Simulator\DroneClientCpp\NetClient.cpp;C:\Projects\Simulator\DroneClientCpp\DroneClientCpp\x64\Debug\NetClient.obj
C:\Projects\Simulator\DroneClientCpp\DroneClientCpp\x64\Debug\.NETFramework,Version=v4.7.2.AssemblyAttributes.cpp;C:\Projects\Simulator\DroneClientCpp\DroneClientCpp\x64\Debug\.NETFramework,Version=v4.7.2.AssemblyAttributes.obj

View File

@ -1,2 +1,2 @@
PlatformToolSet=v143:VCToolArchitecture=Native64Bit:VCToolsVersion=14.43.34808:TargetPlatformVersion=10.0.22621.0:TargetFrameworkVersion=v4.7.2::EnableManagedIncrementalBuild=true: PlatformToolSet=v143:VCToolArchitecture=Native64Bit:VCToolsVersion=14.42.34433:TargetPlatformVersion=10.0.22621.0:TargetFrameworkVersion=v4.7.2::EnableManagedIncrementalBuild=true:
Debug|x64|D:\Projects\Simulator\DroneClientCpp\| Debug|x64|C:\Projects\Simulator\DroneClientCpp\|

View File

@ -1,4 +1,4 @@
^D:\PROJECTS\SIMULATOR\DRONECLIENTCPP\FORMMAIN.RESX ^C:\PROJECTS\SIMULATOR\DRONECLIENTCPP\FORMMAIN.RESX
D:\Projects\Simulator\DroneClientCpp\DroneClientCpp.vcxproj C:\Projects\Simulator\DroneClientCpp\DroneClientCpp.vcxproj
^D:\PROJECTS\SIMULATOR\DRONECLIENTCPP\FORMMAIN.RESX ^C:\PROJECTS\SIMULATOR\DRONECLIENTCPP\FORMMAIN.RESX
D:\Projects\Simulator\DroneClientCpp\DroneClientCpp.vcxproj C:\Projects\Simulator\DroneClientCpp\DroneClientCpp.vcxproj

View File

@ -1,4 +1,4 @@
^D:\PROJECTS\SIMULATOR\DRONECLIENTCPP\FORMMAIN.RESX ^C:\PROJECTS\SIMULATOR\DRONECLIENTCPP\FORMMAIN.RESX
D:\PROJECTS\SIMULATOR\DRONECLIENTCPP\DRONECLIENTCPP.VCXPROJ C:\PROJECTS\SIMULATOR\DRONECLIENTCPP\DRONECLIENTCPP.VCXPROJ
^D:\PROJECTS\SIMULATOR\DRONECLIENTCPP\FORMMAIN.RESX ^C:\PROJECTS\SIMULATOR\DRONECLIENTCPP\FORMMAIN.RESX
D:\PROJECTS\SIMULATOR\DRONECLIENTCPP\DRONECLIENTCPP.VCXPROJ C:\PROJECTS\SIMULATOR\DRONECLIENTCPP\DRONECLIENTCPP.VCXPROJ

View File

@ -1,4 +1,4 @@
^D:\PROJECTS\SIMULATOR\DRONECLIENTCPP\FORMMAIN.RESX ^C:\PROJECTS\SIMULATOR\DRONECLIENTCPP\FORMMAIN.RESX
D:\PROJECTS\SIMULATOR\DRONECLIENTCPP\X64\DEBUG\DRONECLIENTCPP.EXE C:\PROJECTS\SIMULATOR\DRONECLIENTCPP\X64\DEBUG\DRONECLIENTCPP.EXE
^D:\PROJECTS\SIMULATOR\DRONECLIENTCPP\FORMMAIN.RESX ^C:\PROJECTS\SIMULATOR\DRONECLIENTCPP\FORMMAIN.RESX
D:\PROJECTS\SIMULATOR\DRONECLIENTCPP\X64\DEBUG\DRONECLIENTCPP.EXE C:\PROJECTS\SIMULATOR\DRONECLIENTCPP\X64\DEBUG\DRONECLIENTCPP.EXE

View File

@ -1 +1 @@
^D:\PROJECTS\SIMULATOR\DRONECLIENTCPP\DRONECLIENTCPP\X64\DEBUG\.NETFRAMEWORK,VERSION=V4.7.2.ASSEMBLYATTRIBUTES.OBJ|D:\PROJECTS\SIMULATOR\DRONECLIENTCPP\DRONECLIENTCPP\X64\DEBUG\FORMMAIN.OBJ ^C:\PROJECTS\SIMULATOR\DRONECLIENTCPP\DRONECLIENTCPP\X64\DEBUG\.NETFRAMEWORK,VERSION=V4.7.2.ASSEMBLYATTRIBUTES.OBJ|C:\PROJECTS\SIMULATOR\DRONECLIENTCPP\DRONECLIENTCPP\X64\DEBUG\DRONE.OBJ|C:\PROJECTS\SIMULATOR\DRONECLIENTCPP\DRONECLIENTCPP\X64\DEBUG\FORMMAIN.OBJ|C:\PROJECTS\SIMULATOR\DRONECLIENTCPP\DRONECLIENTCPP\X64\DEBUG\NETCLIENT.OBJ

Binary file not shown.

View File

@ -0,0 +1,105 @@
#include "NetClient.h"
namespace DroneSimulator {
// Конструктор ConnectData
NetClient::ConnectData::ConnectData(bool connect, Socket^ server)
{
Connect = connect;
Server = server;
}
// Конструктор ReceiveData
NetClient::ReceiveData::ReceiveData(array<Byte>^ buffer, int size, Socket^ server)
{
Buffer = buffer;
Size = size;
Server = server;
}
// Конструктор NetClient
NetClient::NetClient()
{
Connected = false;
ServerSocket = nullptr;
DataServer = gcnew ServerData(); // Инициализация DataServer
}
// Реализация метода Connect
NetClient::ClientState NetClient::Connect(String^ Addr, int Port, ClientCallback^ Connection, ClientCallback^ Receive)
{
if (Connected)
{
Close();
return ClientState::Stop;
}
ConnectionCallback = Connection;
ReceiveCallback = Receive;
IPEndPoint^ ep = gcnew IPEndPoint(IPAddress::Parse(Addr), Port);
ServerSocket = gcnew Socket(AddressFamily::InterNetwork, SocketType::Stream, ProtocolType::Tcp);
try { ServerSocket->Connect(ep); }
catch (...) { ServerSocket->Close(); return ClientState::Error; }
Connected = true;
ConnectionCallback(gcnew ConnectData(true, ServerSocket));
ReceiveData^ receiveData = gcnew ReceiveData(DataServer->buffer, ServerData::size, ServerSocket);
try { ServerSocket->BeginReceive(DataServer->buffer, 0, ServerData::size, SocketFlags::None, gcnew AsyncCallback(this, &NetClient::ReadCallback), receiveData); }
catch (...) {}
return ClientState::Connected;
}
// Реализация метода Close
void NetClient::Close()
{
try { ServerSocket->Shutdown(SocketShutdown::Both); }
catch (...) {}
ServerSocket->Close();
Connected = false;
}
// Реализация метода Send
void NetClient::Send(array<Byte>^ data)
{
if (ServerSocket != nullptr && Connected)
{
try { ServerSocket->Send(data); }
catch (...) {}
}
}
// Реализация метода ReadCallback
void NetClient::ReadCallback(IAsyncResult^ ar)
{
ReceiveData^ cd = (ReceiveData^)ar->AsyncState;
if (cd == nullptr) return;
int bytes = 0;
try { bytes = ServerSocket->EndReceive(ar); }
catch (...) {}
if (bytes == 0)
{
ServerSocket->Close();
Connected = false;
if (ServerSocket != nullptr)
{
ConnectionCallback(gcnew ConnectData(false, nullptr));
}
return;
}
ReceiveCallback(gcnew ReceiveData(cd->Buffer, bytes, ServerSocket));
try { ServerSocket->BeginReceive(cd->Buffer, 0, ServerData::size, SocketFlags::None, gcnew AsyncCallback(this, &NetClient::ReadCallback), cd); }
catch (...) {}
}
}

View File

@ -21,12 +21,7 @@ namespace DroneSimulator {
bool Connect; bool Connect;
Socket^ Server; Socket^ Server;
// Добавлен конструктор ConnectData(bool connect, Socket^ server);
ConnectData(bool connect, Socket^ server)
{
Connect = connect;
Server = server;
}
}; };
ref class ReceiveData ref class ReceiveData
@ -36,13 +31,7 @@ namespace DroneSimulator {
int Size; int Size;
Socket^ Server; Socket^ Server;
// Добавлен конструктор ReceiveData(array<Byte>^ buffer, int size, Socket^ server);
ReceiveData(array<Byte>^ buffer, int size, Socket^ server)
{
Buffer = buffer;
Size = size;
Server = server;
}
}; };
private: private:
@ -53,96 +42,27 @@ namespace DroneSimulator {
array<Byte>^ buffer = gcnew array<Byte>(size); array<Byte>^ buffer = gcnew array<Byte>(size);
}; };
bool Connected = false; bool Connected;
Socket^ ServerSocket = nullptr; Socket^ ServerSocket;
ServerData^ DataServer = gcnew ServerData(); ServerData^ DataServer;
public: public:
delegate void ClientCallback(Object^ o); delegate void ClientCallback(Object^ o);
private: private:
ClientCallback^ ConnectionCallback; ClientCallback^ ConnectionCallback;
ClientCallback^ ReceiveCallback; ClientCallback^ ReceiveCallback;
public: public:
NetClient(); // Добавлен конструктор
enum class ClientState { Error, Connected, Stop }; enum class ClientState { Error, Connected, Stop };
ClientState Connect(String^ Addr, int Port, ClientCallback^ Connection, ClientCallback^ Receive) ClientState Connect(String^ Addr, int Port, ClientCallback^ Connection, ClientCallback^ Receive);
{ void Close();
if (Connected) void Send(array<Byte>^ data);
{
Close();
return ClientState::Stop;
}
ConnectionCallback = Connection;
ReceiveCallback = Receive;
IPEndPoint^ ep = gcnew IPEndPoint(IPAddress::Parse(Addr), Port);
ServerSocket = gcnew Socket(AddressFamily::InterNetwork, SocketType::Stream, ProtocolType::Tcp);
try { ServerSocket->Connect(ep); }
catch (...) { ServerSocket->Close(); return ClientState::Error; }
Connected = true;
// Исправленный вызов с конструктором
ConnectionCallback(gcnew ConnectData(true, ServerSocket));
// Исправленный вызов с конструктором
ReceiveData^ receiveData = gcnew ReceiveData(DataServer->buffer, ServerData::size, ServerSocket);
try { ServerSocket->BeginReceive(DataServer->buffer, 0, ServerData::size, SocketFlags::None, gcnew AsyncCallback(this, &NetClient::ReadCallback), receiveData); }
catch (...) {}
return ClientState::Connected;
}
void Close()
{
try { ServerSocket->Shutdown(SocketShutdown::Both); }
catch (...) {}
ServerSocket->Close();
Connected = false;
}
void Send(array<Byte>^ data)
{
if (ServerSocket != nullptr && Connected)
{
try { ServerSocket->Send(data); }
catch (...) {}
}
}
private: private:
void ReadCallback(IAsyncResult^ ar) void ReadCallback(IAsyncResult^ ar);
{
ReceiveData^ cd = (ReceiveData^)ar->AsyncState;
if (cd == nullptr) return;
int bytes = 0;
try { bytes = ServerSocket->EndReceive(ar); }
catch (...) {}
if (bytes == 0)
{
ServerSocket->Close();
Connected = false;
if (ServerSocket != nullptr)
{
// Исправленный вызов с конструктором
ConnectionCallback(gcnew ConnectData(false, nullptr));
}
return;
}
// Исправленный вызов с конструктором
ReceiveCallback(gcnew ReceiveData(cd->Buffer, bytes, ServerSocket));
try { ServerSocket->BeginReceive(cd->Buffer, 0, ServerData::size, SocketFlags::None, gcnew AsyncCallback(this, &NetClient::ReadCallback), cd); }
catch (...) {}
}
}; };
} }

View File

@ -87,6 +87,23 @@ Class DroneClient.Drone: AutoLayout, AnsiClass, Class, Public, BeforeFieldInit
FromBytes(Byte[], Type): PrivateScope, Public, Static, HideBySig FromBytes(Byte[], Type): PrivateScope, Public, Static, HideBySig
DataStream(Byte[], Int32): PrivateScope, Public, HideBySig DataStream(Byte[], Int32): PrivateScope, Public, HideBySig
SendRequest(): PrivateScope, Public, HideBySig SendRequest(): PrivateScope, Public, HideBySig
Struct DroneData.DataMode: AutoLayout, AnsiClass, Class, Public, Sealed, BeforeFieldInit
:System.Enum
Fields:
UInt16 value__ : Public, SpecialName, RTSpecialName
DroneData.DataMode None = 0 : Public, Static, Literal, HasDefault
DroneData.DataMode Response = 1 : Public, Static, Literal, HasDefault
DroneData.DataMode Request = 2 : Public, Static, Literal, HasDefault
Struct DroneData.DataType: AutoLayout, AnsiClass, Class, Public, Sealed, BeforeFieldInit
:System.Enum
Fields:
UInt16 value__ : Public, SpecialName, RTSpecialName
DroneData.DataType None = 0 : Public, Static, Literal, HasDefault
DroneData.DataType Head = 1 : Public, Static, Literal, HasDefault
DroneData.DataType DataIMU = 1001 : Public, Static, Literal, HasDefault
DroneData.DataType DataPos = 1002 : Public, Static, Literal, HasDefault
DroneData.DataType DataMotor4 = 2001 : Public, Static, Literal, HasDefault
DroneData.DataType DataMotor6 = 2002 : Public, Static, Literal, HasDefault
Class DroneSimulator.NetClient: AutoLayout, AnsiClass, Class, Public, BeforeFieldInit Class DroneSimulator.NetClient: AutoLayout, AnsiClass, Class, Public, BeforeFieldInit
Void .ctor(): PrivateScope, Public, HideBySig, SpecialName, RTSpecialName Void .ctor(): PrivateScope, Public, HideBySig, SpecialName, RTSpecialName
Methods: Methods:
@ -121,20 +138,3 @@ Struct DroneSimulator.NetClient+ClientState: AutoLayout, AnsiClass, Class, Neste
Class DroneClientCpp.FormMain: AutoLayout, AnsiClass, Class, Public, BeforeFieldInit Class DroneClientCpp.FormMain: AutoLayout, AnsiClass, Class, Public, BeforeFieldInit
:System.Windows.Forms.Form :System.Windows.Forms.Form
Void .ctor(): PrivateScope, Public, HideBySig, SpecialName, RTSpecialName Void .ctor(): PrivateScope, Public, HideBySig, SpecialName, RTSpecialName
Struct DroneData.DataMode: AutoLayout, AnsiClass, Class, Public, Sealed, BeforeFieldInit
:System.Enum
Fields:
UInt16 value__ : Public, SpecialName, RTSpecialName
DroneData.DataMode None = 0 : Public, Static, Literal, HasDefault
DroneData.DataMode Response = 1 : Public, Static, Literal, HasDefault
DroneData.DataMode Request = 2 : Public, Static, Literal, HasDefault
Struct DroneData.DataType: AutoLayout, AnsiClass, Class, Public, Sealed, BeforeFieldInit
:System.Enum
Fields:
UInt16 value__ : Public, SpecialName, RTSpecialName
DroneData.DataType None = 0 : Public, Static, Literal, HasDefault
DroneData.DataType Head = 1 : Public, Static, Literal, HasDefault
DroneData.DataType DataIMU = 1001 : Public, Static, Literal, HasDefault
DroneData.DataType DataPos = 1002 : Public, Static, Literal, HasDefault
DroneData.DataType DataMotor4 = 2001 : Public, Static, Literal, HasDefault
DroneData.DataType DataMotor6 = 2002 : Public, Static, Literal, HasDefault