使用ACL庫編寫DNS查詢應用

2021-08-24 19:52:55 字數 2263 閱讀 6538

在用c/c++寫程式時,若要根據網域名稱查詢其對應的ip位址,大家一般會用到 gethostbyname 的標準函式,如若要查詢 www.sina.com.cn 網域名稱呼叫 gethostbyname 時,該函式首先會查詢本機 hosts 檔案裡的條目,若該配置檔案裡沒有對應網域名稱,則該函式會向本機配置的dns伺服器傳送查詢請求,然後將dns伺服器的返回結果反給使用者。該函式的使用較為簡單,但卻有乙個限制,如果針對某個網域名稱,在內外網有不同的ip位址時就不好辦了,假設該網域名稱由內網dns(192.168.1.33)解析時的ip位址為 192.168.1.22, 由外網dns(211.239.1.33)解析因為gethostbyname使用系統統一的 resolve.conf裡的dns伺服器配置位址。要解決這個問題,最好的方式就是直接連線dns伺服器以遵循dns協議格式傳送查詢指令,acl庫里便實現dns協議的通訊及協議解析功能(在 lib_acl/src/net/dns/ 目錄下),下面介紹如何使用acl的dns庫進行網域名稱查詢。

首先列出本例子用到的函式介面說明:

/**

* 建立乙個dns查詢物件

* @param dns_ip dns的ip位址

* @param dns_port dns的port

* @return 新建立的查詢物件

*/acl_api acl_res *acl_res_new(const char *dns_ip, unsigned short dns_port);

/** * 釋放乙個dns查詢物件

* @param res dns查詢物件

*/acl_api void acl_res_free(acl_res *res);

/** * 查詢某個網域名稱的ip位址

* @param res dns查詢物件

* @param domain 要查詢的網域名稱

* @return 查詢的結果集

*/acl_api acl_dns_db *acl_res_lookup(acl_res *res, const char *domain);

/** * 根據錯誤號獲得查詢失敗的原因

* @param errnum 錯誤號

* @return 錯誤資訊

*/acl_api const char *acl_res_strerror(int errnum);

/** * 獲得當前查詢的錯誤資訊

* @param res dns查詢物件

* @return 錯誤資訊

*/acl_api const char *acl_res_errmsg(const acl_res *res);

然後給出具體例子如下:

#include "lib_acl.h"

#include static int dns_lookup(const char *domain, const char *dns_ip,

unsigned short dns_port)

while (0)

/* 建立乙個dns查詢物件 */

res = acl_res_new(dns_ip, dns_port);

/* 向dns伺服器傳送查詢指令並接收處理結果 */

dns_db = acl_res_lookup(res, domain);

if (dns_db == null)

/* 遍歷查詢結構並輸出至標準輸出 */

printf("type\tttl\tip\t\tnet\t\tqid\t\n");

acl_foreach(iter, dns_db)

return (0);

}int main(int argc acl_unused, char *argv acl_unused)

ok,這個例子很簡單,完全滿足剛才所說的需求。此外,該例子用到了幾個結構型別,如下(也可以直接查詢 lib_acl/include/net/ 目錄下的標頭檔案說明):

/* dns查詢物件結構定義 */

typedef struct acl_res acl_res;

/** * 主機位址結構

*/typedef struct acl_hostname acl_host_info;

typedef struct acl_hostname acl_hostname;

/** * dns查詢結果集

*/typedef struct acl_dns_db acl_dns_db;

至於文所提到的迭代器遍歷過程,請參考文章:c語言中迭代器的設計與使用

個人微博:

qq 群:242722074

使用GNOME庫編寫應用程式

rel start href index.html title 使用gnome庫編寫應用程式 rel next href ch01.html title chapter 1.致謝 許可證及其它 使用gnome庫編寫應用程式 next the gnome project abstract 在本教程中,...

使用dig查詢dns解析

一般來說linux下查詢網域名稱解析有兩種選擇,nslookup或者dig,而在使用上我覺得dig更加方便順手。如果是在debian下的話,只要裝上dnsutils這個包就可以使用dig命令了。最基本的使用方式就是 dig www.oolec.com 即查詢網域名稱的a記錄,查詢的dns伺服器將採用...

使用jdbc編寫查詢框架

一 使用jdbc編寫查詢框架 除sql語句不同之外,根據操作的實體不同,對resultset的對映也各不相同,因此可義乙個query方法,除以引數形式接收變化的sql語句外,可以使用策略模式由qurey方法的呼叫者決定如何把resultset中的資料對映到實體物件中 在dbmanager類中 此類是...