当前位置: 首页 > news >正文

【libevent多线程服务器】--UDP

大佬多年前写的:link
基于大佬的,改成了windows版的,用了更新的Libevent API
后面把tcp多线程服务器写好也会发出来,若有误/改进点,往指正

#include <iostream>
#include <string>
#include <thread>
#include <event2/event.h>
#include <event.h>
#include <event2/thread.h>
#include <windows.h>
#include <winsock2.h>
#include <mutex>
#include <vector>
#include <atomic>
#include <future> // 用于std::async
#pragma comment(lib, "Iphlpapi.lib")
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "wsock32.lib")
#pragma comment(lib, "event.lib")
#pragma comment(lib, "event_core.lib")
#pragma comment(lib, "event_extra.lib")
#pragma comment(lib, "bcrypt.lib")
// RAII风格的类,用于管理WSA的初始化和清理
class WSAInitializer {
public:WSAInitializer() {if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {throw std::runtime_error("WSAStartup error");}}~WSAInitializer() {WSACleanup();}private:WSADATA wsaData{};
};int init_count = 0;
std::mutex init_lock;typedef struct {std::thread thread; // 线程对象event_base *base;      // 线程使用的libevent句柄event *notify_event;    // 通知管道的监听事件
} mythread;void worker_libevent(void *arg) {auto *p = (mythread *)arg;std::unique_lock<std::mutex> guard(init_lock);init_count++;guard.unlock();event_base_loop(p->base, 0);
}void process(evutil_socket_t fd, short which, void *arg) {auto *p = (mythread *)arg;char buffer[100] = {0}; // 使用字符串构造函数清空缓冲区int ilen = recv(fd, buffer, sizeof(buffer), 0);if (ilen <= 0) { // 检查错误和连接关闭std::cerr << "recv error or connection closed" << std::endl;return;}std::cout << "I am in the thread: " << p->thread.get_id() << std::endl;std::cout << "read num is: " << ilen << std::endl;std::cout << "the buffer: " << buffer << std::endl;
}void setup_thread(mythread *p, int fd) {p->base = event_base_new();p->notify_event=event_new(p->base, fd, EV_READ | EV_PERSIST, process, p);event_add(p->notify_event, 0);
}int main() {WSAInitializer wsainit; // 确保WSA的初始化和清理SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);if (sock == INVALID_SOCKET) {std::cerr << "socket error" << std::endl;return -1;}sockaddr_in server_addr{};server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = INADDR_ANY; // 监听所有地址server_addr.sin_port = htons(19870);if (bind(sock, (sockaddr *)&server_addr, sizeof(server_addr)) == SOCKET_ERROR) {std::cerr << "bind error" << std::endl;return -1;}const int thread_num = 10;std::vector<mythread> g_threads(thread_num);for (int i = 0; i < thread_num; i++) {setup_thread(&g_threads[i], sock);std::cout<<"create thread: "<<i<<std::endl;}for (int i = 0; i < thread_num; i++) {g_threads[i].thread = std::thread(worker_libevent, &g_threads[i]);std::cout<<" thread: "<<i<<std::endl;}std::cout<<"init_count: "<<init_count<<std::endl;std::unique_lock<std::mutex> guard(init_lock);printf("IN THE MAIN LOOP\n");// 使用std::async和future来回收线程资源,提高性能std::vector<std::future<void>> futures;for (auto &t : g_threads) {futures.push_back(std::async(std::launch::async, [&](){t.thread.join();}));}// 等待所有线程结束for (auto &f : futures) {f.get();}closesocket(sock);return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 设计模式 - 适配器模式
  • PyCharm找不到Python了咋办
  • Pinterest:从 Druid 到 StarRocks,实现 6 倍成本效益比提升
  • Milvus 向量数据库进阶系列丨构建 RAG 多租户/多用户系统 (上)
  • win系统运行命令行常用命令汇总
  • LVS(Linux Virtual Server)详解
  • 中国健康与养老追踪调查数据库(CHARLS)_2_中文文献整理
  • Codeforces Round 871 (Div. 4)(A~H)
  • 家里浮毛粉尘到处飞?宠物空气净化器出动帮你解决
  • 搜索 ---- 练习题(洛谷)
  • 05:【stm32】重映射AFIO
  • VIVADO IP核之DDS直接数字频率合成器使用详解
  • c#怎么折叠代码快捷
  • el-form-item,label在上方显示,输入框在下方展示
  • Bug太多,苹果手机升级到18.1后怎么降级
  • [数据结构]链表的实现在PHP中
  • CSS中外联样式表代表的含义
  • echarts花样作死的坑
  • fetch 从初识到应用
  • Java的Interrupt与线程中断
  • JSONP原理
  • JS变量作用域
  • js写一个简单的选项卡
  • KMP算法及优化
  • leetcode98. Validate Binary Search Tree
  • mockjs让前端开发独立于后端
  • npx命令介绍
  • SpingCloudBus整合RabbitMQ
  • tab.js分享及浏览器兼容性问题汇总
  • 包装类对象
  • 关于springcloud Gateway中的限流
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 聊聊sentinel的DegradeSlot
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 面试总结JavaScript篇
  • 批量截取pdf文件
  • 实现简单的正则表达式引擎
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 用简单代码看卷积组块发展
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • # Redis 入门到精通(九)-- 主从复制(1)
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (145)光线追踪距离场柔和阴影
  • (2024,RWKV-5/6,RNN,矩阵值注意力状态,数据依赖线性插值,LoRA,多语言分词器)Eagle 和 Finch
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (ros//EnvironmentVariables)ros环境变量
  • (超详细)语音信号处理之特征提取
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (十七)Flink 容错机制
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))