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

Zmq适配Win7 SP0 / Win XP/ Win 2k

1.目的

由于发布版本的libzmq使用了较多新的系统特性,导致在低版本windows平台上无法使用。
因此,需要对zmq源码进行修改以适配低版本的系统,如Win7 SP0,Win XP,Win2003等等。

2.Win7 SP0

#if defined ZMQ_HAVE_WINDOWS && defined WSA_FLAG_NO_HANDLE_INHERIT// if supported, create socket with WSA_FLAG_NO_HANDLE_INHERIT, such that// the race condition in making it non-inheritable later is avoidedconst fd_t s = WSASocket (domain_, type_, protocol_, NULL, 0,WSA_FLAG_OVERLAPPED|WSA_FLAG_NO_HANDLE_INHERIT);
#elseconst fd_t s = socket (domain_, type_, protocol_);
#endif

zmq在高版本系统上为了通信安全考虑,使用了WSA_FLAG_NO_HANDLE_INHERIT标志,但是由于WSA_FLAG_NO_HANDLE_INHERIT这个标志是从 Windows 7 with SP1, Windows Server 2008 R2 with SP1开始支持的,因此在Win7 SP0系统上会出现socket连接无法初始化的问题。

解决方法:
方案1:取消WSA_FLAG_NO_HANDLE_INHERIT标志的使用
方案2:参考Win XP

3.Win XP

由于Windows XP系统与现代操作系统差别较大,系统库差异较大,因此,需要对项目进行较大的变更。

1. 选择VS对应版本的工程文件

​ 以VS2013为例 :libzmq-4.3.4\builds\deprecated-msvc\vs2013\libzmq.sln

2. 选择支持XP系统的工具集

Windows XP (v120_xp)

3. 项目文件变更
文件名操作
src\channel.cpp新增
src\endpoint.cpp新增
src\ip_resolver.cpp新增
src\peer.cpp新增
src\raw_engine.cpp新增
src\stream_connecter_base.cpp新增
src\stream_engine_base.cpp新增
src\stream_listener_base.cpp新增
src\tweetnacl.c新增
src\v3_1_encoder.cpp新增
src\zmtp_engine.cpp新增
src\stream_engine.cpp删除
4. 预处理器定义

ZMQ_IOTHREAD_POLLER_USE_SELECT;
ZMQ_POLL_BASED_ON_SELECT;
ZMQ_HAVE_CURVE;
ZMQ_USE_TWEETNACL;

5. 代码兼容

1)ConditionVariable最低支持的客户端版本是Windows Vista,因此若支持C++11中的std::condition_variable_any,则可以使用ZMQ_USE_CV_IMPL_STL11定义规避此问题。否则,需要使用第三方库或者利用事件(event)或信号量(semaphore)来实现条件变量。

#include "windows.hpp"namespace zmq
{
class condition_variable_t
{public:inline condition_variable_t () { InitializeConditionVariable (&_cv); }inline int wait (mutex_t *mutex_, int timeout_){int rc = SleepConditionVariableCS (&_cv, mutex_->get_cs (), timeout_);if (rc != 0)return 0;rc = GetLastError ();if (rc != ERROR_TIMEOUT)win_assert (rc);errno = EAGAIN;return -1;}inline void broadcast () { WakeAllConditionVariable (&_cv); }private:CONDITION_VARIABLE _cv;ZMQ_NON_COPYABLE_NOR_MOVABLE (condition_variable_t)
};
}

2)if_indextoname最低支持的客户端版本是Windows Vista。因此,需要在XP上重新实现这个方法。

 #include <netioapi.h>static PCHAR WINAPI if_indextoname_custom (__in NET_IFINDEX InterfaceIndex,__out_ecount (IF_NAMESIZE)PCHAR InterfaceName)
{typedef PCHAR (WINAPI * fn_if_indextoname) (NET_IFINDEX InterfaceIndex,PCHAR InterfaceName);PCHAR ret = NULL;if (HMODULE hDll = LoadLibraryA ("Iphlpapi.dll")) {fn_if_indextoname _if_indextoname =(fn_if_indextoname) GetProcAddress (hDll, "if_indextoname");if (_if_indextoname)ret = _if_indextoname (InterfaceIndex, InterfaceName);FreeLibrary (hDll);}return ret;
}

4.Win2000

由于windows2000的版本过低,因此只能使用较低版本的开发工具VS2005。

1. 选择适当版本的VS工程文件

libzmq-4.3.4\builds\deprecated-msvc\vs2008\libzmq.sln

