diff --git a/TestClientConnection/TestClientConnection.cpp b/TestClientConnection/TestClientConnection.cpp index ab91ea7..37dc7f9 100644 --- a/TestClientConnection/TestClientConnection.cpp +++ b/TestClientConnection/TestClientConnection.cpp @@ -2,6 +2,8 @@ #include #include #include +#include +#include #pragma comment(lib, "Ws2_32.lib") @@ -17,6 +19,9 @@ struct DataOut float MotorUL, MotorUR, MotorDL, MotorDR; } dataOut; +std::atomic running(true); // Флаг работы потоков +std::mutex dataMutex; // Мьютекс для синхронизации доступа к dataIn и dataOut + SOCKET ConnectToServer(const char* ip, int port) { WSAData wsaData; @@ -58,7 +63,41 @@ void CloseConnection(SOCKET& socket) { closesocket(socket); WSACleanup(); - socket = INVALID_SOCKET; // Обнуляем сокет, чтобы избежать повторного использования + socket = INVALID_SOCKET; + } +} + +// Функция приема данных +void ReceiveHandler(SOCKET socket) +{ + while (running) + { + DataIn tempData; + int result = recv(socket, (char*)&tempData, sizeof(tempData), 0); + + if (result <= 0) + { + std::cout << "Error: Connection lost (recv failed)\n"; + running = false; + break; + } + + // Потокобезопасное обновление данных + std::lock_guard lock(dataMutex); + dataIn = tempData; + } +} + +// Функция отправки данных +void SendHandler(SOCKET socket) +{ + while (running) + { + { + std::lock_guard lock(dataMutex); + send(socket, (char*)&dataOut, sizeof(dataOut), 0); + } + std::this_thread::sleep_for(std::chrono::milliseconds(100)); // Задержка для уменьшения нагрузки } } @@ -67,7 +106,7 @@ int main() SOCKET Connection = ConnectToServer("127.0.0.1", 1001); if (Connection == INVALID_SOCKET) { - return 1; // Выход, если подключение не удалось + return 1; } dataOut.MotorUL = 10; @@ -75,19 +114,27 @@ int main() dataOut.MotorDL = 10; dataOut.MotorDR = 10; - for (int i = 0; i < 1000000; i++) + // Создание потоков + std::thread recvThread(ReceiveHandler, Connection); + std::thread sendThread(SendHandler, Connection); + + for (int i = 0; i < 1000000; i++) { - send(Connection, (char*)&(dataOut), sizeof(dataOut), 0); - recv(Connection, (char*)&(dataIn), sizeof(dataIn), 0); - //std::cout << dataIn.GyrX << " " << dataIn.GyrY << " " << dataIn.GyrZ << std::endl; - //std::cout << dataIn.PosX << " " << dataIn.PosY << " " << dataIn.LaserRange << std::endl; - //std::cout << dataIn.AccX << " " << dataIn.AccY << " " << dataIn.AccZ << std::endl; - std::cout << dataIn.LaserRange << std::endl; + { + std::lock_guard lock(dataMutex); + std::cout << "Laser Range: " << dataIn.LaserRange << std::endl; + } std::cout << "-----------------------------------------------------------" << std::endl; - //std::this_thread::sleep_for(std::chrono::seconds(1)); + std::this_thread::sleep_for(std::chrono::milliseconds(500)); // Задержка вывода } - + + // Завершаем работу потоков + running = false; + recvThread.join(); + sendThread.join(); + CloseConnection(Connection); - + system("pause"); + return 0; }