From c6f2acf1407648401550453724833082f8471623 Mon Sep 17 00:00:00 2001 From: Dizel Date: Fri, 4 Apr 2025 11:49:03 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=BF=D0=B8=D1=81?= =?UTF-8?q?=D0=B0=D0=BD=D0=BD=D1=8B=D0=B9=20=D0=BA=D0=BE=D0=B4=20=D0=BD?= =?UTF-8?q?=D0=B0=20c++/cli?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Рабочий вариант --- DroneClientCpp/FormMain.h | Bin 55494 -> 70460 bytes DroneClientCpp/NetClient.h | 152 +++++++++++++++++++++++++++++-------- 2 files changed, 121 insertions(+), 31 deletions(-) diff --git a/DroneClientCpp/FormMain.h b/DroneClientCpp/FormMain.h index 1c0565b959f506a1bdf6b862974d60f3278e3647..a01304d618cc7702160551b6e95805422ba64839 100644 GIT binary patch literal 70460 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 diff --git a/DroneClientCpp/NetClient.h b/DroneClientCpp/NetClient.h index dd578dd..c160988 100644 --- a/DroneClientCpp/NetClient.h +++ b/DroneClientCpp/NetClient.h @@ -49,7 +49,20 @@ namespace DroneSimulator ~NetClient() { + // Вызываем Close() для корректного закрытия соединения Close(); + + // Дополнительная очистка ресурсов + if (DataServer != nullptr) + { + // Очищаем буфер данных + DataServer->buffer = nullptr; + DataServer = nullptr; + } + + // Обнуляем callback-делегаты + ConnectionCallback = nullptr; + ReceiveCallback = nullptr; } ClientState Connect(String^ addr, int port, ClientCallback^ connectionCallback, ClientCallback^ receiveCallback) @@ -83,15 +96,16 @@ namespace DroneSimulator receiveData->Size = ServerData::size; receiveData->Server = ServerSocket; - ServerSocket->BeginReceive(DataServer->buffer, 0, ServerData::size, - SocketFlags::None, gcnew AsyncCallback(this, &NetClient::ReadCallback), receiveData); + ServerSocket->BeginReceive(DataServer->buffer, 0, ServerData::size, SocketFlags::None, gcnew AsyncCallback(this, &NetClient::ReadCallback), receiveData); return ClientState::Connected; } catch (Exception^) { if (ServerSocket != nullptr) + { ServerSocket->Close(); + } return ClientState::Error; } } @@ -129,38 +143,114 @@ namespace DroneSimulator void ReadCallback(IAsyncResult^ ar) { - ReceiveData^ cd = safe_cast(ar->AsyncState); - if (cd == nullptr) return; - - int bytes = 0; - try { bytes = ServerSocket->EndReceive(ar); } - catch (...) {} - - if (bytes == 0) - { - Disconnect(); - - if (ConnectionCallback != nullptr) - { - ConnectData^ disconnectData = gcnew ConnectData(); - disconnectData->Connect = false; - disconnectData->Server = nullptr; - ConnectionCallback(disconnectData); - } - return; - } - - if (ReceiveCallback != nullptr) - { - ReceiveCallback(cd); - } - try { - ServerSocket->BeginReceive(cd->Buffer, 0, ServerData::size, - SocketFlags::None, gcnew AsyncCallback(this, &NetClient::ReadCallback), cd); + // Проверка на null входного параметра + if (ar == nullptr) return; + + // Безопасное приведение типа + ReceiveData^ cd = dynamic_cast(ar->AsyncState); + if (cd == nullptr || ServerSocket == nullptr || !ServerSocket->Connected) + { + Disconnect(); + return; + } + + int bytes = 0; + try + { + bytes = ServerSocket->EndReceive(ar); + } + catch (ObjectDisposedException^) + { + // Сокет был закрыт + Disconnect(); + return; + } + catch (SocketException^ ex) + { + // Логирование ошибки сокета + System::Diagnostics::Debug::WriteLine( + "Socket receive error: " + ex->Message); + Disconnect(); + return; + } + catch (...) + { + Disconnect(); + return; + } + + // Проверка на разрыв соединения + if (bytes == 0) + { + Disconnect(); + + if (ConnectionCallback != nullptr) + { + ConnectData^ disconnectData = gcnew ConnectData(); + disconnectData->Connect = false; + disconnectData->Server = nullptr; + ConnectionCallback(disconnectData); + } + return; + } + + // Вызов callback получения данных + if (ReceiveCallback != nullptr && cd->Buffer != nullptr) + { + try + { + ReceiveCallback(cd); + } + catch (Exception^ ex) + { + System::Diagnostics::Debug::WriteLine( + "ReceiveCallback error: " + ex->Message); + } + } + + // Продолжаем прием данных + if (ServerSocket != nullptr && ServerSocket->Connected) + { + try + { + IAsyncResult^ result = ServerSocket->BeginReceive( + cd->Buffer, + 0, + ServerData::size, + SocketFlags::None, + gcnew AsyncCallback(this, &NetClient::ReadCallback), + cd); + + // Проверка на ошибку асинхронной операции + if (result == nullptr) + { + Disconnect(); + } + } + catch (ObjectDisposedException^) + { + Disconnect(); + } + catch (SocketException^ ex) + { + System::Diagnostics::Debug::WriteLine( + "BeginReceive error: " + ex->Message); + Disconnect(); + } + catch (...) + { + Disconnect(); + } + } + } + catch (Exception^ ex) + { + System::Diagnostics::Debug::WriteLine( + "ReadCallback general error: " + ex->Message); + Disconnect(); } - catch (...) {} } }; } \ No newline at end of file