2. 工程文件变更
解决方案:
Microsoft Visual Studio Solution File, Format Version 10.00
# Visual Studio 2008
↓
Microsoft Visual Studio Solution File, Format Version 9.00
# Visual Studio 2005工程文件:
<VisualStudioProject ProjectType="Visual C++" Version="9,00"
或者
<VisualStudioProject ProjectType="Visual C++" Version="9.00"
↓
<VisualStudioProject ProjectType="Visual C++" Version="8.00"编码:
UTF-8 BOM → ANSI换行符:
LF → CRLF
3. 步骤3/4与XP相同

省略

4. 代码兼容

1)ConditionVariable
与XP相同,省略
2)GetAdaptersAddresses
由于resolve_nic_name函数业务相关性较低,因此采用NOP方式规避。

    if (!resolved && _options.allow_nic_name ()) {//  Try to resolve the string as a NIC name.const int rc = -1; // resolve_nic_name (ip_addr_, addr_str);errno = ENODEV;//......}

3)getaddrinfo
虽然windows2000 原生不支持getaddrinfo函数,但是可以通过windows 2000 ipv6 预览版扩展系统功能,以支持getaddrinfo。

#include <ws2tcpip.h>
#include <wspiapi.h>  //在<ws2tcpip.h>后包含<wspiapi.h>
5. 安装windows 2000 ipv6 预览版

相关文章:

Zmq适配Win7 SP0 / Win XP/ Win 2k

1.目的 由于发布版本的libzmq使用了较多新的系统特性&#xff0c;导致在低版本windows平台上无法使用。 因此&#xff0c;需要对zmq源码进行修改以适配低版本的系统&#xff0c;如Win7 SP0&#xff0c;Win XP&#xff0c;Win2003等等。 2.Win7 SP0 #if defined ZMQ_HAVE_WIN…...

掌握Python的X篇_30_使用python解析网页HTML

本篇将会介绍beutifulsoup4模块&#xff0c;可以用于网络爬虫、解析HTML和XML&#xff0c;对于没有接触过前端&#xff0c;不了解HTML是如何工作的&#xff0c;需要先解释一下什么事HTML。 1. HTML 网页中的各种布局等的背后都是非常简单的纯文本格式&#xff0c;那种格式称为…...

广联达OA前台sql注入+后台文件上传漏洞复现分析

文章目录 前言资产特征前台sql注入后台文件上传解决办法 前言 最近看到广联达OA的前端sql注入和后端文件上传漏洞联动的poc 广联达科技股份有限公司以建设工程领域专业应用为核心基础支撑&#xff0c;提供一百余款基于“端云大数据”产品/服务&#xff0c;提供产业大数据、产业…...

No view found for id 0x7f0901c3 for fragment解决以及线上bug排查技巧

情景再现 开发这么久&#xff0c;不知道你们是否也经历过这样的情况&#xff0c;测试或者用户&#xff0c;反馈app闪退&#xff0c;结果你自己打开开发工具&#xff0c;去调试&#xff0c;一切正常&#xff0c;然后闪退还是存在&#xff0c;只是在开发环境中不能重现。这种情况…...

腾讯云CVM服务器竞价实例是什么?和按量计费有什么区别?

腾讯云服务器CVM计费模式分为包年包月、按量计费和竞价实例&#xff0c;什么是竞价实例&#xff1f;竞价实例和按量付费相类似&#xff0c;优势是价格更划算&#xff0c;缺点是云服务器实例有被自动释放风险&#xff0c;腾讯云服务器网来详细说下什么是竞价实例&#xff1f;以及…...

Kali Linux助您网络安全攻防实战

Kali Linux&#xff1a;黑客与防御者的神器 Kali Linux是一款专为网络安全测试和攻防实践而设计的操作系统。它汇集了大量的安全工具&#xff0c;可以用于渗透测试、漏洞扫描、密码破解等任务&#xff0c;不仅为黑客提供了强大的攻击能力&#xff0c;也为安全防御者提供了测试和…...

JavaEE初阶:多线程 - 编程

1.认识线程 我们在之前认识了什么是多进程&#xff0c;今天我们来了解线程。 一个线程就是一个 "执行流". 每个线程之间都可以按照顺讯执行自己的代码. 多个线程之间 "同时" 执行 着多份代码. 引入进程这个概念&#xff0c;主要是为了解决并发编程这样的…...

一种多策略下RabbitMQ的延时队列实现

1.为什么会用到延时队列? 场景: 最近在开发一款系统中遇到这样一个场景,A系统开通套餐需要把套餐信息以邮件的形式发送给相关工作人员,经过人工审核通过后,在B系统里面开通,A系统会调B系统套餐列表接口查询套餐是否开通成功,开通成功则从A系统去完成订单,假如超过设定时间未开…...

解密 AI 客服;在不同硬件设备上运行大型语言模型的可能性

