1. 程式人生 > >前面兩篇文章的一點應用-DNS

前面兩篇文章的一點應用-DNS

int InitSimpleDNS(void)
	dns_fd = socket(sockaddr.sin_family, SOCK_DGRAM, 0);//建立一個IPV4的socket,基於UDP資料套接字
	ret = setsockopt(dns_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) ;
//設定SO_REUSEADDR,呼叫closesocket(一般不會立即關閉而經歷TIME_WAIT的過程)後想繼續重用該socket:
	 ret = bind(dns_fd, &sockaddr, sizeof(sockaddr)) ;//給socket返回值dns_fd,賦一個地址&sockaddr
	 pthread_create( &pthrd_id,NULL,(void *) simple_dns_proc,NULL ))//建立一個執行緒simple_dns_proc

static void *simple_dns_proc(void *handle)
	FD_ZERO(&dns_rset);//清空&dns_rset集合
	get_answer_ip(&answer_addr);
	FD_SET(dns_fd, &dns_rset); //將一個給定的檔案描述符(dns_fd)加入集合(dns_rset)之中
	ret = dns_rcv_query(&sockaddr);
	FD_CLR(dns_fd, &dns_rset);//將一個給定的檔案描述符從集合中刪除
	dns_build_answer(header, &answer_len, &answer_addr);
	dns_send_answer((void*)header, answer_len, &sockaddr, &answer_addr);
	
static int get_answer_ip(struct in_addr* ip_addr)
	strncpy(ifr.ifr_name, "rndis0", IF_NAMESIZE);
	ioctl(dns_fd, SIOCGIFADDR, &ifr);//獲取介面地址
	
static int dns_rcv_query(struct sockaddr_in*	p_src_addr)
	select(dns_fd+1, &dns_rset, NULL, NULL, &timeout)//非阻塞,以返回值的不同來反映函式的執行情況,監視dns_rset的變化情況,有可讀返回大於0
	FD_ISSET(dns_fd, &dns_rset)//檢查集合中指定的檔案描述符是否可以讀寫
	
	iov[0].iov_base = dns_buf;		//資料指標
    iov[0].iov_len = DNS_BUF_SIZE; 
    msg.msg_control = control_u.control;//附屬資料緩衝區
    msg.msg_controllen = 0;
    msg.msg_flags = 0;					//接收資訊標記位
    msg.msg_name = p_src_addr;			//套介面地址
    msg.msg_namelen = sizeof(struct sockaddr_in);
    msg.msg_iov = iov;					//	I/O向量
    msg.msg_iovlen = 1;
	
	recvmsg(dns_fd, &msg, 0)		//從套接字上接收一個訊息
	
static int dns_build_answer(HEADER *header, unsigned short* answer_len, struct in_addr* answer_addr)
	p = (unsigned char *)(header+1)
	nameoffset = p - (unsigned char *)header;
	
	GETSHORT(qtype, p); //getshort函式從指定地址讀取16bit網路位元組順序的資料, 並將其轉換成little-endian的順序返回
	GETSHORT(qclass, p);
	PUTSHORT(nameoffset | 0xc000, p);
	PUTSHORT(qtype, p);
	PUTSHORT(qclass, p);
	PUTLONG(0, p);      /* TTL */
	PUTSHORT(4, p);
	
	p += INADDRSZ;
	header->qr = 1; //* response */答覆
	header->aa = 0; //* authoritive - only hosts and DHCP derived names. */權威,僅僅主機和DHCP衍生名
	header->ra = 1; //* recursion if available */如果可獲取就遞迴查詢
	header->tc = 0; //* truncation */截尾
	header->rcode = NOERROR; /* no error */
	header->ancount = htons(1);//將一個無符號短整型的主機數值轉換為網路位元組順序,即大尾順序(big-endian)
	header->nscount = htons(0);//header內容見下面圖文說明
	header->arcount = htons(0);

  *answer_len = p -(unsigned char *)header;

