实验目的
掌握Linux操作系统的使用方法;
了解Linux系统内核代码结构;
掌握实例操作系统的实现方法。
一、 实验要求
1、 掌握Linux操作系统的使用方法,包括键盘命令、系统调用;掌握在Linux
下的编程环境。
? 编一个C程序,其内容为实现文件拷贝的功能;
? 编一个C程序,其内容为分窗口同时显示三个并发进程的运行结
果。要求用到Linux下的图形库。
2、 掌握系统调用的实现过程,通过编译内核方法,增加一个新的系统调用。
另编写一个应用程序,调用新增加的系统调用。
实现的功能是:文件拷贝;
3、 掌握增加设备驱动程序的方法。通过模块方法,增加一个新的设备驱动
程序,其功能可以简单。
实现字符设备的驱动;
4、 了解和掌握/proc文件系统的特点和使用方法
? 了解/proc文件的特点和使用方法
? 监控系统状态,显示系统中若干部件使用情况
? 用图形界面实现系统监控状态。
5、 设计并实现一个模拟的文件系统(选作)
二、 实验一
1、 编一个C程序,其内容为实现文件拷贝的功能
要实现文件拷贝功能,主要用到的函数是fopen、fputc、fgetc。
主要用到的头文件:
#include <stdio.h>
#include <stdlib.h>
设计思路:由scanf函数获取2个文件名,根据其文件名和路径分别打开该2个文件,设置一个循环,从源文件复制1个字节到目的文件,直到源文件指针到文件尾,最后关闭2个文件。
在可能出错的地方需要加上相应的报错代码,并输出错误信息,以方便调试。
理清楚设计思路后,首先搭建linux下编程环境。
安装gcc: sudo apt-get install build-essential
安装codeblocks: sudo apt-get install codeblocks
在集成开发环境Code::Blocks IDE下根据需求写出相应的源代码copy.c ,将程序编译并生成exe可执行文件。
然后手动创建一个测试文件test.txt ,运行copy.exe文件,并输入
第二篇:华中科技大学计算机网络实验报告
计算机网络实验报告
班级:电信0904
姓名:XX
学号:U200913693
实验四:网络协议与Web通信
一、 实验目的
1. 了解网络协议数据单元的格式
2. 分析网络协议工作基本流程
3. 深入理解Web应用的通信过程
二、 实验内容
1. 网络协议数据单元分析
通过wireshark抓取局域网数据包并分析各个层次的协议数据单元内容
(1) 以太网帧头
(2) IP分组首部
(3) ARP包
(4) ICMP包(ping)
2. Web原理实验
(1) HTTP协议分析
(2) 通过socket编程模拟HTTP协议通信过程
三、 实验原理
1. Web通信经过四个步骤:
(1) 建立连接
(2) 客户端发送HTTP REQUEST请求
(3) 服务器端接收请求,生成RESPONSE响应
(4) 关闭连接
2. HTTP协议
客户端浏览器或其他程序与Web服务器之间的应用层通信协议。一般在Internet上的Web服务器上存放的都是超文本信息,客户机需要通过HTTP协议传输所要访问的超文本信息。
四、 实验内容及分析
1. 编译、执行参考程序
本次实验提供了两个原始程序(NetServer.java和NetClient.java),它们可以实现一个服务器/客户端请求响应的完整过程。Dos环境下先后编译执行NetServer.java与NetClient.java,即可得到一次完整的客户端向服务器请求并得到响应的完整过程,结果如下:
2. 修改、编写实验程序
参考程序模拟了客户端与服务器之间的对话,但由于其之间交互的数据都是我们设定的而不含有http报头信息,因此不能和真正的web服务器与浏览器对话,以下即为实现自制web服务器的方法
(1) 利用自制的服务器获取真正浏览器的 HTTP Request 报头信息:
运行自制的服务器,默认监听端口8080,在浏览器中输入以下网址http://127.0.0.1:8080/new/main/UserLoad.jsp,其中127.0.0.1为本机localhost地址,这样浏览器就会向自制服务器发出请求,服务器即可获取http request报头信息。如图所示:
(2) 利用自制的客户端获取 HTTP Response 报头信息:
在真实的浏览器中访问一网址,利用wireshark软件获取对该网站服务器发送的http request报头,将这些内容加入NetClient.java中out.println()方法中的字符串内,如下所示:
out.println("GET / HTTP/1.1\r\n");
out.println("Host: cn.bing.com\r\n");
out.println("Connection: keep-alive\r\n");
out.println("Accept:application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n");
out.println("User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.8 (KHTML, like Gecko) Chrome/7.0.524.0 Safari/534.8\r\n");
out.println("Accept-Encoding: gzip,deflate,sdch\r\n");
out.println("Accept-Language: zh-CN,zh;q=0.8\r\n");
out.println("Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3\r\n");
并且将NetClient.java文件中的端口号PORT改为80,InetAddress.getByName("localhost");中的localhost改为实际访问的网址。即可得到服务器的http response,如图所示:
(3) 在自制的服务器中构造一个 HTTP Response 报头信息:
为将(2)中得到的http response报头信息加入自制服务器中,需在NetServer.java中加入out.println()语句,位置在String str = in.readLine();之前,http response报头信息放入out.println()方法中的字符串内即可:
out.println("HTTP/1.1 200 OK\r\n");
out.println("Cache-Control: private, max-age=0\r\n");
out.println("Content-Length: 30104\r\n");
out.println("Content-Type: text/html; charset=utf-8\r\n");
out.println("Set-Cookie: _SS=SID=73C301846E8148399EFF0E23B86DD939; domain=.bing.com; path=/\r\n");
out.println("P3P: CP=\"NON UNI COM NAV STA LOC CURa DEVa PSAa PSDa OUR IND\"\r\n");
out.println("Date: Mon, 02 Jan 20## 16:48:11 GMT\r\n");
此外,http response报头还可利用wireshark获取。
(4) 通过真正的浏览器来显示自制服务器提供的 Web 服务:
编译运行经过(3)修改的NetSerer.java程序,在真正的浏览器中输入http://127.0.0.1:8080/new/main/UserLoad.jsp网址,则会出现来自自制服务器的http response报头信息,如图所示:
服务器的响应如下:
五、 实验小结
在本次实验中,由于web服务器存储的是超文本信息,因而通信需基于http协议,因此实验中实现了利用自制的服务器、客户端获取http request与response信息,乃至自己为自制服务器构造http response报头并与浏览器对话。
在java环境中,通过提供的两个原始程序NetServer.java和NetClient.java,熟悉了Web通信中,客户端发出请求、服务器响应的完整流程。
在这一过程中,更深入认识了Web通信中客户端、服务器经http协议传输请求与相应的机制。
另外,Wireshark的数据包捕获与解析功能也为实验中需要的特定http报头信息提供了很大方便。
六、 附录
1. 修改后的客户端程序代码NetClient.java
import java.io.*;
import java.net.*;
public class NetClient
{
public static final int PORT =80;
public static void main(String[] args) throws IOException
{
InetAddress addr = InetAddress.getByName("cn.bing.com");
Socket socket =new Socket(addr,PORT);
try{
System.out.println("客户端请求: "+socket);
BufferedReader in = new BufferedReader(newInputStreamReader(socket.getInputStream())) ;
PrintWriter out = new PrintWriter(new BufferedWriter(newOutputStreamWriter(socket.getOutputStream())),true);
out.println("GET / HTTP/1.1\r\n");
out.println("Host: cn.bing.com\r\n");
out.println("Connection: keep-alive\r\n"); out.println("Accept:application/xml,application/xhtml+xml,text/html;q=0.9,t
ext/plain;q=0.8,image/png,*/*;q=0.5\r\n");
out.println("User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.8 (KHTML, like Gecko) Chrome/7.0.524.0 Safari/534.8\r\n");
out.println("Accept-Encoding: gzip,deflate,sdch\r\n");
out.println("Accept-Language: zh-CN,zh;q=0.8\r\n");
out.println("Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3\r\n");
System.out.println("客户端请求发送完毕...");
String str = in.readLine();
System.out.println("接收: "+str);
while(str!=null)
{
str = in.readLine();
System.out.println("接收: "+str);
}
}
finally
{
System.out.println("客户端关闭...");
socket.close();
}
}
}
2. 修改后的服务器NetServer.java程序代码
import java.io.*;
import java.net.*;
public class NetServer
{
public static final int PORT =8080;
public static void main(String[] args) throws IOException
{
InetAddress addr = InetAddress.getByName("localhost");
ServerSocket s =new ServerSocket(PORT,10,addr);
System.out.println("虚拟Web服务器启动: "+s);
try{
Socket socket =s.accept();
try{
System.out.println("接受客户端连接请求: "+socket);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())) ;
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
out.println("HTTP/1.1 200 OK\r\n");
out.println("Cache-Control: private, max-age=0\r\n");
out.println("Content-Length: 30104\r\n");
out.println("Content-Type: text/html; charset=utf-8\r\n");
out.println("Set-Cookie: _SS=SID=73C301846E8148399EFF0E23B86DD939; domain=.bing.com; path=/\r\n");
out.println("P3P: CP=\"NON UNI COM NAV STA LOC CURa DEVa PSAa PSDa OUR IND\"\r\n");
out.println("Date: Mon, 02 Jan 20## 16:48:11 GMT\r\n");
String str = in.readLine();
System.out.println("收到: "+str);
while(!str.equals(" ")){
str = in.readLine();
System.out.println("收到: "+str);
}
out.println("客户端传送信息服务器已经接收完毕");
System.out.println("服务器响应完毕,正在退出...");
}
finally
{
System.out.println("服务器关闭...");
socket.close();
}
}
Finally
{
s.close();
}
}
}