資源簡介
是北京郵電大學,計算機網絡課程設計的一個實驗。可以參考。

代碼片段和文件信息
#include?
#include?
#include??
#include??
#include??
#include?
#include?
#include?
#include?
using?namespace?std;
#pragma??comment(lib?“Ws2_32.lib“)?
#define?DEF_DNS_ADDRESS?“192.168.146.2“ //外部DNS服務器地址
#define?LOCAL_ADDRESS?“127.0.0.1“ //本地DNS服務器地址
#define?DNS_PORT?53 //進行DNS服務的53端口
#define?BUF_SIZE?512
#define?LENGTH?65
#define?AMOUNT?300
#define?NOTFOUND?-1
//DNS報文首部
typedef?struct?DNSHeader
{
????unsigned?short?ID;
????unsigned?short?Flags;
????unsigned?short?QuestNum;
????unsigned?short?AnswerNum;
????unsigned?short?AuthorNum;
????unsigned?short?AdditionNum;
}?DNSHDR?*pDNSHDR;
//DNS域名解析表結構
typedef?struct?translate
{
string?IP; //IP地址
string?domain; //域名
}?Translate;
//ID轉換表結構
typedef?struct?IDChange
{
unsigned?short?oldID; //原有ID
BOOL?done; //標記是否完成解析
SOCKADDR_IN?client; //請求者套接字地址
}?IDTransform;
Translate?DNS_table[AMOUNT]; //DNS域名解析表
IDTransform?IDTransTable[AMOUNT]; //ID轉換表
int?IDcount?=?0; //轉換表中的條目個數
char?url[LENGTH]; //域名
SYSTEMTIME?sys;?????????????????????//系統時間
int?Day?Hour?Minute?Second?Milliseconds;//保存系統時間的變量
//函數:獲取域名解析表
int?GetTable(char?*tablePath)
{
int?i=0?j?pos=0;
string?table[AMOUNT];
ifstream?infile(tablePath?ios::in); //以讀入方式打開文本文件
if(!?infile)?{
cerr?<“Open“?< exit(1);
}
//每次從文件中讀入一行,直至讀到文件結束符為止
while?(getline(infile?table[i])?&&?i? i++;
if?(i?==?AMOUNT-1)
cout?<“The?DNS?table?memory?is?full.?“?<
for?(j?=?0;?j? pos?=?table[j].find(‘?‘);
if?(pos?>?table[j].size())
cout?<“The?record?is?not?in?a?correct?format.?“?< else?{
DNS_table[j].IP?=?table[j].substr(0?pos);
DNS_table[j].domain?=?table[j].substr(pos+1);
}
}
infile.close(); //關閉文件
cout?<“Load?records?succeed.?“?<
return?i-1; //返回域名解析表中條目個數
}
//函數:獲取DNS請求中的域名
void?GetUrl(char?*recvbuf?int?recvnum)
{
char?urlname[LENGTH];
int?i?=?0?j?k?=?0;
memset(url?0?LENGTH);
memcpy(urlname?&(recvbuf[sizeof(DNSHDR)])?recvnum-16); //獲取請求報文中的域名表示
int?len?=?strlen(urlname);
//域名轉換
while?(i? if?(urlname[i]?>?0?&&?urlname[i]?<=?63)
for?(j?=?urlname[i]?i++;?j?>?0;?j--?i++?k++)
url[k]?=?urlname[i];
if?(urlname[i]?!=?0)?{
url[k]?=?‘.‘;
????k++;
}
}
url[k]?=?‘\0‘;
}
//函數:判斷是否在表中找到DNS請求中的域名,找到返回下標
int?IsFind(char*?url?int?num)
{
int?find?=?NOTFOUND;
char*?domain;
for?(int?i?=?0;?i? domain?=?(char?*)DNS_table[i].domain.c_str();
if?(strcmp(domain?url)?==?0)?{ //找到
find?=?i;
break;
}
}
return?find;
}
//函數:將請求ID轉換為新的ID,并將信息寫入ID轉換表中
unsigned?short?RegisterNewID?(unsigned?short?oID?SOCKADDR_IN?temp?BOOL?ifdone)
{
srand(time(NULL));
IDTransTable[IDcount].oldID?=?oID;
IDTransTable[IDcount].client?=?temp;
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????12138??2010-07-23?15:20??zhongji.cpp
?????文件????????5077??2010-07-12?00:57??zhongji.txt
- 上一篇:LUTmanager
- 下一篇:協同自適應巡航ISO
評論
共有 條評論