2010秋计算机网络实验指导书_第1页
2010秋计算机网络实验指导书_第2页
2010秋计算机网络实验指导书_第3页
2010秋计算机网络实验指导书_第4页
2010秋计算机网络实验指导书_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、计算机网络计算机网络实验指导书实验指导书 李全龙李全龙 哈尔滨工业大学 计算机科学与技术学院 2010 年 10 月 15 日 前前 言言 计算机网络课程是计算机科学与技术专业的重要专业课程之一。随着 计算机网络技术的迅速发展和在当今信息社会中的广泛应用,给计算机网络 课程的教学提出了新的更高的要求。 由于计算机网络是一门实践性较强的技术,课堂教学应该与实践环节紧密 结合。将计算机网络课程建设成世界一流的课程,是近期计算机网络 课程努力的方向。 希望同学们在使用本实验指导书及进行实验的过程中,希望同学们在使用本实验指导书及进行实验的过程中, 能够帮助我们不断地发现问题,并提出建议,使能够帮助我

2、们不断地发现问题,并提出建议,使计算机计算机 网络网络成为具有世界一流水平的课程。本学期授课教师为成为具有世界一流水平的课程。本学期授课教师为 李全龙老师,参与网络课程助教环节的教师为闫庆军、胡李全龙老师,参与网络课程助教环节的教师为闫庆军、胡 刚、韩宝梅同学,参与实验课程的实验教师李全龙老师、刚、韩宝梅同学,参与实验课程的实验教师李全龙老师、 娄久老师、闫庆军、胡刚、韩宝梅、罗日新、许洪春、荆娄久老师、闫庆军、胡刚、韩宝梅、罗日新、许洪春、荆 燕燕、闫昕。燕燕、闫昕。Github 简明指导手册简明指导手册 目录 1. 简介 2. 入门资料 3. 客户端 简介简介 Github,一大创新是成为

3、程序员的 SNS、微博。你的代码、创意、讨论就是你在 SNS 和微博 中构建的个人内容,而且这些内容都是在日常工作中自然构建的。欢迎大家 follow https:/ 入门资料入门资料 GotGitHub 是蒋鑫原创的一本免费电子书。虽然免费,但质量很高,而且是中文的啊,亲。 建议先阅读第一章,对 github 建立一个大体认识,然后就可以注册账号开始使用了。Github 的界面设计得非常友好,而且对新手有很精当的提示,大多情况按着界面走就能把功能用起来。 当遇到问题时,再到蒋鑫的书及官方帮助里找找答案。 本课程可能用到的功能主要包括: 1.创建新项目:http:/ project.html

4、2.公钥认证管理: 1.中文资料:http:/ hosting/030-repo-authz.html 2.安装 git 及创建自己的公钥:http:/ 3.多人协作共享版本库:http:/ others/020-shared-repo.html 建议使用的功能: 1.缺陷跟踪,用来分配、讨论、管理任务: http:/ 2.维基,用来协作写文档:http:/ others/060-wiki.html 其它还有很多好玩的功能,感兴趣的自己挖掘吧。 客户端客户端 推荐一个 Github 官方针对 Git 的图形客户端(遗憾的是目前似乎只有 Mac 版本) 网址是 http:/ 看过命令介绍的童鞋应

5、该很快就能上手,虽然这个图形客户端肯定是没有命令行那么好用, 不过应付大部分任务应该还是没有问题的 Git 简明指导手册简明指导手册 目录 1. 基本使用 1.1. 安装和配置 1.2. 创建新容器(repository) 1.3. 下载代码 1.4. 更新代码 1.5. 合并他人的更新 2. 高级功能 2.1. 忽略非源码文件 2.2. 撤销修改 2.3. 删除文件 3. 参考资料和建议 4. 常见错误 4.1. error:failed to push som refs to 基本使用基本使用 安装和配置安装和配置 Github 提供了非常详细的安装和初始配置教程:http:/ 创建新容器

