




已阅读5页,还剩50页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机网络课程设计实验报告专业 计算机科学与技术 专业班级 组长姓名学号 组长联系方式 同组人姓名学号 实验日期 目 录一:实验内容和要求-3二: 实验环境-4三: 程序的需求分析与逻辑框图-4四: 程序核心功能的实现机制-9五: 程序源代码:(核心部分) -24六: 程序扩展功能的需求分析与实现- 34七: 实验数据,结果分析- 35八: 实验总结- 52九: 同组人分工情况-53一:实验内容和要求1.实验一:数据包的捕获与分析实验内容:本实验通过wireshark软件的安装使用,监控局域网的状态,捕获在局域网中传输的数据包,并结合在计算机网络课程中学习到的理论知识,对常用网络协议的数据包做出分析,加深网络课程知识的理解和掌握。实验要求: l wireshark软件的安装;l wireshark软件的启动,并设置网卡的状态为混杂状态,使得wireshark可以监控局域网的状态;l 启动数据包的捕获,跟踪pc之间的报文,并存入文件以备重新查;l 设置过滤器过滤网络报文以检测特定数据流;l 对常用协议的数据包的报文格式进行分析,利用协议分析软件的统计工具显示网络报文的各种统计信息。2.实验二: 网络层实验ping程序的设计与实现实验内容:本实验为icmp实验。实验内容为ping命令实现的扩充。实验要求: 在给定的ping程序的基础上做如下功能扩充:l -h显示帮助信息l -b允许ping一个广播地址,只用于ipv4l -t 设置ttl值,只用于ipv4l -q安静模式。不显示每个收到的包的分析结果,只在结束时,显示汇总结果3.实验三: 应用层实验简单聊天程序的设计与实现实验内容:本实验要求设计并实现一个简单的聊天程序,包括服务器实现和客户端实现.实验要求: l 使用msn或者qq,分析聊天程序的功能需求;l 在给定的参考程序的基础上,参考msn或者qq,对功能做出扩充,不局限于以下的范围:n 在客户端界面上显示所有联入聊天服务器的用户;n 支持两个用户之间的聊天;n 支持增加好友的功能,好友上线时如果该用户在线,则做出提醒;n 增加用户的个人信息修改、保存和查询;n 在聊天内容中支持中文;n 在聊天内容中支持图片等多媒体信息;n 支持在用户之间传输文件等附件;其他扩展。二:实验环境l window 7系统的计算机l linux虚拟机l 路由器,调试解调器l wireshark抓包软件l eclipse java 开发环境三:程序的需求分析与逻辑框图1、 实验一:1.需求分析通过wireshark软件,捕获局域网中的数据包。通过对其中每个包的分析,我们可以系统的了解局域网的状态,进行实时监控。2.逻辑框图2、 实验二:1.需求分析程序分为两大部分:一部分读取收到的所有消息,并输出icmp echo replay消息,另一部分每个一秒钟发送一个echo消息。另一部分由sigalarm信号每秒驱动一次。2.逻辑框图ping程序函数概貌1)main函数2)readloop函数 3)proc函数4)send函数 3、 实验三:1.需求分析本实验要实现的是一个客户端服务器聊天程序,与我们所熟悉的qq,微信,line聊天程序类似,可以参照它们在基本的功能框架上来实现功能的扩展。 扩展功能l1.我们在网络媒体上的交流主要是通过文字,声音,图片,文件等媒介实现的。所以要在原来的基础上增加中文,图片,文件的相互传送。 2.为了友好界面,我们应该设计用户连接,登录,聊天界面,更加实用,便于理解。3.客户端与服务器是多对一的关系,一个服务器可以连接多个客户端。4.应该每个用户单独设计用户名,密码验证以及注册功能5.服务器要与数据库进行连接,更新实时信息,及时的写入读取6.在用户信息显示栏显示好友上线信息,备注信息。2.逻辑框图整体模块设计聊天程序客户端内核客户端界面服务器客户端接收,发送信息机制accept()侦听,建立连接,新建聊天线程。接收发送端客户的信息,将信息发给确定的接受者。更新数据库用户信息,好友信息显示好友聊天对话框连接,登录,注册界面客户端界面设计框图1)初始登录,连接界面2)每个用户属性信息,好友信息界面3)好友之间聊天dialog.java对话框客户端与服务器信息交互逻辑框图客户端与客户端之间信息的发送客户端的登录,注册,信息更新四、程序核心功能的实现机制1、实验一 根据各个报文的报文格式,逐个分析各报文的含义及内容以太网帧格式ieee802.3报文格式ipv4包头格式ipv6包头格式tcp包头格式udp报文格式2实验二:1.读取命令行设计: while(ch=getopt(argc,argv,i:c:p:s:l:abt:w:qi:s:h)!=-1) switch(ch) casei:.,break casec:.break case p:. break.用getopt函数来读取命令行中的命令,用switch-case语句来分别完成每个字母命令所对应的设置。2. -i命令设计:设置interval 当casei时,ctrlintercal会等于后面的参数值,在alarmproc 定时器处理函数中, if(sendinterval=ctrlinterval)sendpacket();sendinterval=0;sendinterval+;如果sendintercal等于ctrlinterval即间隔的话,就发送包并置0,否则就加1.实现控制时间间隔的目的。3. -c命令设计:设置总发包数ctrlsendc为设置的发包数,在sendpacket()中,if(ctrlcode2=1)/设置了总发包数if(sendcount=ctrlsendc)/endprint(sigint);return;如果发包数达到了设置的发包数,就会终止发包,达到控制发包数的目的4. -p 命令设计:设置patternctrlcode3=1;patternlen=strlen(optarg);/pattern 长度temppattern=malloc(patternlen);strncpy(temppattern,optarg,patternlen);/复制optarg内容到tempif(patternlen%2!=0)temppatternpatternlen=temppatternpatternlen-1;temppatternpatternlen-1=0;patternlen+;temppatternpatternlen=0;if(setpattern(temppattern)=-1)err_proc(patterns must be specified as hex digits!);5. -s命令设计: 设置包大小 ctrlpacketsize=atoi(optarg); if(ctrlpacketsize=8)datalen=ctrlpacketsize;/icmp头后边的数据长度elseerr_proc(packet size must be = 8!);ctrlpacketsize为设置的参数值,并且不能小于8,并赋予给datalen,6. -l命令设计:设置预发包数 ctrlcode5=1; ctrlpreload=atoi(optarg);/设置第一次发包数量user=getpwuid(getuid();/得到当前用户权限标识if(user-pw_gid!=0)/如果当前用户不是root权限,第一次发包 数不能大于3if(ctrlpreload3)err_proc(user must be root can set =3!n);/大于3就会显示错误7. -a命令设计: 发出声音若ctrlcode6=1,就会调用下面的函数 void my_sound(printf(%c,soundcode);/soundcode=0x078. -b 命令设计:允许ping广播地址if(ctrlcode7=1)/ctrlcode=7-ballow ping broadcast addresssetsockopt(sockfd, sol_socket, so_broadcast, &size, sizeof(size);9. -t 命令设计:设置ttl ctrlcode8=1; ctrlttl=atoi(optarg); /设置所发包的ttl值 ctrlttl为后面的参数值 并在运行的时候进行相关的设置if(ctrlcode8=1)/ctrlcode=8-tset ttlsetsockopt(sockfd, ipproto_ip, ip_ttl, (const char*)&ctrlttl, sizeof(ctrlttl);10. -w 命令设计:设置deadline ctrlcode9=1; ctrldeadline=atoi(optarg); ctrldeadline为后面的参数值 在alarmproc函数中 if(ctrlcode9=1)if(waitinterval=ctrldeadline)/设置了deadlinedeadline();waitinterval+;通过waitinterval和ctrldeadline进行时间的控制,当到达deadline时,执行deadline子函数voiddeadline()printf(time out!n);kill(pid,sigint);进而结束进程。11. -q 命令设计:设置安静模式 ctrlcode10 在ipv4和ipv6处理函数中void proc_v4(char *ptr, ssize_t len, struct timeval *tvrecv)/ipv4处理函数 . if(ctrlcode10!=1)/不是安静模式则输出信息,否则不输出printf(%d bytes from %s: seq=%u, ttl=%d, rtt=%.3f msn, icmplen, sock_ntop_host(pr-sarecv, pr-salen), icmp-icmp_seq, ip-ip_ttl, rtt);在ipv6处理函数中类似,在此不粘贴了。12. -i命令设计:设置源ip ctrlcode11=1; ctrlsource=optarg在void setipheader(int icmphlen)中实现/填充ip头iph.verlen=0x45;iph.total_len=htons(sizeof(iph)+icmphlen); /16位总长度(字节)iph.id=1; /16位标识iph.frag=0; /3位标志位iph.ttl=128; /8位生存时间ttltocol=ipproto_icmp; /8位协议(tcp,udp)iph.checksum=0; /16位ip首部校验和iph.sourceip=inet_addr(ctrlsource); /32位源ip地址iph.destip=inet_addr(host); /32位目的ip地址13. -s 命令设计:设置sndbuf ctrlcode12=1; ctrlsndbuf=atoi(optarg);/大小等于后面的参数 if(ctrlsndbuf=0)printf(error:bad sndbuf value!n);/如果小于等于0就会报错exit(0);在mainloop函数中实现sndbufsize=ctrlsndbuf*84*1024;14. -h命令设计:显示帮助 ctrlcode13=1 在下面的函数中实现 if(ctrlcode13=1) print_instruction();return 0; voidprint_instruction()printf(usage: myping -abqhv -c count -i interval -w deadlinen);printf( -p pattern -s packetsize -t ttl -l preloadn);printf( -i source -s sndbuf destinationn);printf(explain:n);printf(-aaudible ping.nn);printf(-ballow pinging a broadcast address.nn);printf(-qquiet output. nothing is displayed except the summary n);printf(lines at startup time and when finished.nn);printf(-hshow help and explain.nn);printf(-ccountn);printf(stop after sending count echo_request packets.nn);printf(-iintervaln);printf(wait interval seconds between sending each packet.nn);printf(-wdeadlinen);printf(specify a timeout, in seconds, before ping exits regardless ofn); printf(how many packets have been sent or received.nn); printf(-ppatternn);printf(specify up to 16 hex bytes to fill out the packet you send.nn);printf(-spacketsizen);printf(specifies the number of data bytes to be sent.nn);printf(-tttln);printf(set the ip time to live.nn);printf(-lpreloadn);printf(if preload is specified, ping sends that many packets not n);printf(wait-ing for reply. only the super-user may select preloadn);printf(more than3.nn);printf(-isourcen);printf(set source address to specified interface address.nn);printf(-ssndbufn);printf(set socket sndbuf. if not specified, it is selected to n);printf(buffer not more than one packet.nn);3、实验三:1)客户端界面 连接,登录,注册界面首先根据初始的界面设计,进行布局设置,利用borderlayout,jpanel, jtextfield,jbutton等控件摆出连接界面的布局,并在按钮,输入框中添加事件监听,键盘监听以及焦点事件监听addactionlistener(),addkeylistener(),addfocuslistener()。addfocuslistener()焦点事件监听基本框架中已经给出,包括 public void focusgained(focusevent e)public void focuslost(focusevent e)addkeylistener()键盘事件监听包括keypressed(keyevent arg0)keyreleased(keyevent arg0)keytyped(keyevent e) 设置键盘响应(enter) 当name框按下enter,焦点到msgwindow,当在host框按下enter键,焦点到port框,当在port框按下enter键,焦点到nick框。addactionlistener()按钮事件监听用户信息,好友信息显示界面根据初始的界面设计,进行布局设置,利用borderlayout,jpanel,jscrollpane, jtextfield,jbutton等控件摆出用户界面的布局,并在按钮,输入框中添加事件监听,键盘监听以及焦点事件监听addactionlistener(),addkeylistener(),addfocuslistener()。与上面的设置类似,之后又增加了好友信息的显示,用两个字符数组string templisto,string templistf来存储用户的用户属性信息以及好友的用户,备注姓名信息。用两个列表lso = new list();lsf = new list();来显示所有在线的用户以及好友用户信息。事件监听:用户与用户之间聊天显示界面同样根据初稿的界面设计,进行布局设置,利用borderlayout,jpanel,jscrollpane, jtextfield,jbutton等控件摆出用户界面的布局,并在按钮,输入框中添加事件监听,键盘监听以及焦点事件监听addactionlistener(),addkeylistener(),addfocuslistener()。添加函数setttype()显示接收到的图片。事件监听:主体为三个文字,图片,文件按钮的监听2)客户端内核 clientkernel()实现的主要功能:1.与服务器建立连接,创建套接口 2.接收来自界面发送过来的信息,并将其发送给服务器3.接收来自服务器的信息,并输出到响应显示对话框。1. connect();建立连接,初始化套接口sock = new socket(serverad, port);sock2 = new socket(serverad,port+200); sock2用于文件的传输发送2.接收来自三个用户端界面的消息getmsgfrom_userclient(),getmsgfrom_ dialog()getmsgfrom_connect这三个函数表示。getmsgfrom_ dialog()如果是文字信息msg直接发送给服务器,如果是file文件,利用socket2将信息文件名发送服务器;getmsgfrom_connect()获取服务器地址,端口号,用户名以及密码;如果是con注册信息,向服务器发送con+l +用户名+密码,如果是reg登录信息,向服务器发送con+r +用户名+密码,3.客户端接收或者发送信息 clientmsgsender extends thread clientmsglistener extends threadclientmsgsender extends thread 客户端发送信息到服务器具体流程图如下图所示 客户端信息发送流程图3. clientmsglistener extends thread接收来自服务器的信息 客户端接收信息流程图clientfilesender()客户端文件信息的发送 class clientfilelistener()客户端文件信息的接收3)服务器端mainsever()初始化服务器套接口server,server2,调accept()函数进行阻塞侦听,如果有客户端请求,建立连接socket2 = server2.accept(); socket = server.accept();为每个新建连接的用户新建一个chat_thread()线程,并添加到线程池,用bman进行统一管理。chat_thread()流程如下图所示 chat_thread()处理流程图4)数据库的设计用户信息表(用户名,密码,是否在线,爱好,性别,年龄)好友关系表(a,b,备注姓名)五、程序源代码(核心部分)1、实验二如上核心的设置机制处所示,在核心分析的同时已经给出了核心代码,在这就不再重复了2、实验三1)服务器核心代码服务器接收来自客户端信息并做相应处理public void run() try class.forname(sun.jdbc.odbc.jdbcodbcdriver); /加载驱动程序 catch (classnotfoundexception e1) / todo auto-generated catch blocke1.printstacktrace();try reader = new bufferedreader(new inputstreamreader(socket.getinputstream(); /输入流放到buffer缓冲区writer = new printwriter(socket.getoutputstream(), true);/使用printwriter建立一个发送信息的通道string msg;while (isrunning) if (msg = reader.readline() != null) if (msg.startswith(login) username = msg.substring(7);/获取用户名reflash(true, true, true, false); else if (msg.startswith(firend) / 添加好友表项string bfirend = msg.substring(8);msg_firend(bfirend); else if (msg.startswith(change) / 修改好友备注“change好友 备注”msg_change(msg); else if (msg.startswith(update) msg_update(msg); else if (msg.startswith(msg) / 发送信息到指定对象system.out.print(msg);bman.sendtoall(msg); else if (msg.startswith(file) / 发送文件string temp = msg.substring(6);string type = temp.substring(0, temp.indexof( );temp = temp.substring(temp.indexof( )+1);string listener = temp.substring(0,temp.indexof( );temp = temp.substring(temp.indexof( )+1);string sender = temp.substring(0, temp.indexof( );temp = temp.substring(temp.indexof( ) + 1);getfile(type,msg); /接收bman.sendtoo(listener,msg);sendfile(type,msg,listener); /发送 system.out.println(socket2.isclosed(); else if (msg.startswith(con)msg_connect(msg); else if (msg.startswith(exit) this.isrunning = false;bman.sendtos(this, msg);bman.remove(this);reflash(false, true, false, true);break; catch (ioexception e) / todo auto-generated catch blocke.printstacktrace(); finally try bman.remove(this);if (reader != null)reader.close();if (writer != null)writer.close();if (socket != null)socket.close();reader = null;writer = null;socket = null;system.out.println(username + 已下线.); system.out.println(连接人数: + bman.size(); catch (exception e) private void msg_connect(string msg) /提取用户名,密码,查找数据库,登录 string temp = msg.substring(5); string mark = temp.substring(0, temp.indexof( ); temp = temp.substring(temp.indexof( )+1); string username = temp.substring(0,temp.indexof( ); string password = temp.substring(temp.indexof( )+1); try connection con;con = drivermanager.getconnection(jdbc:odbc:mychatdb, , );/与数据库建立连接java.sql.statement stmt = con.createstatement();if(mark.equals(l) /登录resultset rset = stmt.executequery(select * from user where username = + username + and password =+password +);if (rset.next() bman.sendtos(this, success); else if(mark.equals(r) /insert,新用户注册stmt.executeupdate(insert into user values(+ username + , + password + ,1, , ,0););bman.sendtos(this, success); catch (sqlexception e) / todo auto-generated catch blocke.printstacktrace(); private void msg_update(string msg) /修改用户的属性信息/ todo auto-generated method stubstring temp = msg.substring(8);string mark = temp.substring(0, temp.indexof( );string newinfo = temp.substring(temp.indexof( ) + 1);try connection con;con = drivermanager.getconnection(jdbc:odbc:mychatdb, , );java.sql.statement stmt = con.createstatement();if (mark.equals(h) stmt.executeupdate(update user set habit = + newinfo+ where username = + username + ); else if (mark.equals(s) stmt.executeupdate(update user set sex = + newinfo+ where username = + username + ); else if (mark.equals(a) stmt.executeupdate(update user set age = + newinfo+ where username = + username + );reflash(false, true, false, false);con.close();stmt.close(); catch (sqlexception e) / todo auto-generated catch blocke.printstacktrace();private void msg_change(string msg) /修改备注姓名,更新数据库/ todo auto-generated method stubstring temp = msg.substring(8);string fname = temp.substring(0, temp.indexof( );string remark = temp.substring(temp.indexof( ) + 1);try connection con;con = drivermanager.getconnection(jdbc:odbc:mychatdb, , );java.sql.statement stmt = con.createstatement();stmt.executeupdate(update firend set remark = + remark+ where afirend = + username+ and bfirend = + fname + );stmt.close();con.close(); catch (sqlexception e) / todo auto-generated catch blocke.printstacktrace();reflash(false, false, true, false);private void msg_firend(string bfirend) /增添新的好友关系消息/ todo auto-generated method stubtry connection con;con = drivermanager.getconnection(jdbc:odbc:mychatdb, , );java.sql.statement stmt = con.createstatement();resultset rset = stmt.executequery(select username from user where username = + bfirend + );if (!rset.next() bman.sendtos(this, nouser); /用户不存在 else rset = stmt.executequery(select * from firend where afirend = + bfirend+ and bfirend = + username+ );if (rset.next() bman.sendtos(this, havei); /已经存在 else stmt.executeupdate(insert into firend values(+ username + , + bfirend + ,););stmt.executeupdate(insert into firend values(+ bfirend + , + username + ,););bman.sendtos(this, shave); /添加成功reflash(false, false, true, false);stmt.close();con.close(); catch (sqlexception e) / todo auto-generated catch blocke.printstacktrace(); /服务器刷新,更新数据库private void reflash(boolean istip, boolean isuser, boolean isfirend,boolean isclose) /刷新好友表,用户表/ todo auto-generated method stubstring msg1 = ;string msg2 = ;resultset rset;try connection con;msg1 = user;msg2 = f
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 7-Python程序设计 python试题标准答案及评分标准
- 机械设备租赁协议书范本2025年
- 工程装修合同范本2025年
- 聚焦2025年:医疗器械国产化替代对行业竞争格局的调整报告
- 二零二五年度客服外包服务合同大全
- 2025版工程车辆买卖合同运输、培训及安全操作指导服务合同
- 2025版餐饮APP线上线下融合与品牌推广合同
- 2025年度广告活动策划合同范本简易指南
- 2025年版新能源项目担保合同与主合同技术支持协议
- 2025版灯光工程设计与施工及全程维护合同
- 中医诊断学中的血常规检查辨证方法研究
- 道路交通安全隐患排查治理投标方案(技术标 方案)
- 小学奥数:计算《分数的巧算》练习题
- PDCA降低护士针刺伤发生率
- 阴道炎培训演示课件
- 组建风险管理咨询公司方案
- 汽车项目管理工作总结
- 丹毒课件护理查房
- 浙江宁波慈溪市机关事业单位招聘编外工作人员24人笔试参考题库(共500题)答案详解版
- PMC-651T配电变压器保护测控装置使用说明书V1.2
- 复盘应用操作工具模板(非常实用、全面-流程化操作-即填即用)
评论
0/150
提交评论