《网络编程与协议分析》课程设计报告

更新时间:2024-05-20 16:23:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

计算机科学与技术学院课程设计成绩单

课程名称:网络编程与协议分析 指导教师: 姓名 性别 男 学号 班级 综合成绩 程序运行情况 (占总成绩20%) 成绩等级 □能正确运行 □基本能正确运行 □能运行但结果不完善 (20分) (15分) (10分) 程序功能的完善 程度 □完善 □基本完善 □不完善 (占总成绩10%) (10分) (8分) (5分) 程序结构的合理 性 □合理 □基本合理 □不太合理 (占总成绩10%) (10分) (8分) (5分) 对问题的答辩情□概念正确有创新 □能正确回答所有问题 □基本能正确回答 况 (40分) (35分) (30分) (占总成绩40%) □部分问题回答概念不清晰 (20分) 学生的工作态度□工作态度认真能独立完成任务 □工作态度认真但独立性较差 与独立工作能力 (10分) (8分) (占总成绩10%) □工作态度基本认真但缺乏独立性 (5分) 设计报告的规范 性 □符合规范 □基本符合规范 □规范性较差 (占总成绩10%) (10分) (8分) (5分) 优秀:90分~100分 良好:80分~89分 中等:70~79分 及格:60~69分 不及格0分~59分

武汉科技大学计算机科学与技术学院制表

计算机科学与技术学院

课 程

课程名称:网络编程与协议分析专 业:班 级:学 号:姓 名:指导老师:设 计 报 告

《网络编程与协议分析》课程设计报告

一、课设题目:

网络数据包抓取与分析软件

二、课设要求:

1) 能抓取本地主机所在局域网子网内的所有数据包 2) 分析并显示所抓取数据包的IP头部各字段的信息

3) 分析并显示所抓取数据包的封装在IP数据包内的协议头部字段信息(TCP、UDP、

ICMP等)

4) 生成日志信息,以文本文档形式保存

5) 分析并显示所抓取数据包应用层协议头部字段信息(HTTP、FTP、DNS、Telnet、

SMTP、POP等各种应用层协议中至少取三种)

三、用到的基本概念及原理

(3)Winpcap的组成和结构

4)Winpcap基本原理

5)NPF在windows系统中的位置

