当前位置:文档之家› 《网络编程与协议分析》课程设计报告

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

计算机科学与技术学院课程设计成绩单 课程名称:网络编程与协议分析 指导教师: 姓名 性别 男 学号 班级

综合成绩 成绩等级

程序运行情况 (占总成绩20%) □能正确运行 □基本能正确运行 □能运行但结果不完善

(20分) (15分) (10分)

程序功能的完善程度 (占总成绩10%) □完善 □基本完善 □不完善 (10分) (8分) (5分)

程序结构的合理性 (占总成绩10%) □合理 □基本合理 □不太合理 (10分) (8分) (5分)

对问题的答辩情况 (占总成绩40%) □概念正确有创新 □能正确回答所有问题 □基本能正确回答 (40分) (35分) (30分) □部分问题回答概念不清晰 (20分)

学生的工作态度与独立工作能力 (占总成绩10%) □工作态度认真能独立完成任务 □工作态度认真但独立性较差 (10分) (8分) □工作态度基本认真但缺乏独立性 (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("WSAStartup fail!"); }

m_sock=socket(AF_INET,SOCK_RAW,0); if(m_sock==INVALID_SOCKET) { AfxMessageBox("socket fail!"); }

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("bind fail!"); }

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("WSAIoctl 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,"版本",LVCFMT_CENTER,40,0); m_List.InsertColumn(2,"头部长度",LVCFMT_CENTER,60,1); m_List.InsertColumn(3,"服务类型",LVCFMT_CENTER,60,2); m_List.InsertColumn(4,"总长度",LVCFMT_CENTER,50,3); m_List.InsertColumn(5,"标识符",LVCFMT_CENTER,50,4); m_List.InsertColumn(6,"标志位",LVCFMT_CENTER,50,5); m_List.InsertColumn(7,"片偏移",LVCFMT_CENTER,50,6); m_List.InsertColumn(8,"生存周期",LVCFMT_CENTER,60,7); m_List.InsertColumn(9,"协议",LVCFMT_CENTER,40,8); m_List.InsertColumn(10,"首部校验和",LVCFMT_CENTER,80,9); m_List.InsertColumn(11,"源地址",LVCFMT_CENTER,100,10); m_List.InsertColumn(12,"目的IP地址",LVCFMT_CENTER,100,11);

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];

相关主题