2017-2018-1 20155214 《信息安全系统设计基础》第13周学习总结
2017-2018-1 20155214 《信息安全系统设计基础》第13周学习总结
教材学习内容总结
本章主要学习网络编程,重点研究 客户端-服务器编程模型 。本章学习的知识承接了我们之前学习的计算机网络课程,与本学期的 信息安全技术 和 网络安全编程 课程息息相关。对于信息安全系学生而言不可谓不重要。
在本章学习中,重点实现了:
- socket服务器和客户端搭建
- daytime服务器
- echo服务器
- wc服务器
- 服务器迭代
- 服务器并发
- 服务器文件简单加密
第11章习题解答
- 练习题11.1
十六进制地址 | 点分十进制地址 |
---|---|
0x0 | 0.0.0.0 |
0xffffffff | 255.255.255.255 |
0x7f000001 | 127.0.0.1 |
0xcdbca079 | 205.188.160.121 |
0x400c950d | 64.12.149.13 |
0xcdbc9217 | 205.188.146.23 |
- 练习题11.2
编程hex2dd.c,将他的十六进制参数转换为点分十进制字符串并打印出结果。
- 练习题11.3
编程dd2hex.c,将他的点分十进制参数转换为十六进制数并打印出结果。
- 练习题11.4
编写HOSTINFO的一个版本,用inet_pton而不是getnameinfo将每个套接字地址转换成点分十进制地址字符串。
- 练习题11.5
在10.11节中,我们警告过你关于在网络应用中使用标准I/O函数的危险,然而,CGI程序却能没有任何问题地使用标准I/O。为什么?
在子进程中运行的CGI程序不需要显式地关闭他的输入输出流。当子进程终止时,内核会自动关闭所有描述符。
详细总结本章要点
socket服务器和客户端搭建
- 如何创建服务器:
在服务器端建立套接字所涉及的步骤如下:
- 创建一个socket可使用socket()的系统调用
- 使用bind()系统调用套接字绑定到一个地址。对于互联网上的服务器套接字,地址包括主机的端口号。
- 连接监听listen()系统调用
- 接受连接使用accept()系统调用。此调用通常会阻塞,直到客户端与服务器连接。
- 发送和接收数据read()和write()系统调用.
- 如何创建客户端:
- 系统调用有所不同的客户端和服务器建立连接,但两者套接字涉及的基本构造。这两个过程分别建立自己的套接字。
- 在客户端建立套接字所涉及的步骤如下:
- 创建一个socket可使用socket()的系统调用
- 套接字连接的服务器地址使用connect()系统调用。
- 发送和接收数据。做到这一点的方法有许多,但最简单的方法是使用read()和write()
daytime服务器实现
- 设计内容
设计一个daytime服务器,向客户端返回服务器当前时间。
- 设计思路
/*伪代码 serveri.c*/
int main(){
……
服务器与客户端建立连接
服务器阻塞监听
if(接收到客户端消息){
调用localtime(),将时间保存到缓冲区
将服务器时间发送至客户端。
……
}
}
- 运行截图
echo服务器实现
- 设计内容
设计一个echo服务器,当客户端向服务器发送消息时,向客户端返回它所发送的消息。
- 设计思路
/*伪代码 serveri.c*/
int main(){
……
服务器与客户端建立连接
服务器阻塞监听
if(接收到客户端消息){
调用echo()
将rbuf缓冲区接收到的信息保存到sbuf缓冲区中
将sbuf缓存区中的信息发送至客户端。
}
……
}
}
- 运行截图
wc服务器实现
- 设计内容
设计一个wc服务器,当客户端向服务器发送一个文本文件时,服务器返回文本文件的字数。
- 设计思路
//client.c
int main(){
……
客户端与服务器建立连接
将对称密钥利用服务器端的公钥加密,并发送给服务器
while(文件未到结尾){
按缓冲区大小读取文件
将缓冲区的数据发送给服务器
}
接受服务器返回的wc字数
}
//serveri.c
int main(){
……
服务器与客户端建立连接
服务器进入阻塞监听
if(接受到客户端的消息){
接收信息至缓存区
利用wc函数计算缓冲区数据字数并加入count
}
将总字数count发送给客户端
……
}
- 运行截图
服务器迭代
这是最简单形式的服务器的服务进程的客户端和第一个请求,然后完成后,需要从其他客户机的请求。同时,另一个客户端一直等待。
服务器并发
这种类型的服务器运行多个进程并发服务请求一次。因为一个进程可能需要更长的时间,但其他客户机又不能等太久。 Unix下写一个并发服务器的方法:
- 多进程
- 多线程
服务器文件简单加密
- 设计内容
设计一个混合密码系统。对“wc服务器”进行防护。
- 设计思路
/*
1.利用openSSL生成对称密钥
2.利用openSSL生成公钥和私钥
*/
//client.c
int main(){
……
客户端与服务器建立连接
将对称密钥利用服务器端的公钥加密,并发送给服务器
while(文件未到结尾){
按缓冲区大小读取文件
将缓存区中的数据利用对称密钥加密
将缓冲区的加密数据发送给服务器
}
接受并利用对称密钥解密服务器返回的wc字数
}
//serveri.c
int main(){
……
服务器与客户端建立连接
服务器进入阻塞监听
if(接受到客户端的消息){
利用服务器端私钥解密获得通信的对称密钥
接收信息至缓存区
利用对称密钥解密缓冲区内的数据
利用wc函数计算缓冲区里解密后数据字数并加入count
}
将总字数count利用对称密钥加密后发送给客户端
……
}
- 运行截图
结对及互评
结对学习搭档讲解问题
1.客户端/服务器及其子进程的参数和信息如何传递?
-
客户端向服务器传参
通过URI传递,
“?”字符分隔文件名和参数,参数之间用“&”分隔开,特殊字符有对应编码。 -
服务器向子程序传参
遵循CGI标准,子进程通过设置CGI环境变量。程序在运行时通过Linux getenv来引用。 -
服务器向子进程传参
服务器通过设置CGI环境变量,传递信息。
2._in后缀是什么,有什么用?
“_in”后缀是互联网活动缩写,在“socket.h”库中代表着函数变量格式应用于网络层传输。
结对学习搭档链接
http://www.cnblogs.com/LeeX1997/p/8047327.html
结对学习照片
其他(感悟、思考等,可选)
通过第11章网络编程的学习,我对于用c语言搭建服务器和客户端有了深入理解,并且更加实质性的明白了音频、文件等在网络中以二进制传输。
代码托管
码云链接:https://gitee.com/besti155214/BESTI.IS.ISSDB.20155214/