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.pswp.cn/bicheng/75768.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/75768.shtml
英文地址,請注明出處:http://en.pswp.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…