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

2023-11-13

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个线程。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

libevent(6)windows上使用iocp网络模型 的相关文章

随机推荐

  • 从零开始搭建物联网平台(四)EMQ-X消息中间件

    物联网的消息中间件有很多 如ActiveMq RabbitMq Emq 以及自己实现的netty borker 这里为什么要选择EMQ呢 首先 在使用emqx之前我用过ActiveMq由于是国外开发的 对国内产品的支持不够好 文档和社区也远
  • c++ 使用libcurl下载网络图像

    include
  • 解决ERROR: This script does not work on Python 2.7 The minimum supported Python version is 3.7

    前言 最近因项目需要 部署区块链的网络时候 需要一个问题 运行下载的install sh脚本时候 提示出错 然后找到该脚本文件 找到对应报错的语句 发现是python的pip没有下载好的缘故 解决 问题原因知道了 然后就下载一个Pip就好
  • 家政服务小程序制作:提升生活质量、解决烦恼

    在现代快节奏的生活中 家政服务扮演着越来越重要的角色 借助家政服务小程序的制作 为用户提供便捷可靠的家务帮助已成为一种新的选择 那么家政服务小程序的制作过程是怎么样的呢 带来的好处有哪些呢 1 家政服务小程序的定义与优势 小程序是微信里面的
  • 第十八讲:神州三层交换机DHCP中继服务的配置

    当DHCP客户机和DHCP服务器不在同一个网段时 由DHCP中继传递DHCP报文 增加DHCP中继功能的好处是不必为每个网段都设置DHCP服务器 同一个DHCP服务器可以为很多个子网的客户机提供网络配置参数 即节约了成本又方便了管理 这就是
  • 流水灯实验过程

    流水灯 1 基本思路 先让P1口全为高电平 灯不亮 通过为左移 位右移动来实现依次点亮LED灯一个具有注脚的文本 1 用for循环语句嵌套 写程序 include
  • 在SpringBoot中整合其它技术

    在SpringBoot中整合其它技术 前言 一 SpringBoot整合SpringMVC 1 修改web端口 2 访问静态资源 3 添加拦截器 4 更详细的日志 二 SpringBoot整合MyBatis 1 整合连接池 2 整合myba
  • 老板说,可以在家办公,顿时办公室沸腾了……

    在美国的IT行业中 在家办公 WFH 仍然不是普遍现象 这有点匪夷所思 因为 1 员工渴望在家办公 2 有些雇主已经提供在家办公 3 反对在家办公的意见不能成立 在家办公 并不意味着 100 在家工作 从不需要去办公室 而是公司应该提供这些
  • opencv进行简单的裂缝检测

    师弟最近要使用四旋翼进行桥梁探伤 主要是用运动相机搭载在四轴上检测裂缝 就顺便搞了一下有关于裂缝检测的图像处理 算法比较简单 没有考虑太多复杂情况 在简单墙面背景下基本可以找到裂缝并框定 基本思路为 先转换彩色图为灰度图 然后进行自适应局部
  • 区块链能解决媒体行业哪些问题?

    对于最近炙手可热的区块链技术 最近流行起这样一句笑言 没有什么问题是人工智能解决不了的 如果有 那就用区块链解决 这句话虽然略显夸张 但也反映出人们对于区块链技术的高度期待 区块链有三个显著的特点 去中心化 可追溯 不可篡改 这三个特点为它
  • Linux 中不适用功能键切换TTY

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 本简要指南介绍了在类 Unix 操作系统中如何在不使用功能键的情况下切换 TTY 在进一步讨论之前 我们将了解 TTY 是什么 正如在 AskUbuntu 论坛的一个答案
  • C#中关于在一个数据库同时修改2个数据的语法使用!

    SqlCommand cmd new SqlCommand update Student set Sname updateName where Sno Sno con SqlCommand cmd2 new SqlCommand updat
  • AES对称加密工具类(GCM)

    import java io UnsupportedEncodingException import java security InvalidAlgorithmParameterException import java security
  • Java实现图片格式转换(通过ImageIO)

    文章目录 粗略介绍ImageIO 一 遍历文件夹 二 转换图片格式 视频效果演示 粗略介绍ImageIO ImageIO是javax imageio包下的一个类 用于实现Java中关于图片输入输出的一种类 这个类中所有方法均为静态方法 因此
  • 2.9 UiPath中断活动Continue的介绍和使用

    Continue的介绍 跳过当前For Each 循环内的迭代 结束本次循环 Continue控件只能用于For Each 循环中 Continue在UiPath中结合For Each循环的使用 打开设计器 在设计库中新建一个Flowcha
  • ODrive踩坑(四)AS5047P-SPI绝对值磁编码器,不需每次上电校准无刷电机,直接上电可用

    前几篇介绍了ODrive在Windows下的使用环境搭建 以及TLE5012B AS5047P的ABI配置 ODrive教程资源导航 ODrive踩坑 一 windows下使用环境的搭建 odrivetool及USB驱动的安装 ODrive
  • 软件版本比较之——Java算法实现软件版本比较

    最近遇到一个开发中的小问题 软件版本比较 例如2 12 3和2 2 1这两个版本号 哪个更新 其实 客户端版本检测更新 检测后台是否有更新版本可更新 Java中最简单的一种方法便是获取当前客户端版本号 与服务端提供的最新版本号做equals
  • 被难倒了! 针对高级前端的八个级JavaScript面试问题

    JavaScript 是一种功能强大的语言 也是构建现代 Web 的基础之一 这种强大的语言也有一些自己的怪癖 例如 你知道 0 0 会计算为 true 或者 Number 会返回 0 吗 有时候 这些怪癖会让你百思不得其解 甚至让你怀疑
  • 如何查看Windows 桌面壁纸的位置

    有3个位置 默认系统壁纸的位置 主题壁纸图片位置 系统主题文件位置 1 系统壁纸位置 windir Web Wallpaper 2 主题壁纸图片位置 userprofile AppData Local Microsoft Windows T
  • libevent(6)windows上使用iocp网络模型

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