计算机网络课程设计报告DOCWord格式文档下载.docx

上传人:b****2 文档编号:1559544 上传时间:2023-04-30 格式:DOCX 页数:32 大小:38.48KB
下载 相关 举报
计算机网络课程设计报告DOCWord格式文档下载.docx_第1页
第1页 / 共32页
计算机网络课程设计报告DOCWord格式文档下载.docx_第2页
第2页 / 共32页
计算机网络课程设计报告DOCWord格式文档下载.docx_第3页
第3页 / 共32页
计算机网络课程设计报告DOCWord格式文档下载.docx_第4页
第4页 / 共32页
计算机网络课程设计报告DOCWord格式文档下载.docx_第5页
第5页 / 共32页
计算机网络课程设计报告DOCWord格式文档下载.docx_第6页
第6页 / 共32页
计算机网络课程设计报告DOCWord格式文档下载.docx_第7页
第7页 / 共32页
计算机网络课程设计报告DOCWord格式文档下载.docx_第8页
第8页 / 共32页
计算机网络课程设计报告DOCWord格式文档下载.docx_第9页
第9页 / 共32页
计算机网络课程设计报告DOCWord格式文档下载.docx_第10页
第10页 / 共32页
计算机网络课程设计报告DOCWord格式文档下载.docx_第11页
第11页 / 共32页
计算机网络课程设计报告DOCWord格式文档下载.docx_第12页
第12页 / 共32页
计算机网络课程设计报告DOCWord格式文档下载.docx_第13页
第13页 / 共32页
计算机网络课程设计报告DOCWord格式文档下载.docx_第14页
第14页 / 共32页
计算机网络课程设计报告DOCWord格式文档下载.docx_第15页
第15页 / 共32页
计算机网络课程设计报告DOCWord格式文档下载.docx_第16页
第16页 / 共32页
计算机网络课程设计报告DOCWord格式文档下载.docx_第17页
第17页 / 共32页
计算机网络课程设计报告DOCWord格式文档下载.docx_第18页
第18页 / 共32页
计算机网络课程设计报告DOCWord格式文档下载.docx_第19页
第19页 / 共32页
计算机网络课程设计报告DOCWord格式文档下载.docx_第20页
第20页 / 共32页
亲,该文档总共32页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

计算机网络课程设计报告DOCWord格式文档下载.docx

《计算机网络课程设计报告DOCWord格式文档下载.docx》由会员分享,可在线阅读,更多相关《计算机网络课程设计报告DOCWord格式文档下载.docx(32页珍藏版)》请在冰点文库上搜索。

计算机网络课程设计报告DOCWord格式文档下载.docx

定义IP首部的数据结构

填充数据包,发送数据包,捕获数据包

使用winpcap,捕获IP数据包

(2)主要步骤

1)总体设计:

a.获取设备列表并打印,打开所选择的适配器;

b.准备工作:

定义ip相关的结构体、打开要存放结果的文件,设置过滤器,手写ip数据报(内容有无效的MAC源和目的地址,和均为本机地址的ip源地址和目的地址,即发给自己一个ip报文),设置抓到数据报的解析和输出到文件的操作函数(解析ip报,打印并写入文件:

报文的版本、协议、源和目的地址等)。

c.发包、抓包。

d.分析获取的数据。

2)

具体实现:

#defineHAVE_REMOTE

#include"

pcap.h"

remote-ext.h"

stdio.h"

stdlib.h"

/*4字节的IP地址*/

typedefstructip_address{

u_charbyte1;

u_charbyte2;

u_charbyte3;

u_charbyte4;

}ip_address;

/*IPv4首部*/

typedefstructip_header{

u_charver_ihl;

//版本(4bits)+首部长度(4bits)

u_chartos;

//服务类型

u_shorttlen;

//总长类型

u_shortidentification;

//标识

u_shortflags_fo;

//标志位+段偏移量

u_charttl;

//存活时间

u_charproto;

//协议

u_shortcrc;

//首部校验和

ip_addressdaddr;

//目的地址

ip_addresssaddr;

//源地址

u_intop_pad;

//选项与填充

}ip_header;