static int dns_send_answer(void* data, unsigned short data_len, struct sockaddr_in*	to, struct in_addr* answer_addr)
	iov[0].iov_base = (void*)data;
	iov[0].iov_len = data_len;

	msg.msg_control = NULL;
	msg.msg_controllen = 0;
	msg.msg_flags = 0;
	msg.msg_name = to;
	msg.msg_namelen = sizeof(struct sockaddr_in);
	msg.msg_iov = iov;
	msg.msg_iovlen = 1;
	
	sendmsg(dns_fd, &msg, 0)//成功執行時,返回已傳送的位元組數。失敗返回-1
	
Packet header structure

    ID - A 16-bit identifier assigned by the program that generates any kind of query.
    QR - Query/Response.
    OPCODE - A 4-bit field that specifies the kind of query in this message. This value is set by the originator of a query and copied into the response. This specification defines the behavior of standard queries and responses (opcode value of zero). Future specifications may define the use of other opcodes with LLMNR.
    C - Conflict.
    TC - TrunCation.
    T - Tentative.
    Z - Reserved for future use.
    RCODE - Response code.
    QDCOUNT - An unsigned 16-bit integer specifying the number of entries in the question section.
    ANCOUNT - An unsigned 16-bit integer specifying the number of resource records in the answer section.(資源記錄數)
    NSCOUNT - An unsigned 16-bit integer specifying the number of name server resource records in the authority records section.(名稱伺服器資源記錄數)
    ARCOUNT - An unsigned 16-bit integer specifying the number of resource records in the additional records section.(附加檔案記錄數)

相關推薦

前面文章一點應用-DNS

int InitSimpleDNS(void) dns_fd = socket(sockaddr.sin_family, SOCK_DGRAM, 0);//建立一個IPV4的socket,基於UDP資料套接字 ret = setsockopt(dns_fd, SOL_SO

文章教會你看先序遍歷、中序遍歷、後續遍歷

兩篇文章教會你看先序遍歷、中序遍歷、後續遍歷 對於樹相關的處理,一直都存在困惑,這兩篇文件基本幫我解惑,特此記錄,供以後學習使用。 https://jingyan.baidu.com/article/cdddd41cb8d79753ca00e144.html h

v8 使用的文章

http://www.tuicool.com/articles/m2e2i2 http://www.ibm.com/developerworks/cn/opensource/os-cn-v8engine/ http://www.cppblog.com/woaidongmao/archive/

Linux系統非阻塞I/O select、poll和epoll非常好的文章

大佬寫的兩篇博文,讀懂了就算徹底瞭解Linux基本的I/O了 按照先後順序仔細閱讀。。。 https://medium.com/@copyconstruct/nonblocking-i-o-99948ad7c957 https://medium.com/@copycon

貼上JNA—JNI終結者、深入解析JNA—模擬C語言結構體文章的完整原始碼

原文 http://blog.csdn.net/shendl/archive/2008/12/26/3599854.aspx 貼上 JNA—JNI 終結者 、 深入解析 JNA— 模擬 C 語言結構體 兩篇文章的完整原始碼 C 語言

修改ubuntu字元編碼 (以修改為GBK為例,其它修改可以參照前文章修改)

1、開啟sudo vi /var/lib/locales/supported.d/local在此檔案中,新增一行zh_CN.GBK GBK2、 sudo locale-gen 會看到系統下載幾個檔案。 3、修改/etc/environment PATH="/usr/loca

貼上 JNA—JNI 終結者 、 深入解析 JNA— 模擬 C 語言結構體 文章的完整原始碼 (續)...

原文 http://blog.csdn.net/shendl/archive/2008/12/26/3599854.aspx /** * @param args */ public static void main(String[] args

關於機器人抓取的文章,基於深度學習和脈衝神經網路,以及大腦見圖

 Towards Grasping with Spiking Neural Networks for Anthropomorphic Robot Hands Dex-Net 3.0: Computing Robust Robot Suction Grasp Targe

FLV檔案格式看這文章就夠了

