• 大小: 424KB
    文件类型: .rar
    金币: 2
    下载: 1 次
    发布日期: 2021-06-17
  • 语言: C/C++
  • 标签: 课程实验  

资源简介

计算机网络课程实验,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 “ << tablePath << “ error!“ < 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. “ << endl;
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


评论

共有 条评论