lib-zo,C语言另一个协程库,dns协程化, gethostbyname

lib-zo,C语言另一个协程库,dns协程化, gethostbyname

另一个 C 协程库 https://blog.csdn.net/eli960/article/details/146802313

本协程库 支持 DNS查询 协程化.

禁用所有 UDP 协程化

zvar_coroutine_disable_udp = 1;

禁用 53 端口的UDP 协程化

zvar_coroutine_disable_udp_53 = 1;

例子

// 包含协程相关的头文件
#include "coroutine.h"// 包含解析器相关的头文件
#include <resolv.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>// 定义并发实例的数量
static int instances = 10;
// 定义测试类型
static int test_type = 0;/*** @brief 执行域名查询测试的协程函数* * @param arg 传入的参数,为要查询的域名* @return void* 总是返回 0*/
static void *foo(void *arg)
{// 将参数转换为字符串类型,即要查询的域名const char *name = (char *)arg;// 用于存储 DNS 查询结果的缓冲区char answer[1024+1];
#ifdef res_nquery// 定义解析器状态结构体struct __res_state state;// 如果测试类型为 2,则初始化解析器状态if (test_type == 2) {res_ninit(&state);}
#endif// 循环执行 10 次查询操作for (int i = 0; i < 10; i++) {// 在第 3 次和第 6 次循环时暂停 1 秒if ((i == 3) || (i == 6)) {sleep(1);}// 如果测试类型为 0,使用 gethostbyname 进行查询if (test_type == 0) {// 调用 gethostbyname 函数进行域名查询struct hostent *hp = gethostbyname(name);if (hp) {// 查询成功,打印域名及其官方名称printf("%s: %s\n", name, hp->h_name);} else {// 查询失败,打印未找到信息printf("%s: not found\n", name);}}// 如果测试类型为 1,使用 res_query 进行查询if (test_type == 1) {// 调用 res_query 函数进行 DNS 查询int ret = res_query(name, C_IN, T_A, (unsigned char *)answer, 1024);// 打印查询结果printf("res_query %s: %d\n", name, ret);}
#ifdef res_nquery// 如果测试类型为 2,使用 res_nquery 进行查询if (test_type == 2) {// 调用 res_nquery 函数进行 DNS 查询int ret = __res_nquery(&state, name, C_IN, T_A, (unsigned char *)answer, 1024);// 打印查询结果printf("res_nquery %s: %d\n", name, ret);}
#endif}
#ifdef res_nquery// 如果测试类型为 2,关闭解析器状态if (test_type == 2) {res_nclose(&state);}
#endif// 完成一个实例的查询,实例数量减 1instances--;return 0;
}/*** @brief 监控实例数量,当所有实例完成后通知协程停止的函数* * @param arg 传入的参数,未使用* @return void* 总是返回 0*/
static void *foo2(void *arg) 
{// 当还有未完成的实例时,持续等待while(instances) {sleep(1);}// 所有实例完成后,再等待 1 秒sleep(1);// 通知协程基础框架停止运行zcoroutine_base_stop_notify(0);return 0;
}/*** @brief 初始化函数,处理命令行参数并输出使用说明* * @param argc 命令行参数的数量* @param argv 命令行参数数组* @return int 初始化成功返回 1,失败返回 0*/
static int _init(int argc, char **argv)
{// 输出程序的使用说明printf("USAGE: \n%s domain1 domain2 [ test_type ] [ disable_udp]\n", argv[0]);printf("  test_type:\n");printf("    0\t\t # gethostbyname(default)\n");printf("    1\t\t # res_query\n");
#ifdef res_nqueryprintf("    2\t\t # res_nquery\n");
#elseprintf("    2\t\t # res_nquery, unsupported\n");
#endifprintf("  disable_udp:\n");printf("    udp\t\t # disable all udp coroutine swap\n");printf("    53\t\t # disable udp(53) coroutine swap\n");// 如果命令行参数少于 3 个,说明输入不完整,返回 0if (argc < 3) {return 0;}printf("\n");// 标记是否显示了测试类型信息int type_show = 0;// 处理第 3 个及以后的命令行参数for (int i = 3; i < argc; i++) {const char *s = argv[i];if (!strcmp(s, "0")) {// 测试类型为 0,使用 gethostbyname 进行查询printf("######## test gethostbyname\n");type_show = 1;test_type = 0;} else if (!strcmp(s, "1")) {// 测试类型为 1,使用 res_query 进行查询printf("######## test req_query\n");type_show = 1;test_type = 1;} else if (!strcmp(s, "2")) {// 测试类型为 2,使用 res_nquery 进行查询printf("######## test req_nquery\n");type_show = 1;test_type = 2;} else if (!strcmp(s, "udp")) {// 禁用所有 UDP 协程交换zvar_coroutine_disable_udp = 1;printf("######## disable all udp\n");} else if (!strcmp(s, "53")) {// 禁用 UDP 端口 53 的协程交换zvar_coroutine_disable_udp_53 = 1;printf("######## disable udp(53)\n");} else {// 未知参数,输出提示信息printf("######## unknown %s\n", s);}}// 如果未指定测试类型,使用默认的 gethostbyname 测试if (type_show == 0) {printf("######## test gethostbyname, default\n");}
#ifndef res_nquery// 如果系统不支持 res_nquery,输出提示信息printf("######## res_nquery unsupported in your system\n");
#endifprintf("\n");return 1;
}/*** @brief 程序入口函数* * @param argc 命令行参数的数量* @param argv 命令行参数数组* @return int 程序退出状态码*/
int main(int argc, char **argv)
{// 调用初始化函数,如果初始化失败,直接返回 0if (_init(argc, argv) == 0) {return 0;}// 初始化协程基础框架zcoroutine_base_init();// 创建协程进行域名查询for (int i = 0; i < instances/2; i++) {zcoroutine_go(foo, argv[1], 0);zcoroutine_go(foo, argv[2], 0);}// 创建监控协程zcoroutine_go(foo2, 0, 0);// 启动协程基础框架运行zcoroutine_base_run();// 销毁协程基础框架zcoroutine_base_fini();return 0;
}

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

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

