libevent(6)windows上使用iocp网络模型

news2024/11/18 13:50:18

windows操作系统上不能使用epoll模型,只能使用iocp网络模型。这里我把怎么在windows上使用iocp的代码直接贴上:


#include <iostream>
#include <signal.h>
#include <event2/event.h>
#include <event2/listener.h>
#include <event2/thread.h>

#define SPORT 5001

void listen_cb(struct evconnlistener* ev,
    evutil_socket_t s,
    struct sockaddr* addr,
    int socketLen,
    void* arg) {
    std::cout << "listen_cb event_base_new success!" << std::endl;
}

int main()
{
#ifdef _WIN32
    //windows初始化socket库
    WSADATA wsa;
    WSAStartup(MAKEWORD(2, 2), &wsa);
#else
    //发送数据给已关闭socket时,忽略管道信息.
    //否则可能导致程序dump.
    if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) {
        return -1;
    }
#endif

    //创建配置上下文
    event_config* conf = event_config_new();

    //设置网络模型,使用select
    //event_config_avoid_method(conf, "epoll");
    //event_config_avoid_method(conf, "poll");

//window支持iocp
#ifdef _WIN32
    event_config_set_flag(conf, EVENT_BASE_FLAG_STARTUP_IOCP);
    // 初始化IOCP线程(必须要有)
    evthread_use_windows_threads();
    //设置cpu数量
    SYSTEM_INFO si;
    GetSystemInfo(&si);
    event_config_set_num_cpus_hint(conf, si.dwNumberOfProcessors);
#endif

    //初始化libevent配置上下文
    event_base* base = event_base_new_with_config(conf);
    event_config_free(conf);

    if (!base) {
        std::cerr << "event_base_new_with_config failed!" << std::endl;

    }
    else {
        std::cout << "event_base_new_with_config success!" << std::endl;

        //获取当前网络模型
        std::cout << "current method is:" << event_base_get_method(base) << std::endl;
        struct sockaddr_in sin;
        memset(&sin, 0, sizeof(sin));
        sin.sin_family = AF_INET;
        sin.sin_port = htons(SPORT);

        evconnlistener* ev = evconnlistener_new_bind(
                                        base,  // libevent上下文
                                        listen_cb,  // 接收连接的回调函数
                                        base,  // 回调函数获取的参数
                                        LEV_OPT_REUSEABLE | LEV_OPT_CLOSE_ON_FREE,  // 设置地址重用和关闭同时关闭socket
                                        10, // 连接队列大小,对应listen函数
                                        (struct sockaddr*)&sin, // 绑定socket地址和端口
                                        sizeof(sin));
        event_base_dispatch(base);

        evconnlistener_free(ev);
        event_base_free(base);
    }

#ifdef _WIN32
    //清理window的socket库
    WSACleanup();
#endif

    return 0;
}

运行后,我们在任务管理器里就可以看到程序进程的线程数目:我这里是11个线程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/700029.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux从入门到放弃】冯诺依曼体系机构、操作系统及管理的本质

&#x1f9d1;‍&#x1f4bb;作者&#xff1a; 情话0.0 &#x1f4dd;专栏&#xff1a;《Linux从入门到放弃》 &#x1f466;个人简介&#xff1a;一名双非编程菜鸟&#xff0c;在这里分享自己的编程学习笔记&#xff0c;欢迎大家的指正与点赞&#xff0c;谢谢&#xff01; 文…

技术小知识:WAN和LAN区别 ①

1、WAN是外网接接入入口&#xff0c;一般指&#xff1a;外网&#xff0c;广域网&#xff0c;公网。 2、LAN是局域网输出接口&#xff0c;一般指&#xff1a;内网&#xff0c;家庭公司局域网。 局域网是小规模&#xff0c;近距离的一种内部范围网络布局。 外网要跨越的通讯商中…

【GESP】2023年06月图形化一级 -- 去旅行

文章目录 去旅行1. 准备工作2. 功能实现3. 设计思路与实现&#xff08;1&#xff09;角色、舞台背景设置a. 角色设置b. 舞台背景设置 &#xff08;2&#xff09;脚本编写a. 角色&#xff1a;Avery Walking 4. 评分标准 去旅行 1. 准备工作 &#xff08;1&#xff09;删除默认小…

不要错过这所211,专业课简单!保护一志愿,人称电力黄埔军校!

一、学校及专业介绍 华北电力大学&#xff08;North China Electric Power University&#xff09;&#xff0c;简称华电&#xff08;NCEPU&#xff09;&#xff0c;是中华人民共和国教育部直属、由国家电网有限公司等12家特大型电力集团和中国电力企业联合会组成的理事会与教育…

Java容器介绍及其操作方法

一、List ArrayList&#xff0c;LinkedList 特有的函数 <class T> get(int index) 获取下标为index的元素 <class T> set(int index, <class T> element) 改变某个元素 void add(int index, <class T> element) 在下标为index处插入元素…

API信息

API 接口渗透测试

Neo4j的简单使用

