forked from CPL/Simulator
cpp
This commit is contained in:
105
DroneClientCpp/NetClient.cpp
Normal file
105
DroneClientCpp/NetClient.cpp
Normal 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 (...) {}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user