相关文章

Java第三节:新手如何用idea创建java项目

作者往期文章&#xff1a; Java第一节&#xff1a;debug如何调试程序&#xff08;附带源代码&#xff09;-CSDN博客 Java第二节&#xff1a;debug如何调试栈帧链&#xff08;附带源代码&#xff09;-CSDN博客 步骤一 ​ 步骤二 ​ 步骤三 创建src文件夹包含main文件&#…

(一)从零开始:用 LangChain 和 ZhipuAI 搭建简单对话

最近一直在研究如何用 LangChain 和 ZhipuAI 搭建一个智能对话系统&#xff0c;发现这个组合真的非常强大&#xff0c;而且实现起来并不复杂。今天就来分享一下我的学习过程和一些心得体会&#xff0c;希望能帮到同样在探索这个领域的小伙伴们。 一、 环境搭建&#xff1a;从零…

uniapp地图导航及后台百度地图回显(v2/v3版本)

百度地图申请地址&#xff1a;控制台 | 百度地图开放平台 效果&#xff1a; 1.后台 1.1申请百度地图APi 1.2 引入百度地图 <script type"text/javascript" src"//api.map.baidu.com/api?v3.0&ak自己百度生气apikey"></script> 1.3 v2组…

Java模板方法模式详解

模板方法模式详解 一、模式定义 模板方法模式(Template Method Pattern)定义一个操作中的算法骨架&#xff0c;将某些步骤延迟到子类实现。 二、核心结构 1. 抽象模板类 public abstract class AbstractTemplate {// 模板方法&#xff08;final防止子类覆盖&#xff09;pu…

(5)模拟后——Leonardo的可视化操作

1 引言 经过n天的模拟&#xff0c;模拟结果相信已经到手&#xff0c;但如何进行分析呢。 首先是可视化&#xff0c;可视化方法基本分为两类 基于ENVI-met自带软件Leonardo的可视化操作基于NetCDF的可视化操作 2 模拟结果变量说明 首先&#xff0c;模拟结果会有以下几个文件…

基于YOLO11实例分割与奥比中光相机的快递包裹抓取点检测

本博客来源于CSDN机器鱼&#xff0c;未同意任何人转载。 更多内容&#xff0c;欢迎点击本专栏&#xff0c;查看更多内容。 0 引言 项目采用六轴机械臂搭配末端真空吸盘&#xff0c;从无序包裹中抓取想要的包裹。AI算法需要提供各包裹的抓取点的3D坐标与3D姿态。由于快递包裹含…

【学Rust写CAD】31 muldiv255函数(muldiv255.rs)

源码 // Calculates floor(a*b/255 0.5) #[inline] pub fn muldiv255(a: u32, b: u32) -> u32 {// The deriviation for this formula can be// found in "Three Wrongs Make a Right" by Jim Blinn.let tmp a * b 128;(tmp (tmp >> 8)) >> 8 }代…

蓝桥云客--团队赛

2.团队赛【算法赛】 - 蓝桥云课 问题描述 蓝桥杯最近推出了一项团队赛模式&#xff0c;要求三人组队参赛&#xff0c;并规定其中一人必须担任队长。队长的资格很简单&#xff1a;其程序设计能力值必须严格大于其他两名队友程序设计能力值的总和。 小蓝、小桥和小杯正在考虑报名…