&#x1f989; AI新闻 &#x1f680; 微软必应首席执行官称必应聊天优于OpenAI的GPT-4&#xff0c;但成本更高 摘要&#xff1a;微软必应的首席执行官米哈伊尔・帕拉欣表示&#xff0c;必应聊天表现优于OpenAI的GPT-4&#xff0c;但使用了更高成本的检索增强推理技术。必应聊…...

问题:【IntelliJ IDEA】解决idea自动声明变量加finall修饰符问题

问题:【IntelliJ IDEA】解决idea自动声明变量加finall修饰符问题 场景复现 1 new String() 2 快捷方式生成变量 final修饰的 final String s new String();步骤一&#xff1a;确保settings配置信息 settings-----》Editor------》Code Style--------》java下的这两个选项不…...

SpringBoot基于Zookeeper实现分布式锁

文章目录 问题背景前言实现搭建Zookeeper容器引入依赖ZK客户端的配置类ZK客户端的工厂类注入bean构建测试类 问题背景 研究分布式锁&#xff0c;基于ZK实现&#xff0c;需要整合到SpringBoot使用 前言 参考自SpringBoot集成Curator实现Zookeeper基本操作&#xff0c;Zookeeper入…...

AT89C51单片机实现单片机串口互动(中断方式,单片机--单片机,应答)

说一下功能&#xff1a;客户机发送0x01到服务机 2服务单片机应答0xf2到客户机 3客户机接收到0xf2,发送信息153432这6个数字到服务机 4client发送完信息后发送0xaa结束通信 5server接收到0xaa后回复0xaa结束通信&#xff0c;从此老死不相往来 看代码&#xff1a; //发送端…...

九耶丨阁瑞钛伦特-请说说你在工作中的PRD文档是如何撰写的?

1、背景说明&#xff08;解释清楚为什么要做这样一件事&#xff0c;以及做这件事的价值&#xff0c;先把观点拉齐&#xff0c;才方便接下来的工作开展&#xff09; 简要介绍与项目相关的背景信息、项目要满足的用户需求、开展项目的主要原因、项目期望上线时间、项目涉及的具体…...

Android免打包多渠道统计如何实现

摘要&#xff1a; 实际上只要完成1-2步即可实现多渠道打包&#xff0c;这也意味着&#xff0c;只要每次更新App时给出一个原始包&#xff0c;运营人员就能在后台自己进行操作管理&#xff0c;简单快捷到全程无需开发人员参与。 我们都知道&#xff0c;Android 市场被分割成几十…...

Apipost CICD怎么配置?

配置CI/CD Apipost自动化测试新增CI/CD&#xff0c;配置运行环境、循环次数、间隔停顿后点击保存会生成命令&#xff0c;在安装Apipost的服务器中输入命令即可运行测试脚本。 自动化测试 创建自动化测试脚本在创建好的测试用例中选择「CICD」&#xff0c;点击新建&#xff0c…...

utf-8和utf-8 mb4区别

UTF-8&#xff08;Unicode Transformation Format-8&#xff09;和UTF-8MB4&#xff08;UTF-8 Multibyte 4-byte&#xff09;是字符编码方案&#xff0c;用于表示 Unicode 字符集中的字符。它们之间的主要区别在于编码范围。 UTF-8&#xff1a;UTF-8 是一种变长编码方式&#x…...

考研 408 | 【计算机网络】 应用层

导图 网络应用模型 客户/服务器&#xff08;c/s&#xff09;模型 P2P模型 DNS 域名 域名服务器 域名解析过程 文件传输协议FTP FTP服务器和用户端 FTP工作原理 电子邮件 电子邮件的信息格式 组成结构 邮件服务器的功能&#xff1a; 1.发送&接收邮件 2.给发件人报告邮…...

设计模式-单例

概述 在类加载后&#xff0c;整个系统只有一个实例类 饿汉式 public class Mg1 {private static final Mg1 INSTANCE new Mg1();private Mg1(){}public static Mg1 getInstance(){return INSTANCE;}public static void main(String[] args) {System.out.println(Mg1.getIns…...

mysql截取最后一个字符之前的数据

1、mysql截取最后一个字符之前的数据 select --截取斜杠之前的数据REVERSE(SUBSTR(REVERSE(SPNH-dfg-2012) ; --截取斜杠后的数据 INSTR(REVERSE(SPNH-fg-2012),-)1))2、mysql获取最后一个字符后的数据 select SUBSTRING_INDEX(SPNH-dfg-2012,-,-1) 3、mysql更新某个字段…...

Flutter 中,ListView 中需要放置 ListView 需要怎么处理才高效?

问题及场景 ListView 是 Flutter 开发者第一个学习到的 Widget&#xff0c;因为它可以滑动。一切都会运行得很好&#xff0c;直到 ListView 中的 Item 本身也是一个 ListView。你可能会看到 Flutter 建议你将内部的 ListView 的ShrinkWrap 属性设置为 True。虽然错误消除了&am…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...