1. 流媒體-FLV格式詳解及資料分析 2.flv格式詳解+例項剖析 對於音訊Tag,如圖: 分析如下: 先看下tag header定義: 對照tag header定義,可知08表示音訊tag,後面的3位元組00 00 07表示資料部分的長度大小為7,即從s

文章的相似度比較

僅僅考慮兩篇文章的片語,並未考慮文字的語義資訊。 實現原理: 1.  對兩篇文件進行詞頻統計;      2.  利用“TF-IDF和餘弦相似度”原理,計算兩篇文件的相似度。 實現過程:  1.利用lucene對大量文章建立索引,建立語料庫,來提高TF-IDF的準確度。

關於開源的文章

Benefits in contributing to Open Source What the benefit will i get, if i contribute to Open Source? This is the frequently asked questi

與Ant有關的文章

 ant的好處我還沒有真正體會到。但是Ant是十分有用的工具。值得深入學習,所以先把這兩篇文章的聯接放在這裡。以後有機會可以看看 Ant與Eclipse的整合 利用 Ant 和 Eclipse 有效地提高部署工作效率

iOS下:StoryBoard怎麼用,看這文章就夠了!

兩篇文章都是一個老外寫的 cocoachina翻譯了part1:http://www.cocoachina.com/industry/20131213/7537.html    可能需要翻牆才能看得到 3. storyBoard+AutoLayout 是蘋果推行的東西,

文章讓你了解DNS

遞歸查詢 叠代查詢 反向解析 DNS報文格式 目錄什麽是DNSDNS的特點DNS的工作原理反向解析DNS的報文格式一、什麽是DNS DNS--Domain Name System,域名系統。 互聯網中計算機之間進行通訊,數據怎麽走,走向哪裏,這些都需要根據IP地址來

文章詳解大資料技術和應用場景

什麼是大資料 說起大資料,估計大家都覺得只聽過概念,但是具體是什麼東西,怎麼定義,沒有一個標準的東西,因為在我們的印象中好像很多公司都叫大資料公司,業務形態則有幾百種,感覺不是很好理解,所以我建議還是從字面上來理解大資料,在維克托邁爾-舍恩伯格及肯尼斯庫克耶編寫的《大資料時代》提到了大資料的4個特徵:

關於git的很好的文章

文章很好,且通俗易懂,以至於自己沒有必要對git管理再重新梳理一遍了 簡單做下總結: 1. 建立一個新的分支(如test): ①建立test指標,並且指標指向master相同的提交; ②修改HEAD指標的指向,指向test。 經過以上兩步,之後有新的程式碼提交,則會指向test

收集關於HashCode的好文章

漫畫什麼是HashMap https://www.cnblogs.com/qingyunzong/p/9143233.html 高併發下的HashMap https://www.cnblogs.com/qingyunzong/p/9143249.html 高併發下的HashMa

如果你的公司還沒有企業級班車應用,把這文章轉給你老闆

本文由雲+社群發表 越來越多的大型企業都開始為員工提供班車,解決員工上下班出行的問題,甚至有些高新技術園區也組織了園區車輛共享的一些新的出行方案。期間,企業從早期員工提供優質的班車服務,到提升班車的管理水平、優化車輛使用成本逐漸成為了主線。那麼如何做到這些呢?企業級班車應用到底怎麼做呢?首先,我們需要資料

如果你的公司還沒有企業級班車應用,把這文章轉給你老板

運營 意思 分享 服務 雲上 最好的 高新 lock 搜索 本文由雲+社區發表 越來越多的大型企業都開始為員工提供班車,解決員工上下班出行的問題,甚至有些高新技術園區也組織了園區車輛共享的一些新的出行方案。期間,企業從早期員工提供優質的班車服務,到提升班車的管理水平、優化

分享關於HRESULT的文章

http://blog.csdn.net/xdrt81y/article/details/11642919 http://blog.csdn.net/wangqiulin123456/article/details/8145811 最近是遇到了一個問題,是在寫log的時候無法打印出HR