6、(创建新容器(repository) 详细信息:http:/ 简化版: 假设 repository 的名字叫 hello-world。先在 github 上创建并写好相关名字,描述。 $cd /hello-world /到 hello-world 目录 $git init /初始化 $git add . /把所有文件加入到索引(不想把所有文件加入,可以用 gitignore 或 add 具体文件) $git commit /提交到本地仓库,然后会填写更新日志( -m “更新日志”也可) $git remote add origin :username/hello-world.git /增加到

7、remote $git push origin master /传送到 github 上 下载代码下载代码 一人创建好 repo 后,其它人不需要再创建,而是直接下载 $git clone :username/hello-world.git 更新代码更新代码 无论新加了文件,还是只有文件修改 $cd /hello-world $git add . /这样可以自动判断新加/更改了哪些文件,或者手动加入文件名字 $git commit /提交到本地仓库 $git push origin master /不是新创建的,不用再 add 到 remote 上了 合并他人的更新合并他人的更新 假如本地已经

8、存在了代码,而远程 repo 里有更新,把更改的合并到本地的项目: $git fetch /获取远程更新 $git merge origin/master /把更新的内容合并到本地分支 或者就是简单的一个 $git pull 注:push 自己的更新之前,必须先合并远端有而本地没有的更新,否则可能会遇到一些问题 高级功能高级功能 忽略非源码文件忽略非源码文件 有些文件是不需要用 git 管理的,比如编译过程中产生的*.o,*.class,*.exe,*.apk 等,编辑器产生 的*.bak、*.swp 等 $cd /hello-world $vim .gitignore /把文件类型加入到.g

9、itignore 中,保存 以后再 git add . 能自动过滤与.gitignore 中内容匹配的文件。 更详细的说明:http:/ 撤销修改撤销修改 如果做了一些修改,但发现不对,但还没 commit,可以用下面命令恢复到修改前最后一次 commit 的状态 $git checkout - path/filename 删除文件删除文件 $git rm * / 不是用 rm $git commit 参考资料和建议参考资料和建议 建议用“Learn by doing”的方式学习 git,用到什么功能就学习一下什么功能,遇到什么问题就 找相应解决方法,循序渐进日积月累逐渐掌握 git。 最便捷

10、的获取帮助的方式:git command -help “照猫画虎”地使用 git 命令虽然一般足以应对大多数情况,但如果能对 git 有比较深入的了解, 可以更得心应手,所以建议读至少一本 git 书的基础部分: ProGit 中文版: /book/zh/ (前三章就足以应付我们的日常使用了。 如果你想深度理解一下,接着向后读吧。 ) Git Community Book: http:/book.git- Git 权威指南:http:/ 常见错误常见错误 error:failed to push som refs to $ git push origin mas

11、ter 错误提示:error:failed to push som refs to 解决办法:$ git pull origin master /先把远程服务器 github 上面的文件拉先来,再 push 上去。 Use Git FEB 25TH, 2012 初学初学 git 想想自己接触 git 也快一年了。记得当时刚刚接触的时候,一无所知,根本就不知 道什么是版本控制系统。 听学长说是很有用的工具,然后也就这样开始接触。记 得当时看着官方的 help 文档,一步一步地操作。 对于我这个大一英语全不及格的 人来说,可真是苦不堪言啊。 忙了一整个下午,最终还是一头雾水,也不知道当 时整好了没

12、有。根本就分不清 git 和 github 的关系。 还看着一堆的英文的东西, 哎往事不堪回首,这样想起来,貌似这一年自己还是收获很多的。 希望下一 年能够让自己收说更多的,嘿嘿 git 和和 github 我刚开始的时候,就是搞不懂 git 和 github 之间的关系。当时就知道这是个版本控 制工具, 到底版本控制工具有什么作用呢,根本就没有什么切实的体会。再加上 一堆的英文的文档,惨不忍睹啊。 其实本质上讲,git 和 github 一点关系都没有。 就像那些笔记本电脑和京东没有一点关系。git 本身是一个程序。 这个程序能够对 变动的目录进行跟踪,检出,恢复等等一堆强大的功能。 而我们

13、写代码不就是在 一个目录里到处变更文件吗?这样子管理起来就会很麻烦。所以 git 就很形象的称 为版本控制 工具了。不过要说 git 的起源还是在维护 linux 内核的时候诞生的,这 方面的资料网上有很多。所以 git 就是一个程序, 在 linux 下,它就形象的展现成 命令行,你就可以在里面输入命令之类的。就这么简单。再来说说 github。 它直 观的表示就是一个网站,但是不同的是它这个网站有着特别的功能。最主要的功能 就是,你可以在它那里托管 你的代码。再加上其它一些辅助功能,使得你能够更 好的工作。想 github 这样的托管的网站有很多: sourceforge bitbucke

14、t gitcafe code.google 还有其他一些相似的网站,另外,相对的,版本控制工具也不止 git 一个,使用比 较广泛的还有 svn hg cvs 这些都可以在网上很轻松的搜索到相关资料。 使用使用 git 和和 github 讲讲具体使用 git 和 github 来维护自己的项目时候要用到的命令和过程 安装 git 这个比较简单。在 linux 下面,你可以选择编译安装或者是直接使用 apt-get 来安 装。 使用 apt-get 安装: sudo apt-get install git-core git-doc 安装完成之后,输入下面命令检查是否安装成功: git -ver

15、sion 查看是否顺利的输出版本号 使用编译安装 运行下面命令安装编译依赖的软件包 sudo apt-get built-dep git-core git-doc 下载 git 源码包并且解压,切换到源码包的目录,执行下面命令: make prefix=/usr/local all doc sudo make install install-doc 安装完成后可以查看自己的 git 版本。 使用 git 如果只是使用 git 版本控制工具,那么,你知道在你的项目文件目 录下面运行命令 git init 就会在该目录下面创建一个版本库了,你会发现在该目录下面多了一个.git 的目录。 在这里还是

16、结合 github 一起讲解。 在 github 上注册一个帐号。之后主要的一部 就是设置公钥和私钥。github 采用 ssh 协议进行代码的传输认证。 其实 ssh 协议 在这里理解很简单,就是你通过一个命令,产生一对公钥和私钥,这两个是有联系 的。你把公钥放在 github 的网站上,然后私钥留在自己的电脑里面,每次你要和 github 通信的时候,它就会认证一下是否是管理用户。 使用下面命令可以产生一 堆公钥和私钥。 ssh-keygen /.ssh/id_rsa 是私钥,/.ssh/id_rsa.pub 是公钥,你可以用文本编辑器打开公钥文 件, 你把公钥文件里面的内容复制到 git

17、hub 上的你的账户里的相应位置(专门有 这么一个地方)。再执行下面命令, 测试是否成功。 ssh -T 现在你可以在 github 上面建立一个仓库了。写好你的仓库的名字。然后就是把你 的本地仓库代码送到远程里面。 假设你在本地有一个仓库了,执行下面两条命令, 这两条命令是告诉远程版本库是谁提交的版本库 git config -global yourname git config -global user.email youremail 添加远程版本库: git remote add origin :cloudaice/helloworld.git 其中 origin 是

18、给远程版本库起的一个名字,这个名字和我们在 github 上建立的版 本库的名字是不相关的, 只是对于我们本地给它起的一个名字。后面表示,版本 库的路径,在这里是 cloudaice 路径下的 helloworkd.git 版本库。在这里要重点说 一下,github 支持三种协议传输,但是只有 ssh 协议才能够执行 push 操作, 因 此在添加远程版本库的时候最好使用该添加方法,如果对于远程版本库,我们不执 行推送的话, 比如是和别人协作的时候,对于管理员的版本库,我们就只需要 pull。因此,可以使用另外两种方法 git remote add origin git:/:cloudaice

19、/helloworld git remote add origin https:/:cloudaice/helloworld 到此就算把本地版本库和远程的联系起来了,下面介绍一些常用命令。 下面提到的下面提到的 origin 默认表示远程版本库的名称,默认表示远程版本库的名称,origin/master 默认表示远程版默认表示远程版 本库本库 origin 中的中的 master 分支分支 git add filename 把该目录下的这个文件添加到暂存区; git add . 把目录下的所有文件添加到暂存区。在这里你可以通过建立一个.gitignore文件, 在里面写如你不想添加到暂存区的

20、文件的名字。这样即使执行这条命令也不会把 那些文件添加到暂存区了。 git commit -m infomation 提交暂存区的内容到版本库,引号里面的为你的本次提交的信息,最好写的清晰明 白。 git push origin master 将本地的版本库推送到远程版本库中,origin 是远程版本库的名字,master 是远 程版本库的分支名称。 当有多个分支的时候,可以采用下面命令 git push origin localbranch:remotebranch localbranch 表示本地分支名称,remotebranch 表示远程版本库分支名称 git branch 查看当前本地

21、分支,其中当前使用的分支会在前面加上*号 git branch -a 查看所有分支,包括远程分支 git branch -r 显示远程版本库 git remote -v 查看所有远程版本库 git branch branchname 基于当前分支,创建分支 git checkout branchname 检出分支,即转到该分支目录下 git checkout -b currentbranch newbranch 基于 currentbranch 分支创建 newbranch 分支,并且检出 newbranch 分支 git branch -m oldname newname 分支重命名,old

22、name 为原来名字,newname 为新的名字。 git merge branchname 合并分支,把 branchname 分支合并到当前的分支上面来,一般 branchname 分 支是基于当前分支创立的。 这种合并方法是合并全部的。 git cherry-pick -n 提交号 1 git cherry-pick -n 提交号 2 . . git cherry-pick -n 提交号 m 这样可以任意选择合并哪个提交号,git 里面的提交号是由 40 位的 hash 码组成一 般前七位就足够辨别了。 git branch -d branchname 删除分支 branchname。

23、git status 查看当前状态 git fetch origin master 将远程版本库拖到本地的一个远程版本库中,其实添加一个远程版本库的时候,都 会在本地有一个远程版本库的复制。 我们可以通过 git checkout origin/master 检出远程版本库,因此 fetch 命令计时将远程版本库的更新同步到本地的远程版本 库 git pull origin/master 把远程版本库的更新同步到本地的远程版本库,并且合并与之相对应的本地版本库。 相当于下面两条命令的组合: git fetch origin master git merge origin/master 另外:另

24、外:HEAD 关键字指向版本库中的末稍,即为最后一次提交的版本库关键字指向版本库中的末稍,即为最后一次提交的版本库 学习 git 的网站: + worldhello + 白话 git + 高校利用 git Posted by cloudaice Feb 25th, 2012 git Tweet 实验要求实验要求 计算机网络是现代信息社会最重要的基础设施之一。在过去十几年里得到 了迅速的发展和应用。 计算机网络课程实验的目的是为了使学生在课程学习 的同时,通过在一个计算机网络环境中的实际操作,对现代计算机网络的基本 功能有一个初步的了解;通过实现一个数据链路层协议,掌握计算机网络通信 协议的基本

25、实现技术;通过一个简单文件传送协议的设计和实现,了解计算机 网络高层协议设计实现的环境和方法;还提供了一些可以选作的实验以供有余 力有兴趣的同学进一步提高。总之,通过上述实验环节,使学生加深了解和更 好地掌握计算机网络课程教学大纲要求的内容。 在计算机网络的课程实验过程中,要求学生做到: (1)每次实验前应预习实验指导书有关部分,认真做好实验内容的准备, 就实验可能出现情况提前做出思考和分析。 (2)仔细观察上机和上网操作时出现的各种现象,记录主要情况,做出必 要说明和分析。 (3)认真书写实验报告。实验报告包括实验目的和要求,实验情况及其分 析。对需要编程的实验,写出程序设计说明,给出源程序

26、框图和清单。 (4)遵守机房纪律,服从辅导教师指挥,爱护实验设备。 (5)实验课程不迟到。如有事不能出席,所缺实验一般不补。 实验的验收将分为两个部分。第一部分是上机操作,包括检查程序运行和 即时提问。第二部分是提交电子版的实验报告。此外,网络实验采用当堂检查当堂检查 方式,每个实验都应当在规定的时间内完成并检查通过,过期视为未完成该实 验,不计成绩。以避免集中检查方式产生的诸多不良问题,希望同学们抓紧时 间,合理安排,认真完成。 实验一:实验一:TCP/IP 编程编程 1、实验目的: 掌握 Socket 编程过程,编写简单的网络应用程序。 2、实验环境: Windows 9x/NT/2000

27、/XP/2003 TCP/IP 协议 3、编程工具: Java(JCreator IDE) ,c/c+(VC+ 6.0) 4、实验内容: 1) 利用编程语言,分别基于 TCP 和 UDP 编写一个简单的 Client/Server 网络应用程 序。要求实现客户向服务器传输任意一个字符串,服务器将收到的字符串变换成大写后 传回客户。 2) 修改上述程序,分别基于 TCP 和 UDP,实现服务器根据客户请求,将客户端指定 的文件可靠地传输给客户。如果服务器没有指定的文件,服务器将给客户返回一个信息, 通知客户其请求文件不存在。 基于 UDP 的文件传输可以考虑利用“停等协议”保证其可靠性。 3)