voidpacket_handler(u_char*param,conststructpcap_pkthdr*header,constu_char*pkt_data);

/*packethandler函数原型*/

intmain()

{

pcap_if_t*alldevs;

pcap_if_t*d;

intinum;

inti=0;

pcap_t*adhandle;

charerrbuf[PCAP_ERRBUF_SIZE];

u_intnetmask;

charpacket_filter[]="

ip"

;

//抓包类型

structbpf_programfcode;

pcap_dumper_t*dumpfile;

/*获取本机设备列表*/

if(pcap_findalldevs_ex(PCAP_SRC_IF_STRING,NULL,&

alldevs,errbuf)==-1)

{

fprintf(stderr,"

Errorinpcap_findalldevs:

%s\n"

errbuf);

exit

(1);

}

/*打印适配器列表*/

for(d=alldevs;

d;

d=d->

next)

printf("

%d.%s"

++i,d->

name);

if(d->

description)

printf("

(%s)\n"

d->

description);

else

(Nodescriptionavailable)\n"

);

if(i==0)

\nNointerfacesfound!

MakesureWinPcapisinstalled.\n"

return-1;

printf("

Entertheinterfacenumber(1-%d):

"

i);

scanf("

%d"

&

inum);

if(inum<

1||inum>

i)

\nInterfacenumberoutofrange.\n"

/*释放设备列表*/

pcap_freealldevs(alldevs);

/*跳转到选中的适配器*/

for(d=alldevs,i=0;

i<

inum-1;

next,i++);

/*打开设备*/

if((adhandle=pcap_open(d->

name,//设备名

65536,//65535保证能捕获到不同数据链路层上每个数据包的全部内容

PCAP_OPENFLAG_PROMISCUOUS,//混杂模式

1000,//读取超时时间

NULL,//远程机器验证

errbuf//错误缓冲池

))==NULL)

\nUnabletoopentheadapter.%sisnotsupportedbyWinPcap\n"

/*打开堆文件*/

dumpfile=pcap_dump_open(adhandle,"

D:

\\save.txt"

if(dumpfile==NULL)

\nErroropeningoutputfile\n"

/*检查数据链路层,只考虑以太网*/

if(pcap_datalink(adhandle)!

=DLT_EN10MB)

nThisprogramworksonlyonEthernetnetwords.n"

if(d->

addresses!

=NULL)

//获得接口第一个地址的掩码

netmask=((structsockaddr_in*)(d->

addresses->

netmask))->

sin_addr.S_un.S_addr;

else

//如果接口没有地址,那么我们假设一个C类的掩码

netmask=0xffffff;

//编译过滤器

if(pcap_compile(adhandle,&

fcode,packet_filter,1,netmask)<

0)

nUnabletocompilethepacketfilter.Checkthesyntax.n"

//释放设备列表

//设置过滤器

if(pcap_setfilter(adhandle,&

fcode)<

nErrorsettingthefilter.n"

\nlisteningon%s...\n"

//释放设备列表

pcap_freealldevs(alldevs);

/*手写数据包*/

u_charpacket[100];

/*假设在以太网上,设置MAC的目的地址为1:

1:

1*/

packet[0]=1;

packet[1]=1;

packet[2]=1;

packet[3]=1;

packet[4]=1;

packet[5]=1;

/*设置MAC的源地址为2:

2:

2*/

packet[6]=2;

packet[7]=2;

packet[8]=2;

packet[9]=2;

packet[10]=2;

packet[11]=2;

/*设置ip类型*/

packet[12]=0x08;

packet[13]=0x00;

packet[14]=0x45;

packet[15]=0x20;

packet[16]=0x00;

packet[17]=0x28;

packet[18]=0xcb;

packet[19]=0x16;

packet[20]=0x00;

packet[21]=0x00;

packet[22]=0x2e;

packet[23]=0x06;

packet[24]=0x3e;

packet[25]=0xe6;

packet[26]=0xc0;

//192

packet[27]=0xa8;

//168

packet[28]=0x01;

//1

packet[29]=0x64;

//100

packet[30]=0xc0;

packet[31]=0xa8;

packet[32]=0x01;

packet[33]=0x64;

packet[34]=0x8f;

packet[35]=0x50;

/*填充剩下的内容*/

for(i=36;

100;

i++)

packet[i]=i%256;

/*发送数据包*/

if(pcap_sendpacket(adhandle,packet,100/*size*/)!

=0)

nErrorsendingthepacket:

n"

pcap_geterr(adhandle));

return0;

}else{

Sendsuccessed"

/*开始捕获*/

pcap_loop(adhandle,0,packet_handler,(unsignedchar*)dumpfile);

//回调方式捕获数据包

pcap_close(adhandle);

return0;

}