1、创建节点 CREATE (:Person {name: Alice, age: 25, city: London}) CREATE (:Person {name: Bob, age: 30, city: New York}) CREATE (:Person {name: Charlie, age: 35, city: Paris})CREATE (:Interest {name: Music}) CREATE (:Interest {name: Sports}) CREATE (:Inter…

Redis实战案例9-封装Redis工具类

1. 封装Redis工具类 方法一和三主要解决缓存穿透的问题&#xff1b; 方法二和四主要解决缓存击穿的问题&#xff1b; 2. 方法一和三 缓存穿透的封装&#xff1b; private final StringRedisTemplate stringRedisTemplate; public CacheClient(StringRedisTemplate stringRedisT…

炫技亮点 Spring Websocket idle check原理

文章目录 原理配置附件Java_websocket空闲检测原理 Spring Websocket 是基于 WebSocket 协议的实现&#xff0c;它提供了一种在客户端和服务器之间实时双向通信的方式。其中&#xff0c;idle check&#xff08;空闲检查&#xff09;是一种机制&#xff0c;用于检测 WebSocket 连…

新项目,不妨采用这种架构分层,很优雅!

大家好&#xff0c;我是飘渺。今天继续更新DDD&微服务的系列文章。 在专栏开篇提到过DDD&#xff08;Domain-Driven Design&#xff0c;领域驱动设计&#xff09;学习起来较为复杂&#xff0c;一方面因为其自身涉及的概念颇多&#xff0c;另一方面&#xff0c;我们往往缺乏…

CF449D Jzzhu and Numbers 题解

题意 给定 A 1 . . . . A n A_1....A_n A1​....An​&#xff0c;选任意个数使得它们异或和为 0 0 0&#xff0c;求方案数。 思路 很朴素的想法是枚举每个数&#xff0c;然后进行 0-1 背包方案数统计&#xff0c;时间复杂度 O ( n n ) O(n \times n) O(nn)。 而根据前面几…

linux——解压和压缩

目录 1.压缩格式 2. tar命令 3.tar命令压缩 4. tar解压 5. zip命令压缩文件 6. unzip 命令解压 7. 总结 1.压缩格式 2. tar命令 3.tar命令压缩 4. tar解压 5. zip命令压缩文件 6. unzip 命令解压 7. 总结

DragGAN windows 部署逼坑指南

可参看B站视频&#xff1a;【DragGAN开源】DragGAN win11 部署逼坑指南_哔哩哔哩_bilibili 报错信息如下&#xff1a; Setting up PyTorch plugin "bias_act_plugin"... Failed! ninja is required to load c extensions 环境配置&#xff1a; cuda:12.1visual …

C++vector动态容器类

1、std::vector::push_back&#xff08;尾差&#xff09; 1.1、std::vector::operator[] 意思为&#xff1b; 访问元素 返回对vector容器中位置n的元素的引用。 void test_vector2() {vector<int> v1;v1.push_back(1);v1.push_back(2);v1.push_back(3);v1.push_back(4);/…

这个元宇宙平台真是拼了!新上线十套模板,帮您打造虚拟展览

导语&#xff1a; 随着数字技术的不断发展&#xff0c;线上虚拟展览正成为越来越多企业和组织的营销利器。在众多的虚拟展厅平台中&#xff0c;蛙色3DVR展厅凭借其独特的优势和特点&#xff0c;成为行业中备受关注的创新解决方案。 第一部分&#xff1a;展厅的优势和特点 1.便…

多元分类预测 | Matlab蛇群算法(SO)优化混合核极限学习机(HKELM)分类预测,多特征输入模型,SO-HKELM分类预测

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元分类预测 | Matlab蛇群算法(SO)优化混合核极限学习机(HKELM)分类预测,多特征输入模型,SO-HKELM分类预测 多特征输入单输出的二分类及多分类模型。程序内注释详细,直接替换数据就可以用。程序语言为matlab,…

三项认可,数据库透明加密获“年度优秀密码产品奖”

6月28日&#xff0c;杭州市商用密码应用协会第一届第三次会员大会成功召开&#xff0c;大会审议了2022年度工作总结及2023年度活动计划&#xff0c;发布《2023商用密码产业链总览》。为扎实推进杭州市商用密码、信创在各领域的应用推广&#xff0c;本次大会对在密码技术开发与创…

ATFX国际:原油收盘价连续5个交易日低于70美元

ATFX国际&#xff1a;大宗商品的价格是全球经济的晴雨表&#xff0c;当价格进入历史高位区间时&#xff0c;意味着商品需求旺盛&#xff0c;全球经济大概率处于繁荣期&#xff1b;当价格由历史高位向历史低位区间运行时&#xff0c;意味着全球经济大概率正从繁荣期向衰退期转变…

JKD动态代理

在Java的动态代理机制中&#xff0c;有两个重要的类和接口&#xff0c;一个是InvoInvocationHandler&#xff08;接口&#xff09;、Proxy&#xff08;类&#xff09;&#xff0c;这一个类和接口是我们动态代理所必须用到的。 InvocationHandler接口&#xff1a; 每个动态代理…

学习系统编程No.27【深入信号处理】

引言&#xff1a; 北京时间&#xff1a;2023/6/27/21:43&#xff0c;刚刚更新完这个星期的第一篇博客&#xff0c;现在刚好趁热打铁&#xff0c;看看写到11点左右&#xff0c;该篇博客能完成多少&#xff0c;并且今天和我预想的一样&#xff0c;通过早睡&#xff0c;成功在7点…