信息安全系统设计基础实验五:通讯协议设计 20135211李行之 20135216刘蔚然
2015-12-02 17:04
344 查看
北京电子科技学院(BESTI)
实 验 报 告
封面
课程:信息安全系统设计基础班级:1352
姓名:(按贡献大小排名)李行之 刘蔚然
学号:(按贡献大小排名)20135211 20135216
成绩:
指导教师:娄嘉鹏
实验日期:2015.12.1
实验密级:
预习程度:
实验时间:15:30—17:30
仪器组次:11
必修/选修:必修
实验序号:5
实验名称: 通讯协议设计
实验目的与要求: 1.学习使用 socket 进行通讯编程的过程,了解一个实际的网络通讯应用程序整体设计,阅读HTTP 协议的相关内容,学习几个重要的网络函数的使用方法。 2.读懂HTTPD.C 源代码。在此基础上增加一些其他功能。在PC 计算机上使用浏览器测试 嵌入式WEB 服务器的功能。 3.(要求)正确使用连接线等实验仪器,并注意保护实验箱。实验结束之后将实验箱送回。
实验仪器:
(名称) (型号) (数量)
嵌入式开发平台 UP-NETARM2410-CL 1
PC机 1
正文(个人理解部分由【】标出)
一、实验内容:
(同实验一)本次实验建立在掌握嵌入式开发平台使用方法和配置方法的基础上,要求使用windows xp,linux(red hat),arm三个系统(即NFS方式);在linux系统中安装arm系统。
二、实验原理
总体说明:建立 TCP 类型SOCKET 在80 端口进行监听连接请求。接收到连接请求,将请 求传送给连接处理模块处理。并继续进行监听。原理图
(图1,2)
模块设计
客户连接处理模块:用于初步处理客户的连接请求,并将请求信息传递给客户请求解析函数处理。
客户请求解析处理模块:用于解析客户的请求,并根据请求信息调用相应的函数进行请求处理
发送HTTP 协议数据头模块:根据参数的不同,发送不同的 HTTP 协议头信息。
主要函数
copy.c
#include <stdio.h> static char copybuf[16384]; extern int TIMEOUT; int copy(FILE *read_f, FILE *write_f)//完成从一个文件到另一个文件的字符复制 { int n; int wrote; alarm(TIMEOUT); while (n = fread(copybuf,1,sizeof(copybuf),read_f)) { alarm(TIMEOUT); wrote = fwrite(copybuf,n,1,write_f); alarm(TIMEOUT); if (wrote < 1) return -1; } alarm(0);//清空之前的闹钟 return 0; }
【解释】
在网上查找了alarm函数的含义之后得到如下说明————alarm函数又被称为闹钟函数,alarm()用来设置信号AIGALRM经过seconds(参数)指定的秒数之后传送给目前的进程。需要注意的有两个地方:一个进程只能由一个闹钟时间,如果在调用alarm之前已经设置过闹钟时间,那么任何以前的闹钟都会被新闹钟取代;如果参数seconds设置为0,那么之前的闹钟会被取消。
httpd.c(只摘取了main函数的代码)
int main(int argc, char *argv[]) { int fd, s; int len; volatile int true = 1; struct sockaddr_in ec; struct sockaddr_in server_sockaddr; pthread_t th_key; void * retval; /*第一步,进行(中断)信号的处理*/ signal(SIGCHLD, SIG_IGN);//见1 signal(SIGPIPE, SIG_IGN); signal(SIGALRM, sigalrm); /*切换工作目录*/ chroot(HTTPD_DOCUMENT_ROOT);//见2 printf("starting httpd...\n"); printf("press q to quit.\n"); // chdir("/"); /*第二步,输入命令并进行处理*/ if (argc > 1 && !strcmp(argv[1], "-i")) { /* I'm running from inetd, handle the request on stdin */ fclose(stderr); HandleConnect(0);//调用之前定义的函数,见3 exit(0); } /*第三步,建立socket接口*/ if((s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) { perror("Unable to obtain network"); exit(1); } if((setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (void *)&true, sizeof(true))) == -1) { perror("setsockopt failed"); exit(1); } /*定义server_sockaddr结构体中的内容*/ server_sockaddr.sin_family = AF_INET; server_sockaddr.sin_port = htons(SERVER_PORT); server_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY); /*第四步,对端口和地址进行绑定*/ if(bind(s, (struct sockaddr *)&server_sockaddr, sizeof(server_sockaddr)) == -1) { perror("Unable to bind socket"); exit(1); } /*第五步,监听端口*/ if(listen(s, 8*3) == -1) { /* Arbitrary, 8 files/page, 3 clients */ perror("Unable to listen"); exit(4); } /*第六步,多线程创建,等待连接*/ pthread_create(&th_key, NULL, key, 0); /* Wait until producer and consumer finish. */ printf("wait for connection.\n"); while (1) { len = sizeof(ec); /*第七步,接收客户端连接请求*/ if((fd = accept(s, (void *)&ec, &len)) == -1) { exit(5); close(s); } HandleConnect(fd); } /*第八步,等待线程连接结束之后再结束main函数*/ pthread_join(th_key, &retval); }
【1.signal(XX,XX)函数】
signal(参数1,参数2);参数1:我们要进行处理的信号。其实这些信号时系统定义的宏。参数2:我们处理的方式(是系统默认还是忽略还是捕获)。针对本代码中的三次调用中的参数,解释如下:
SIGIGN——这个符号表示忽略该信号,执行了相应的signal()调用后,进程会忽略类型为sig的信号
SIGCHLD——进程Terminate或Stop的时候,SIGCHLD会发送给它的父进程。
SIGPIPE——在reader中止之后写Pipe的时候发送。
SIGALRM——用alarm函数设置的timer超时或setitimer函数设置的interval timer超时
sigalrm——与上述参数不同的是,它是一个处理SIGALRM的函数.在代码291行有定义
【2.chroot()函数】
chroot()用来改变根目录为参数path 所指定的目录。只有超级用户才允许改变根目录,子进程将继承新的根目录。同时,它也会切换工作目录到新的目录。
【3.handleconnect(XX,XX)函数】
该函数的代码整体比较容易理解,核心在于304行的f = fdopen(fd,"a+");一句。通过查阅,fdopen函数取一个现存的文件描述符,并使一个标准的I / O流与该描述符相结合。参数“a+”表示 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。这样一来,该函数的作用就很明显了,就是将标准输入(因为传进来的参数是0)中的内容进行读取。
三、实验过程
1.配置实验箱同实验一中一样,配置实验环境
连接arm开发板;
建立超级终端;
启动实验平台;
修改windows xp系统的ip使得它与arm机的ip在同一网段;
在red hat中安装arm编译器;
配置环境变量。
2.进入07_hpptd文件夹中,尝试直接make进行自动编译。出现如下图所示的错误。
(图3)
3.如上图中所示,为了解决httpd未能自动编译的问题,对hpptd.c文件进行手动多线程编译。
4.使用 NFS 服务方式将HTTPD 下载到开发板上,并拷贝测试用的网页进行调试。
[/mnt/yaffs] mount -t nfs -o nolock 192.168.0.56:/arm2410cl /host [/mnt/yaffs]cd /host/exp/basic/07_httpd/ [/host/exp/basic/07_httpd]./httpd (结果)starting httpd... press q to quit. wait for connection.
5.在台式机的浏览器中输入 http://192.168.0.121(121 为UP-CUP S2410 实验板的IP地址),观察在客户机的浏览器中的连接请求结果(如下图)。
(图4)
四、总结
本次实验建立在实验四搭建好的实验平台基础上;而且,有了实验四中针对利用make进行自动编译的问题处理经验,本次实验进行得十分顺利。相关文章推荐
- 推送技术
- iOS多线程的初步研究(四)-- NSTimer
- 如何防止APP被二次打包
- 用Excel利用RFM模型进行客户细分
- 无法监听程序
- 【cl】找不到火狐Cannot find firefox binary in PATH
- spark 安装
- EditText设置cursor位置
- 《程序员保值的4个秘密》摘录
- iOS 多线程下的NStimer 的使用
- 在C#中对于null/DBNull.Value值进行类型转换时,除了Convert.ToString()之外,其他的转换都会报空引用异常;
- 化繁为简 如何向老婆解释MapReduce?
- AndBase 学习笔记(一)之旋转木马实现
- Leet 题目整理归类 - 快速通道 (持续更新)
- 数字图像处理:第八章 形态学运算
- PullToRefreshListView 如何返回顶部
- 根据7种生命周期 设计定时器的周期
- Intellij IDEA JUnit处理
- 20151202正则第四部分(grep,egrep,sed复习)
- 【js对象属性的getter和setter】