/*每次捕获到数据包时,libpcap都会自动调用这个回调函数*/

voidpacket_handler(u_char*param,conststructpcap_pkthdr*header,constu_char*pkt_data)

structtm*ltime;

chartimestr[16];

ip_header*ih;

u_intip_len;

time_tlocal_tv_sec;

//保存数据包到文件中

pcap_dump((u_char*)param,header,pkt_data);

/*将时间戳转换成可识别的格式*/

local_tv_sec=header->

ts.tv_sec;

ltime=localtime(&

local_tv_sec);

strftime(timestr,sizeoftimestr,"

%H:

%M:

%S"

ltime);

//打印数据包的时间戳和长度

%s,%.6dlen:

%d\n"

timestr,header->

ts.tv_usec,header->

len);

//获得IP数据包头部的位置

ih=(ip_header*)(pkt_data+14);

//以太网头部长度

/*打印IP地址和UDP端口*/

版本+首部长度:

[%u]"

ih->

ver_ihl);

协议:

proto);

首部校验和:

crc);

目的地址:

[%u.%u.%u.%u]"

daddr.byte1,ih->

daddr.byte2,ih->

daddr.byte3,ih->

daddr.byte4);

printf("

源地址:

[%u.%u.%u.%u]\n"

saddr.byte1,ih->

saddr.byte2,ih->

saddr.byte3,ih->

saddr.byte4);

FILE*fp;

fp=fopen("

\\jiexi.txt"

"

a+"

fprintf(fp,"

解析结果:

fprintf(fp,"

fclose(fp);

2、实验2:

子网内文件传送

(明确的实验内容)

设计并实现一个局域网内部的文件传送工具,使用TCP协议进行可靠文件传输。

以图形界面运行,不同结点上文件自动同步

(详细的实验步骤(系统/方法/算法等),图文结合)

1)问题定义:

实现一个局域网内的文件传送与聊天的软件

2)需求分析:

局域网内的文件传送应当具备以下功能:

●在线用户的及时发现和更新

●选择一对一或者一对多对话模式

●与选择用户进行聊天和文件传输

●用户下线通知与更新用户列表

3)系统设计:

参考飞鸽传书的实现原理,总结设计方案如下:

●架构设计:

本系统采用本地应用程序设计,仅适用于在同一局域网的主机通信;

●互相发现:

本系统运行时启动局域网广播线程,发出包含主机名称、主机IP以及新加入标识符的广播表明自己新加入;

●用户列表:

监听到其他用户的广播信息后更新列表,显示当前在线的用户名和用户IP;

●更新列表:

在系统退出时会广播本机信息,标识表明自己离开,其余在线用户接收到信息后更新提示该用户下线;

●选择用户:

可以单独选择或者多项选择用户列表中的用户;

●发送消息:

选择用户后,在输入框中输入聊天信息,点击“发送”按钮系统会发送UDP数据包给对应用户的ip地址,端口是8011;

●接受消息:

系统实时监听8011端口以接受不同用户发来的消息并展示在聊天窗口中;

●发送文件:

选择指定用户,点击“发送文件”按钮,选择本机相应文件后,与目标用户建立TCP连接,发送字节流。

端口为8011;

●接受文件:

监听到有TCP连接请求时建立实时连接,系统提示用户是否接收文件,选择接收后选择相应路径与文件名后进行接收,接收成功后再聊天窗口显示提示信息。