28、有条件的同学可以进一步改进 2)的程序,使之更实用。比如可以请求服务器先传 输目录,然后客户根据目录请求传输文件等。 选作内容,加分项目:(可以当堂完成或课下完成)选作内容,加分项目:(可以当堂完成或课下完成) 4)在 2)的基础上,实现多线程的文件服务器。即服务器可以同时为多个客户端传 送文件。实现的手段为对每一个客户端请求,服务器主线程创建一个新的线程为其传送文 件,然后主线程返回,继续等待其它客户端的连接请求。 5、实验方式: 每位同学上机编程实验,实验指导教师现场指导。 6、参考内容: 6.1 JAVA 版本的 socket 编程样例 (1) 基于基于 TCP 实现客户向服务器传输任意

29、一个字符串的客户端程序:实现客户向服务器传输任意一个字符串的客户端程序: TCPClient.java import java.io.*: import .*: class TCPClient public static void main(String argv) throws Exception String sentence; String modifiedSentence; BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in); Socket clientSocket = new

30、Socket(“hostname”,6789);/hostname is server domainame DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream(); BufferedReader inFromServer = new BufferedReader(new InputStreamReader( clientSocket.getInputStream(); sentence = inFromUser.readLine(); outToServer.writeBytes(se

31、ntence + n); modifiedSentence = inFromServer.readLine(); System.out.println(“FROM SERVER:”+modifiedSentence); clientSocket.close(); (2) 基于基于 TCP 实现服务器将收到的字符串变换成大写后传回客户的服务器端程序:实现服务器将收到的字符串变换成大写后传回客户的服务器端程序: TCPServer.java import java.io.*: import .*: class TCPServer public static void main(String arg

32、v) throws Exception String ClientSentence; String capitalizedSentence; ServerSocket welcomeSocket = new ServerSocket(6789); While(true) Socket connectionSocket = welcomeSocket.accept(); BufferedReader inFromClient = new BufferedReader(new InputStreamReader( connectionSocket. getInputStream(); DataOu

33、tputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream(); ClientSentence = infromClient. readLine(); capitalizedSentence = clientSentence.toUpperCase() + n; outToClient.writeBytes(capitalizedSentence); (3)基于)基于 UDP 实现客户向服务器传输任意一个字符串的客户端程序:实现客户向服务器传输任意一个字符串的客户端程序: UDPClient.ja

34、va import java.io.*: import .*: class UDPClient public static void main(String args) throws Exception BufferedReader infromUser = new BufferedReader(new InputStreamReader(System.in); DatagramSocket clientSocket = new DatagramSocket(); InetAddress IPAddress = InetAddress.getByName(“hostname”); byte s

35、endData = new byte1024; byte receiveData = new byte1024; String sentence = infromUser.readLine(); sendData = sentence.getBytes(); DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress,9876); clientSocket.send(sendPacket); DatagramPacket receivePacket = new DatagramPacke

36、t(receiveData, receiveData.length); clientSocket.receive(receivePacket); String modifiedSentence= new string(receivePacket.getData(); System.out.println(“FROM SERVER:” + modifiedSentence); clientSocket.close(); (4)基于)基于 UDP 实现服务器将收到的字符串变换成大写后传回客户的服务器端程序实现服务器将收到的字符串变换成大写后传回客户的服务器端程序: : UDPServer.java

37、 import java.io.*: import .*: class UDPServer public static void main(String args) throws Exception DatagramSocket serverSocket = new DatagramSocket(9876); byte receiveData = new byte1024; byte sendData = new byte1024; while(true) DatagramPacket receivePacket = new DatagramPacket(receiveData, receiv

38、eData.length); serverSocket.receive(receivePacket); String sentence = new String(receivePacket.getData(); InetAddress IPAddress = receivePacket.getAddress(); int port = receivePacket.getPort(); String capitalizedSentence = sentence.toUpperCase(); sendData = capitalizedSentence.getBytes(); DatagramPa

39、cket sendPacket = new DatagramPacket(sendData, sendData.length,IPAddress,port); serverSocket.send(sendPacket); (5) 实现服务器根据客户请求,将客户端指定的文件可靠地传输给客户。如果服务器没实现服务器根据客户请求,将客户端指定的文件可靠地传输给客户。如果服务器没 有指定的文件,服务器将给客户返回一个信息,通知客户其请求文件不存在。有指定的文件,服务器将给客户返回一个信息,通知客户其请求文件不存在。 TCPFileClient.java import java.io.*: import

40、 .*: class TCPFileClient public static void main(String argv) throws Exception String sentence; String modifiedSentence; BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in); Socket clientSocket = new Socket(“hostname”,6789);/hostname is server domainame DataOutputStream o

41、utToServer = new DataOutputStream(clientSocket.getOutputStream(); BufferedReader inFromServer = new BufferedReader(new InputStreamReader( clientSocket.getInputStream(); System.out.println(“Please Enter File Name:”); sentence = inFromUser.readLine(); outToServer.writeBytes(sentence + n); modifiedSent

42、ence = inFromServer.readLine(); System.out.println(“FROM SERVER:”+modifiedSentence); clientSocket.close(); TCPFileServer.java import java.io.*: import .*: class TCPFileServer public static void main(String argv) throws Exception String ClientSentence; String capitalizedSentence; ServerSocket welcome

43、Socket = new Server Socket(6789); While(true) Socket connectionSocket = welcomeSocket.accept(); BufferedReader infromClient = new BufferedReader(new InputStreamReader( connectionSocket. getInputStream(); DataOutputStream outToClient = new DataOutputStream( connectionSocket.getOutputStream(); ClientS

44、entence = infromClient. readLine(); try RandomAccessFile in=new RandomAccessFile( ClientSentence,”r”); String s; String total=” “; While(s=in.readLine()!=null) total=total+s; outToClient.writeBytes(total+n); in.close(); catch(Exception e) outToClient.writeBytes(“文件不存在!”); (6) 实现可以请求服务器先传输目录,然后客户根据目录

45、再请求传输文件的网络应用。实现可以请求服务器先传输目录,然后客户根据目录再请求传输文件的网络应用。 请同学们自己编写。 6.2 C 版本的版本的 socket 编程样例编程样例 Udp 服务器端服务器端等待接收客户端传来的等待接收客户端传来的“hello”并打印并打印 #pragma comment(lib, wsock32.lib) #include #include void main() WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 1, 1 ); err = WSAStar

46、tup( wVersionRequested, if ( err != 0 ) return; if ( LOBYTE( wsaData.wVersion ) != 1 |HIBYTE( wsaData.wVersion ) != 1 ) WSACleanup( ); return; SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0); SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); addrSrv.sin_family=AF_INET; addrSrv.sin_por

47、t=htons(6000); bind(sockSrv,(SOCKADDR*) SOCKADDR_IN addrClient; int len=sizeof(SOCKADDR); char recvBuf100; recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*) printf(%sn,recvBuf); closesocket(sockSrv); WSACleanup(); Udp 客户端客户端向服务器端发送向服务器端发送“hello”字符串字符串 #include #include #pragma comment(lib, wsock32.lib) voi

48、d main() WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 1, 1 ); err = WSAStartup( wVersionRequested, if ( err != 0 ) return; if ( LOBYTE( wsaData.wVersion ) != 1 | HIBYTE( wsaData.wVersion ) != 1 ) WSACleanup( ); return; SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0)

49、; SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr=inet_addr(); addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(6000); sendto(sockClient,Hello,strlen(Hello)+1,0, (SOCKADDR*) closesocket(sockClient); WSACleanup(); Tcp 服务器端服务器端-接收客户端发来的接收客户端发来的“hello”字符串字符串 #pragma comment(lib, wsock32.li

50、b) #include #include void main() WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 1, 1 ); err = WSAStartup( wVersionRequested, if ( err != 0 ) return; if ( LOBYTE( wsaData.wVersion ) != 1 | HIBYTE( wsaData.wVersion ) != 1 ) WSACleanup( ); return; SOCKET sockSrv=socket(

51、AF_INET,SOCK_STREAM,0); SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(6000); bind(sockSrv,(SOCKADDR*) listen(sockSrv,5); SOCKADDR_IN addrClient; int len=sizeof(SOCKADDR); while(1) SOCKET sockConn=accept(sockSrv,(SOCKADDR*) cha

52、r sendBuf50; sprintf(sendBuf,Welcome %s to here!,inet_ntoa(addrClient.sin_addr); send(sockConn,sendBuf,strlen(sendBuf)+1,0); char recvBuf50; recv(sockConn,recvBuf,50,0); printf(%sn,recvBuf); closesocket(sockConn); Tcp 客户端客户端向服务器发送向服务器发送“hello”字符串字符串 #pragma comment(lib, wsock32.lib) #include #includ

53、e void main() WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 1, 1 ); err = WSAStartup( wVersionRequested, if ( err != 0 ) return; if ( LOBYTE( wsaData.wVersion ) != 1 | HIBYTE( wsaData.wVersion ) != 1 ) WSACleanup( ); return; SOCKET sockClient=socket(AF_INET,SOCK_STR

54、EAM,0); SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr=inet_addr(); addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(6000); connect(sockClient,(SOCKADDR*) char recvBuf50; recv(sockClient,recvBuf,50,0); printf(%sn,recvBuf); send(sockClient,hello,strlen(hello)+1,0); closesocket(sockClien

55、t); WSACleanup(); 7、实验报告: 在实验报告中要说明 Socket 编程的客户端和服务器端主要步骤、利用 Java 语言用到的主要类及其主要作用、TCP 和 UDP 编程的主要差异和特点、实验过 程和实验结果。 实验二:利用实验二:利用 Ethereal 分析应用层协议分析应用层协议 HTTP、DNS 和和 FTP 1、实验目的 熟悉并掌握 Ethereal 的基本操作,了解网络协议实体间进行交互以及报文交换的情况。 2、实验环境: Windows 9x/NT/2000/XP/2003; 与因特网连接的计算机网络系统; Ethereal等软件。 3、实验内容: 1)学习 Et

56、hereal 的使用; 2)利用 Ethereal 分析 HTTP 协议; 3)利用 Ethereal 分析 DNS 协议; 4)利用 Ethereal 分析 FTP 协议。 4、实验方式: 5)每位同学上机实验,并与指导教师讨论。 5、参考内容: 6)要深入理解网络协议,需要仔细观察协议实体之间交换的报文序列。为探究协议操 作细节,可使协议实体执行某些动作,观察这些动作及其影响。这些任务可以在仿真环境 下或在如因特网这样的真实网络环境中完成。观察在正在运行协议实体间交换报文的基本 工具被称为分组嗅探器(packet sniffer) 。顾名思义,一个分组嗅探器俘获(嗅探)计算机 发送和接收的

57、报文。一般情况下,分组嗅探器将存储和显示出被俘获报文的各协议头部字 段的内容。图 1 为一个分组嗅探器的结构。 图 1 分组嗅探器的结构 图 1 右边是计算机上正常运行的协议(在这里是因特网协议)和应用程序(如:web 浏览器和 ftp 客户端) 。分组嗅探器(虚线框中的部分)是附加计算机普通软件上的,主要 有两部分组成。分组俘获库(packet capture library)接收计算机发送和接收的每一个链路 层帧的拷贝。高层协议(如:HTTP、FTP、TCP、UDP、DNS、IP 等)交换的报文都被封 装在链路层帧中,并沿着物理媒体(如以太网的电缆)传输。图 1 假设所使用的物理媒体 是以

58、太网,上层协议的报文最终封装在以太网帧中。 分组嗅探器的第二个组成部分是分析器。分析器用来显示协议报文所有字段的内容。 为此,分析器必须能够理解协议所交换的所有报文的结构。例如:我们要显示图 1 中 HTTP 协议所交换的报文的各个字段。分组分析器理解以太网帧格式,能够识别包含在帧 中的 IP 数据报。分组分析器也要理解 IP 数据报的格式,并能从 IP 数据报中提取出 TCP 报 文段。然后,它需要理解 TCP 报文段,并能够从中提取出 HTTP 消息。最后,它需要理解 HTTP 消息。 Ethereal 是一种可以运行在 Windows, UNIX, Linux 等操作系统上的分组分析器。

59、 Ethereal 是免费的,可以从 Http:/ 得到。运行 ethereal 程序时,其图形用 户界面如图 2 所示。最初,各窗口中并无数据显示。ethereal 的界面主要有五个组成部分: 图 2 Ethereal 的用户界面 命令菜单命令菜单(command menus):命令菜单位于窗口的最顶部,是标准的下拉式菜 单。最常用菜单命令有两个:File、Capture。File 菜单允许你保存俘获的分组数据或打开一 个已被保存的俘获分组数据文件或退出 ethereal 程序。Capture 菜单允许你开始俘获分组。 俘获分组列表俘获分组列表(listing of captured packets):按行显示已被俘获的分组内容,其中 包括:ethereal 赋予的分组序号、俘获时间、分组的源地址和目的地址、协议类型、分组中 所包含的协议说明信息。单击某一列的列名,可以使分组按指定列进行排序。在该列表中, 所显示的协议类型是发送或接收分组的最高层协议的类型。 分组头部明细分组头部明细(details of selected packet header):显示俘获分组列表窗口中被选 中分组的头部详细信息。包括:与以太网帧有关的信息,与包含在该分组中的 IP 数据报有 关的信息。单击以太网帧或 IP 数据报所在行左边的向右或向下的箭头可以展开或最小化相 关信息。另外,如果利用

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论