#Linux内存管理# 假设设备上安装了一块2G的物理内存,在系统启动时,ARM Linux内核是如何映射的?

在ARM Linux系统启动过程中&#xff0c;对2GB物理内存的映射实现分为以下几个关键阶段&#xff1a; 一、设备树解析与内存信息获取 1.设备树定义 物理内存范围通过设备树&#xff08;DTS&#xff09;的memory节点定义&#xff0c;例如&#xff1a; memory60000000 { device_ty…

使用MATIO库读取Matlab数据文件中的多维数组

使用MATIO库读取Matlab数据文件中的多维数组 MATIO是一个用于读写Matlab数据文件(.mat)的开源C库。下面是一个完整的示例程序&#xff0c;展示如何使用MATIO库读取Matlab数据文件中的多维数组。 示例程序 #include <stdio.h> #include <stdlib.h> #include <…

react+antd中做一个外部按钮新增 表格内部本地新增一条数据并且支持编辑删除(无难度上手)

需求背景 做一个可以外部控制新增刷新表格 表格内部可以编辑删除 类似下方需求图 实现过程 因为我实现时有两个这样的表格 所以我的事件里面会有传参用于判断 可忽略传参判断部分 代码中有formatMessage部分为国际化可忽略 <div style{{ marginBottom: 10px, margin…

【深度学习新浪潮】视觉与多模态大模型文字生成技术研究进展与产品实践

一、研究进展 跨模态架构创新 原生多模态模型:微软KOSMOS系列通过统一框架支持文本、图像、语音等多模态输入输出,实现跨模态推理与迁移。例如,KOSMOS-2.5可处理文本密集图像,生成结构化文本描述,并通过重采样模块优化视觉与语言的对齐。混合专家架构:第三代模型(如Deep…

重生之我是去噪高手——diffusion model

diffusion model是如何运作的&#xff1f; 想象一下&#xff0c;你有一张清晰的图片。扩散模型的核心思想分为两个过程&#xff1a; 前向过程&#xff08;Forward Process / Diffusion Process&#xff09;&#xff1a;逐步加噪反向过程&#xff08;Reverse Process / Denois…

华为项目管理“六步一法”方法论全解析:目标确认、项目活动分解与日事清系统协同

大家都知道&#xff0c;项目管理在现在各个行业里都是越来越重要了。 要是搞不好&#xff0c;项目就会拖沓&#xff0c;甚至走向失败。 今天咱们就来聊聊华为是怎么做项目管理的&#xff0c;比较知名的就是它们的“六步一法”。华为通过“六步一法”来进行项目管理&#xff0…

OpenCV 图形API(9)用于执行矩阵与标量之间的逐元素除法操作函数divC()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 矩阵除以标量。 该函数 divC 将矩阵 src 的每个元素除以给定的标量值&#xff1a; dst(I) saturate(src(I)*scale/divisor) \texttt{dst(I) s…

单例模式(懒汉模式/饿汉模式)

相关概念参考&#xff1a;【C】C 单例模式总结&#xff08;5种单例实现方法&#xff09;_单例模式c实现-CSDN博客 #include<iostream>class LazySingle{ public:static LazySingle& getInstance(){static LazySingle instance;return instance;}void hello(){std::c…

RocketMQ初认识

ProducerCustomerNameServer: Broker的注册服务发现中心BrokerServer:主要负责消息的存储、投递和查询以及服务高可用保证 RocketMQ的集群部署&#xff1a; 单个master的分支多个Master 模式&#xff1a;集群中有多个 Master 节点&#xff0c;彼此之间相互独立。生产者可以将消…

Maven/Gradle的讲解

一、为什么需要构建工具? 在理解 Maven/Gradle 之前,先明确它们解决的问题: ​​依赖管理​​:项目中可能需要引入第三方库(如 Spring、JUnit 等),手动下载和管理这些库的版本非常麻烦。​​标准化构建流程​​:编译代码、运行测试、打包成 JAR/WAR 文件等步骤需要自动…

基于SSM的车辆管理系统的设计与实现(代码+数据库+LW)

摘要 当下&#xff0c;正处于信息化的时代&#xff0c;许多行业顺应时代的变化&#xff0c;结合使用计算机技术向数字化、信息化建设迈进。以前企业对于车辆信息的管理和控制&#xff0c;采用人工登记的方式保存相关数据&#xff0c;这种以人力为主的管理模式已然落后。本人结…

嵌入式硬件篇---JSON通信以及解析

文章目录 前言一、JSON特点语法简单数据格式灵活轻量化跨语言使用二、JSON数据结构对象数组三、JSON在单片机之间通信的应用数据封装与传输四、JSON示例代码五、JSON在上位机与单片机之间通信的应用数据交互六、JSON示例代码七、JSON解析与生成解析生成八、Python中的数据解析1…