4)详细设计:

1 局域网用户列表的建立:

软件启动后定时的使用UDP协议向这个广播地址发送广播包,端口设置为8001。

广播包内容包含主机名、IP、标识符等信息,已启动软件的用户通过8001端口收到此广播包后,就会在自己的用户列表中添加这个用户的用户名、IP地址等信息,从而局域网内的本系统用户都能建立起用户列表;

2 传送与接收信息:

传送聊天信息时同样使用UDP协议,用户填写消息后点击按钮调用发送消息的函数,然后通过8011端口发送UDP包。

系统在启动时通过开辟新线程来监听8011端口,时刻监听发送到本机的信息。

3 发送文件:

用户发送文件时建立一个带参数的线程来发送文件,调用相应的TCP发送函数来发送文件,使用的是8001端口,由于协议不同因此与之前的广播并不冲突;

4 接收文件:

软件启动时开启一个线程用来接收文件,此线程在正常工作条件下处于阻塞监听状态,直到收到建立TCP连接的请求,之后提示用户收到文件选择是否接受,之后选择保存路径,进行接收。

5 用户离开:

用户离线时发送一个离线广播包到的8001端口,包中含有LEAVE的标识符,收到此广播包的用户,根据包中的IP地址删除用户列表中相应的用户信息,并在聊天窗口显示“XXX用户已经离开”;

6 聊天记录保存:

考虑到用户有保存聊天记录的需求,在聊天记录右侧点击“保存”按钮,可以将当前聊天记录保存为txt文件到用户指定目录中。

或点击“清空”,清空当前用户聊天记录。

5)具体实现:

(C#)

usingSystem;

using

usingSystem.ComponentModel;

usingSystem.Data;

usingSystem.Drawing;

usingSystem.IO;

usingSystem.Linq;

usingSystem.Net;

usingSystem.Text;

usingSystem.Threading;

namespaceIPMessage

publicpartialclassfrmMain:

Form

//用户实体

publicclassUser

privatestringlocalname;

//用户名

publicstringlocalName

get{returnlocalname;

set{localname=value;

privatestringlocalip;

//用户IP

publicstringlocalIP

get{returnlocalip;

set{localip=value;

//用户数组声明

publicstaticList<

User>

Userslist=newList<

();

//获得本机名和本机IP

publicUsergetInfo()

Useru=newUser();

stringlocalName=Dns.GetHostName();

//获取主机名

//Console.WriteLine("

主机名:

{0}"

localName);

u.localName=localName;

IPHostEntrylocalHost=Dns.GetHostEntry(localName);

//输出对应的IP地址

IPAddresslocalIP=null;

for(inti=0;

if(localHost.AddressList[i].AddressFamily==AddressFamily.InterNetwork)

localIP=localHost.AddressList[i];

break;

u.localIP=localIP.ToString();

returnu;

//发送广播消息

publicvoidbroadMessage()

Socketsocket=newSocket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);

IPEndPointiep=new8001);

//设置Broadcast值为表示允许套接字发送广播消息,该值默认为不允许

socket.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.Broadcast,1);

Useru=getInfo();

//标识符为NEW

stringsend="

NEW"

+"

+u.localName+"

+u.localIP;

byte[]sendM=

//byte[]sendIP=

while(isBroad)

socket.SendTo(sendM,iep);

Thread.Sleep(200);

//socket.SendTo(sendIP,iep);

socket.Close();

publicvoidremove(Useru)

Userslist.Remove(u);

用户:

离开"

\n"

|"

+u.localIP);

//接收广播消息

publicvoidreciveBroad()

IPEndPointiep=newIPEndPoint(IPAddress.Any,8001);

socket.Bind(iep);

EndPointep=(EndPoint)iep;

t=new

//t.Elapsed+=new

while(true)

Byte[]getBytes=newbyte[1024];

socket.ReceiveFrom(getBytes,refep);

stringgetData=

getData=getData.TrimEnd('

\u0000'

string[]sArra

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2