Переписывание подключения
This commit is contained in:
@ -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;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user