Переписывание подключения

This commit is contained in:
2025-04-03 13:05:30 +03:00
parent 34d53ad7f1
commit e83f355fa3

View File

@ -2,6 +2,8 @@
#include <WinSock2.h> #include <WinSock2.h>
#include <WS2tcpip.h> #include <WS2tcpip.h>
#include <thread> #include <thread>
#include <atomic>
#include <mutex>
#pragma comment(lib, "Ws2_32.lib") #pragma comment(lib, "Ws2_32.lib")
@ -17,6 +19,9 @@ struct DataOut
float MotorUL, MotorUR, MotorDL, MotorDR; float MotorUL, MotorUR, MotorDL, MotorDR;
} dataOut; } dataOut;
std::atomic<bool> running(true); // Флаг работы потоков
std::mutex dataMutex; // Мьютекс для синхронизации доступа к dataIn и dataOut
SOCKET ConnectToServer(const char* ip, int port) SOCKET ConnectToServer(const char* ip, int port)
{ {
WSAData wsaData; WSAData wsaData;
@ -58,7 +63,41 @@ void CloseConnection(SOCKET& socket)
{ {
closesocket(socket); closesocket(socket);
WSACleanup(); 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<std::mutex> lock(dataMutex);
dataIn = tempData;
}
}
// Функция отправки данных
void SendHandler(SOCKET socket)
{
while (running)
{
{
std::lock_guard<std::mutex> 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); SOCKET Connection = ConnectToServer("127.0.0.1", 1001);
if (Connection == INVALID_SOCKET) if (Connection == INVALID_SOCKET)
{ {
return 1; // Выход, если подключение не удалось return 1;
} }
dataOut.MotorUL = 10; dataOut.MotorUL = 10;
@ -75,19 +114,27 @@ int main()
dataOut.MotorDL = 10; dataOut.MotorDL = 10;
dataOut.MotorDR = 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::lock_guard<std::mutex> lock(dataMutex);
//std::cout << dataIn.GyrX << " " << dataIn.GyrY << " " << dataIn.GyrZ << std::endl; std::cout << "Laser Range: " << dataIn.LaserRange << 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::cout << "-----------------------------------------------------------" << 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); CloseConnection(Connection);
system("pause"); system("pause");
return 0;
} }