计算机科学与技术学院课程设计成绩单
课程名称:
姓名
综合成绩
性别
学号
班级
指导教师:
成绩等级
程序运行情况
(占总成绩 20%)
□能正确运行
(20 分)
□基本能正确运行
□能运行但结果不完善
(15 分)
(10 分)
程 序 功 能 的 完 善
程度
(占总成绩 10%)
□完善
(10 分)
□基本完善
(8 分)
□不完善
(5 分)
程 序 结 构 的 合 理
性
(占总成绩 10%)
□合理
(10 分)
□基本合理
(8 分)
□不太合理
(5 分)
对 问 题 的 答 辩 情
况
(占总成绩 40%)
学 生 的 工 作 态 度
与独立工作能力
(占总成绩 10%)
□概念正确有创新 □能正确回答所有问题 □基本能正确回答
(40 分)
(35 分)
□部分问题回答概念不清晰
(20 分)
(30 分)
□工作态度认真能独立完成任务 □工作态度认真但独立性较差
(10 分)
□工作态度基本认真但缺乏独立性
(8 分)
(5 分)
设 计 报 告 的 规 范
性
(占总成绩 10%)
□符合规范
(10 分)
□基本符合规范
□规范性较差
(8 分)
(5 分)
优秀:90 分~100 分 良好:80 分~89 分 中等:70~79 分 及格:60~69 分 不及格 0 分~59 分
武汉科技大学计算机科学与技术学院制表
第 1 页
计算机科学与技术学院
课 程 设 计 报 告
课程名称: 网络应用开发
专
业: 网络工程
班
级: 13 级 02 班
学
号: 201301145034
姓
名:
指导老师:
商洁
杨湘
第 2 页
目录
《网络编程与协议分析》课程设计报告........................................................................................ 1
一,课设题目:........................................................................................................................ 2
二、课设要求:........................................................................................................................ 2
三、部分代码 ............................................................................................................................ 2
(1)初始化套接字 .......................................................................................................... 2
(2)初始化表格 .............................................................................................................. 3
(3)ip,tcp,udp,icmp 头部定义 ...............................................................................4
(4)“开始”按钮事件 .................................................................................................... 5
(5)数据包抓取与初步处理 .......................................................................................... 5
(6)表格单击事件 .......................................................................................................... 7
(7)“停止”按钮事件 .................................................................................................... 9
四、程序截图 .......................................................................................................................... 12
(1)开始..............................................................................................................................13
(2)结束..............................................................................................................................13
(3)TCP.............................................................................................................................. 13
(4)UDP..............................................................................................................................13
(5)ICMP............................................................................................................................14
五、课设小结 .......................................................................................................................... 14
第 1 页
《网络编程与协议分析》课程设计报告
一,课设题目:
局域网数据包抓取与分析软件
二、课设要求:
抓取本地主机所在局域网子网内的所有数据包
分析并显示所抓取数据包的 IP 头部各字段的信息
分析并显示所抓取数据包的封装在 IP 数据包内的协议头部字段信息(TCP、UDP、ICMP 等)
生成日志信息,以文本文档形式保存
三、部分代码
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);
第 2 页
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);
第 3 页
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;
unsigned int ip_DeIp;
//版本&首部长度
//服务类型
//总长度
//标识
//标识&片偏移
//生存时间
//上层协议
//首部校验和
//源 ip
//目的 ip
};
struct tcphead
{
unsigned short tcp_SoPort;
unsigned short tcp_DePort;
unsigned int tcp_Seq;
unsigned int tcp_Ack;
unsigned char tcp_LenAndRes;
unsigned char tcp_Flag;
unsigned short tcp_Win;
unsigned short tcp_Wum;
unsigned short tcp_Mov;
//16 位的源端口
//16 位的目的端口
//32 位的序列号
//32 位的确认号
//4 位的首部长度和 4 位的保留字
//2 位的保留字和 6 位的标志位
//16 位的窗口大小
//16 位校验和
//16 位的紧急数据偏移量
};
struct udphead
{
unsigned short udp_SoPort;
unsigned short udp_DePort;
unsigned short udp_Len;
unsigned short udp_Sum;
//源端口
//目的端口
//总长度
//校验和
};
第 4 页
struct icmphead
{
unsigned char icmp_Type;
unsigned char icmp_Code;
unsigned short icmp_Sum;
};
4)“开始”按钮事件
//类型
//代码
//16 位检验和
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;
第 5 页
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, "fdgfg");
sprintf(buf,"%d",ih->ip_EdiAndLen>>4);
lis->SetItemText(i,0,buf);
sprintf(buf,"%d",ih->ip_EdiAndLen&0xf);
lis->SetItemText(i,1,buf);
sprintf(buf,"%d",ih->ip_Serve);
lis->SetItemText(i,2,buf);
sprintf(buf,"%d",ih->ip_Len);
lis->SetItemText(i,3,buf);
sprintf(buf,"%d",ih->ip_Sign);
lis->SetItemText(i,4,buf);
sprintf(buf,"%d",ih->ip_MarkAndMove >>13);
lis->SetItemText(i,5,buf);
sprintf(buf,"%d",ih->ip_MarkAndMove&0x1fff);
lis->SetItemText(i,6,buf);
sprintf(buf,"%d",ih->ip_Ttl);
第 6 页