SyncWebServer/main.cppa

77 lines
1.6 KiB
Plaintext

#include <iostream>
#include <asio.hpp>
#include <thread>
#include <mutex>
#include <queue>
#include "Tool.hpp"
using namespace asio::ip;
std::mutex mtx;
//信息包结构体
struct MessagePack
{
char* Msg;
int Length;
};
std::queue<std::pair<udp::endpoint, MessagePack*>> messages;
//销毁信息包
void DestoryPck(MessagePack* Pck) {
delete[] Pck->Msg;
delete[] Pck;
}
void TotalMessageLogic(udp::endpoint Client, MessagePack* Pck) {
//得到包长度
int Type = ByteLittleToInt((unsigned char*)Pck->Msg);
DestoryPck(Pck);
}
//子线程消息处理逻辑
void handle_messages() {
while (true) {
std::pair<udp::endpoint, MessagePack*> message;
{
std::lock_guard<std::mutex> lock(mtx);
if (!messages.empty()) {
message = messages.front();
messages.pop();
}
}
//调用全局处理逻辑
TotalMessageLogic(message.first, message.second);
}
}
int main1() {
asio::io_context io_context;
udp::socket socket(io_context, udp::endpoint(udp::v4(), 12345));
std::thread message_thread(handle_messages);
while (true) {
char data[1024];
udp::endpoint sender_endpoint;
size_t length = socket.receive_from(asio::buffer(data), sender_endpoint);
{
std::lock_guard<std::mutex> lock(mtx);
char* str = new char[length + 1];
memcpy(str, data, length);
MessagePack* Pck = new MessagePack();
Pck->Msg = str;
Pck->Length = length;
messages.push(std::make_pair(sender_endpoint, Pck));
}
}
message_thread.join();
return 0;
}