在用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"ok,這個例子很簡單,完全滿足剛才所說的需求。此外,該例子用到了幾個結構型別,如下(也可以直接查詢 lib_acl/include/net/ 目錄下的標頭檔案說明):#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)
/* dns查詢物件結構定義 */至於文所提到的迭代器遍歷過程,請參考文章:c語言中迭代器的設計與使用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;
個人微博:
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類中 此類是...