資源簡介
計算機網絡課程實驗,C語言實現一個DNS中繼服務器。
內含源代碼、測試用例、詳細實驗文檔

代碼片段和文件信息
#include
#include
#include
#include
#include
#include
#include
#include
#include??
#include??
using?namespace?std;
#pragma??comment(lib“ws2_32.lib“)?//鏈接Ws2_32.lib庫,不必在setting里設置
#define?DEF_DNS_ADDRESS?“202.38.64.56“?//外部DNS服務器地址
#define?LOCAL_ADDRESS?“114.214.193.126“???????//本地DNS服務器地址
#define?DNS_PORT?53?????????????????????//進行DNS服務的53號端口?
#define?BUF_SIZE?512
#define?LENGTH?65
#define?AMOUNT?300
#define?NOTFOUND?-1
#define?FOUND?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;?
typedef?struct
{
????char?addr[16];
}?ip_addr;
//DNS域名解析表結構
typedef?struct?translate
{
string?IP; //IP地址
string?domain; //域名
}?Translate;
//ID轉換表結構
typedef?struct?IDChange
{
unsigned?short?oldID; //原有ID
bool?done; //標記是否完成解析
SOCKADDR_IN?client; //請求者套接字地址
int?joinTime;???????????????????//加入轉換表的時刻?
char?urlName[LENGTH];???????????//客戶詢問的url名字?
int?offset;?????????????????????//客戶發送報文的字節數?
}?IDTransform;
Translate?DNS_table[AMOUNT]; //DNS域名解析表
IDTransform?IDTransTable[AMOUNT]; //ID轉換表
int?IDcount?=?0; //轉換表中的條目個數
char?url[LENGTH]; //域名
char?recvbuf_temp[BUF_SIZE]; //數據報內容(打印用)?
char?send_addr[LENGTH]rcv_addr[LENGTH];?//接收和發送數據包的地址(打印用)
unsigned?short?send_portrcv_port;???????//接收和發送數據包的端口(打印用)
SYSTEMTIME?sys;?????????????????????//系統時間
int?Day?Hour?Minute?Second?Milliseconds;//保存系統時間的變量
int?Day1?Hour1?Minute1?Second1;//保存系統時間的變量
int?Day2?Hour2?Minute2?Second2;//保存系統時間的變量
int?Day3?Hour3?Minute3?Second3;//保存系統時間的變量
/*功能函數聲明*/
//begin:------------------------------------------?
int?GetTable(char?*tablePath);??????????//函數1:獲取域名解析表
void?GetUrl(char?*recvbufint?recvnum);?//函數2:?獲取DNS請求中的域名
int?IsFind(char?*urlint?num);??????????//函數3:判斷是否在表中找到DNS請求中的域名,找到返回下標
????????????????????????????????????????//函數4:將請求ID轉換為新的ID,并將信息寫入ID轉換表中
unsigned?short?RegisterNewID(unsigned?short?oID?SOCKADDR_IN?temp?bool?ifdone);?
void?DisplayInfo(unsigned?short?newID?int?find);?//函數5:打印?時間?newID?功能?域名?IP
//end-----------------------------------------------------
//函數1:獲取域名解析表
int?GetTable(char?*tablePath)
{
int?i=0jpos=0;
string?table[AMOUNT];
ifstream?infile(tablePathios::in);
if(!infile)?
{
cerr?<“Open?“?< exit(1);
}
while(getline(infiletable[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);
}
}
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????5061??2018-10-11?10:44??example.txt
?????文件?????446529??2019-05-07?23:52??report.pdf
?????文件??????22536??2018-12-31?13:14??DNSrelay.cpp
-----------?---------??----------?-----??----
???????????????474126????????????????????3
- 上一篇:C語言實現電梯控制
- 下一篇:MSDN 和VC6.0完全版
評論
共有 條評論