((

(6)系统构架

四、部分代码

1)初始化套接字

BOOL CTestDlg::SockInit() { WSADATA wsa; if(WSAStartup(MAKEWORD(2,2),&wsa)!=0) { AfxMessageBox(\ } m_sock=socket(AF_INET,SOCK_RAW,0); if(m_sock==INVALID_SOCKET) { AfxMessageBox(\ } SOCKADDR_IN addr; addr.sin_family=AF_INET; addr.sin_port=htons(5000); struct hostent FAR * pHostent; char FAR name[25]; gethostname(name, 25); pHostent = gethostbyname(name); memcpy(&addr.sin_addr.S_un.S_addr,pHostent->h_addr_list[0],pHostent->h_len); if(bind(m_sock,(SOCKADDR *)&addr,sizeof(addr))!=0) { AfxMessageBox(\ } DWORD dwBytesRet; unsigned int optval = 1; int pCount=0;

if(INVALID_SOCKET==(WSAIoctl(m_sock,SIO_RCVALL,&optval,sizeof(optval),

NULL, 0, &dwBytesRet, NULL, NULL)))

{ AfxMessageBox(\ Fail!\ return false; }

}

return true;

2)初始化表格

BOOL CTestDlg::ListInit() { DWORD dwStyle = GetWindowLong(m_List.m_hWnd, GWL_STYLE); SetWindowLong(m_List.m_hWnd,GWL_STYLE,dwStyle|LVS_REPO); DWORD dwStyles = m_List.GetExStyle(); dwStyles &= ~LVS_EX_CHECKBOXES;

m_List.SetExtendedStyle(dwStyles|LVS_EX_FULLROWSELECT|LVXGRIDLINES); m_List.InsertColumn(1,\版本\ m_List.InsertColumn(2,\头部长度\ m_List.InsertColumn(3,\服务类型\ m_List.InsertColumn(4,\总长度\ m_List.InsertColumn(5,\标识符\ m_List.InsertColumn(6,\标志位\ m_List.InsertColumn(7,\片偏移\ m_List.InsertColumn(8,\生存周期\ m_List.InsertColumn(9,\协议\ m_List.InsertColumn(10,\首部校验和\ m_List.InsertColumn(11,\源地址\ m_List.InsertColumn(12,\目的IP地址\

}

return true;

3)ip,tcp,udp,icmp头部定义

struct iphead { unsigned char ip_EdiAndLen; unsigned char ip_Serve; unsigned short int ip_Len; unsigned short int ip_Sign; unsigned short int ip_MarkAndMove; unsigned char ip_Ttl; unsigned char ip_Protocol;

//版本&首部长度

//服务类型 //总长度 //标识 //标识&片偏移 //生存时间 //上层协议

unsigned short int ip_Sum; //首部校验和 unsigned int ip_SoIp; //源ip unsigned int ip_DeIp; //目的ip };

struct tcphead { unsigned short tcp_SoPort; //16位的源端口 unsigned short tcp_DePort; //16位的目的端口 unsigned int tcp_Seq; //32位的序列号 unsigned int tcp_Ack; //32位的确认号 unsigned char tcp_LenAndRes; //4位的首部长度和4位的保留字 unsigned char tcp_Flag; //2位的保留字和6位的标志位 unsigned short tcp_Win; //16位的窗口大小 unsigned short tcp_Wum; //16位校验和 unsigned short tcp_Mov; //16位的紧急数据偏移量 };

struct udphead { unsigned short udp_SoPort; //源端口 unsigned short udp_DePort; //目的端口 unsigned short udp_Len; //总长度 unsigned short udp_Sum; //校验和 };

struct icmphead {

unsigned char icmp_Type; //类型 unsigned char icmp_Code; //代码 unsigned short icmp_Sum; //16位检验和 };

4)“开始”按钮事件

void CTestDlg::OnStart() { // TODO: Add your control notification handler code here DWORD code;

}

if (!GetExitCodeThread(m_thr,&code) || (code != STILL_ACTIVE)) { alldata * recvdata=new alldata; recvdata->lis=&m_List; recvdata->sock=m_sock; m_thr=CreateThread(NULL,0,RecvProc,(LPVOID)recvdata,0,NULL); CloseHandle(m_thr); } else { m_List.DeleteAllItems(); ResumeThread(m_thr); }

GetDlgItem(IDC_STOP)->EnableWindow(TRUE); GetDlgItem(IDC_START)->EnableWindow(FALSE); GetDlgItem(IDC_STOP)->SetFocus();

5)数据包抓取与初步处理

DWORD WINAPI CTestDlg::RecvProc(LPVOID lpParameter) { SOCKET sock=((alldata*)lpParameter)->sock; CListCtrl * lis=(CListCtrl *)(((alldata*)lpParameter)->lis); struct iphead *ih; SOCKADDR_IN tem; char RecvBuf[65535] = {0}; char soip[16]; char deip[16]; char buf[100];

int i=0;

while(1) { if(int a=recv(sock,ddat[++count].buff,sizeof(ddat[count].buff),0)<=0) continue; ih=(struct iphead *)(ddat[count].buff); tem.sin_addr.s_addr=ih->ip_SoIp; strncpy(soip,inet_ntoa(tem.sin_addr),16); tem.sin_addr.s_addr=ih->ip_DeIp; strncpy(deip,inet_ntoa(tem.sin_addr),16);

lis->InsertItem(i, \

sprintf(buf,\lis->SetItemText(i,0,buf);

sprintf(buf,\lis->SetItemText(i,1,buf); sprintf(buf,\lis->SetItemText(i,2,buf); sprintf(buf,\lis->SetItemText(i,3,buf); sprintf(buf,\lis->SetItemText(i,4,buf);

sprintf(buf,\lis->SetItemText(i,5,buf);

sprintf(buf,\lis->SetItemText(i,6,buf); sprintf(buf,\lis->SetItemText(i,7,buf);

switch((int)ih->ip_Protocol) { case 1:sprintf(buf,\ case 2:sprintf(buf,\

}

case 6:sprintf(buf,\ case 8:sprintf(buf,\ case 9:sprintf(buf,\ case 17:sprintf(buf,\ case 41:sprintf(buf,\ case 89:sprintf(buf,\ default:sprintf(buf,\}

lis->SetItemText(i,8,buf); sprintf(buf,\lis->SetItemText(i,9,buf); sprintf(buf,\lis->SetItemText(i,10,buf); sprintf(buf,\lis->SetItemText(i,11,buf); i++;

Sleep(100); }

return true;

6)表格单击事件

void CTestDlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult) { // TODO: Add your control notification handler code here NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; CString buf; char tem[100]; int i; if(pNMListView->iItem != -1) { i=pNMListView->iItem; CString strtemp; CNewDlg newdlg;

iphead *iph=(iphead *)(ddat[i].buff);

tcphead th=*((tcphead *)(ddat[i].buff+(iph->ip_EdiAndLen&0xf)*4)); udphead uh=*((udphead *)(ddat[i].buff+(iph->ip_EdiAndLen&0xf)*4)); icmphead ih=*((icmphead *)(ddat[i].buff+(iph->ip_EdiAndLen&0xf)*4)); switch((int)iph->ip_Protocol) {

case 6: sprintf(tem,\源端口:%d\\r\\n\ buf+=tem; sprintf(tem,\目的端口:%d\\r\\n\ buf+=tem; sprintf(tem,\序列号:%d\\r\\n\ buf+=tem; sprintf(tem,\确认号:%d\\r\\n\ buf+=tem; sprintf(tem,\数据偏移:%d\\r\\n\ buf+=tem; sprintf(tem,\保留:%d\\r\\n\ buf+=tem; sprintf(tem,\标志:%d\\r\\n\ buf+=tem; sprintf(tem,\窗口:%d\\r\\n\ buf+=tem; sprintf(tem,\校验和:%d\\r\\n\ buf+=tem; sprintf(tem,\紧急指针:%d\\r\\n\ buf+=tem; newdlg.m_data=buf; break; case 17: sprintf(tem,\源端口:%d\\r\\r\\n\ buf+=tem; sprintf(tem,\目的端口:%d\\r\\n\ buf+=tem; sprintf(tem,\长度:%d\\r\\n\ buf+=tem; sprintf(tem,\校验和:%d\\r\\n\ buf+=tem; newdlg.m_data=buf; break; case 1: sprintf(tem,\类型:%d\\r\\n\ buf+=tem;

}

}

sprintf(tem,\代码:%d\\r\\n\ buf+=tem; sprintf(tem,\校验和:%d\\r\\n\ buf+=tem; newdlg.m_data=buf; break; default: AfxMessageBox(\ newdlg.m_data=\}

newdlg.DoModal();

*pResult = 0;

7)“停止”按钮事件

void CTestDlg::OnStop() { // TODO: Add your control notification handler code here

SuspendThread(m_thr); DWORD code; CString strDate; CString strBuf;

int index = m_List.GetItemCount(); int i,j = 0;

GetExitCodeThread(m_thr,&code); if (code != STILL_ACTIVE) { AfxMessageBox(\程序初始化失败!\\n请检查配置后重新运行!\ } else { CTime ttime = CTime::GetCurrentTime();

strDate.Format(\

ay());

strDate += ttime.Format(\

ofstream outfile(\outfile<

while (j < index) { for (i = 0;i < 12;i++) { strBuf = m_List.GetItemText(j,i); switch(i) { case 0: outfile<

}

}

case 7: outfile<

outfile.close();

AfxMessageBox(\数据已写入日志文件!\

GetDlgItem(IDC_STOP)->EnableWindow(FALSE); GetDlgItem(IDC_START)->EnableWindow(TRUE); GetDlgItem(IDC_START)->SetFocus();

五、程序截图

“开始”

“停止”

TCP

UDP

本文来源:https://www.bwwdw.com/article/x2h7.html

Top