77 lines
1.6 KiB
Plaintext
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;
|
|
}
|