2017-2018-1 20155214 《信息安全系统设计基础》第13周学习总结

2017-2018-1 20155214 《信息安全系统设计基础》第13周学习总结

教材学习内容总结

本章主要学习网络编程,重点研究 客户端-服务器编程模型 。本章学习的知识承接了我们之前学习的计算机网络课程,与本学期的 信息安全技术网络安全编程 课程息息相关。对于信息安全系学生而言不可谓不重要。

在本章学习中,重点实现了:

  1. socket服务器和客户端搭建
  2. daytime服务器
  3. echo服务器
  4. wc服务器
  5. 服务器迭代
  6. 服务器并发
  7. 服务器文件简单加密

第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,将他的十六进制参数转换为点分十进制字符串并打印出结果。

hex2dd.c 码云链接

  • 练习题11.3
    编程dd2hex.c,将他的点分十进制参数转换为十六进制数并打印出结果。

dd2hex.c 码云链接

  • 练习题11.4
    编写HOSTINFO的一个版本,用inet_pton而不是getnameinfo将每个套接字地址转换成点分十进制地址字符串。

Hostinfo 码云链接

  • 练习题11.5
    在10.11节中,我们警告过你关于在网络应用中使用标准I/O函数的危险,然而,CGI程序却能没有任何问题地使用标准I/O。为什么?

在子进程中运行的CGI程序不需要显式地关闭他的输入输出流。当子进程终止时,内核会自动关闭所有描述符。

详细总结本章要点

socket服务器和客户端搭建

  • 如何创建服务器:

在服务器端建立套接字所涉及的步骤如下:

  1. 创建一个socket可使用socket()的系统调用
  2. 使用bind()系统调用套接字绑定到一个地址。对于互联网上的服务器套接字,地址包括主机的端口号。
  3. 连接监听listen()系统调用
  4. 接受连接使用accept()系统调用。此调用通常会阻塞,直到客户端与服务器连接。
  5. 发送和接收数据read()和write()系统调用.
  • 如何创建客户端:
  1. 系统调用有所不同的客户端和服务器建立连接,但两者套接字涉及的基本构造。这两个过程分别建立自己的套接字。
  2. 在客户端建立套接字所涉及的步骤如下:
  3. 创建一个socket可使用socket()的系统调用
  4. 套接字连接的服务器地址使用connect()系统调用。
  5. 发送和接收数据。做到这一点的方法有许多,但最简单的方法是使用read()和write()

daytime服务器实现

  • 设计内容

设计一个daytime服务器,向客户端返回服务器当前时间。

  • 设计思路
/*伪代码 serveri.c*/

int main(){
……

服务器与客户端建立连接

服务器阻塞监听

if(接收到客户端消息){
调用localtime(),将时间保存到缓冲区

将服务器时间发送至客户端。

……
}

    
}

  • 运行截图

daytime服务器 码云链接

echo服务器实现

  • 设计内容

设计一个echo服务器,当客户端向服务器发送消息时,向客户端返回它所发送的消息。

  • 设计思路
/*伪代码 serveri.c*/

int main(){
……

服务器与客户端建立连接

服务器阻塞监听

if(接收到客户端消息){

调用echo()

将rbuf缓冲区接收到的信息保存到sbuf缓冲区中

将sbuf缓存区中的信息发送至客户端。

}

……
}

    
}

  • 运行截图

echo服务器 码云链接

wc服务器实现

  • 设计内容

设计一个wc服务器,当客户端向服务器发送一个文本文件时,服务器返回文本文件的字数。

  • 设计思路
//client.c

int main(){
    ……
    客户端与服务器建立连接
    将对称密钥利用服务器端的公钥加密,并发送给服务器
    
    while(文件未到结尾){
    按缓冲区大小读取文件
    
    将缓冲区的数据发送给服务器
    }
    
    接受服务器返回的wc字数
    
}

//serveri.c

int main(){
    ……
    服务器与客户端建立连接
    服务器进入阻塞监听
    
    if(接受到客户端的消息){
    
    接收信息至缓存区
    
    利用wc函数计算缓冲区数据字数并加入count
    }
    
    将总字数count发送给客户端
    
    ……
}

  • 运行截图

wc服务器 码云链接

服务器迭代

这是最简单形式的服务器的服务进程的客户端和第一个请求,然后完成后,需要从其他客户机的请求。同时,另一个客户端一直等待。

服务器并发

这种类型的服务器运行多个进程并发服务请求一次。因为一个进程可能需要更长的时间,但其他客户机又不能等太久。 Unix下写一个并发服务器的方法:

  • 多进程
  • 多线程

服务器文件简单加密

  • 设计内容

设计一个混合密码系统。对“wc服务器”进行防护。

  • 设计思路
/*
1.利用openSSL生成对称密钥
2.利用openSSL生成公钥和私钥
*/

//client.c

int main(){
    ……
    客户端与服务器建立连接
    将对称密钥利用服务器端的公钥加密,并发送给服务器
    
    while(文件未到结尾){
    按缓冲区大小读取文件
    将缓存区中的数据利用对称密钥加密
    将缓冲区的加密数据发送给服务器
    }
    
    接受并利用对称密钥解密服务器返回的wc字数
    
}

//serveri.c

int main(){
    ……
    服务器与客户端建立连接
    服务器进入阻塞监听
    
    if(接受到客户端的消息){
    利用服务器端私钥解密获得通信的对称密钥
    
    接收信息至缓存区
    利用对称密钥解密缓冲区内的数据
    
    利用wc函数计算缓冲区里解密后数据字数并加入count
    }
    
    将总字数count利用对称密钥加密后发送给客户端
    
    ……
}

  • 运行截图

文件加密服务器 码云链接

结对及互评

结对学习搭档讲解问题

1.客户端/服务器及其子进程的参数和信息如何传递?

  1. 客户端向服务器传参
    通过URI传递,
    “?”字符分隔文件名和参数,参数之间用“&”分隔开,特殊字符有对应编码。

  2. 服务器向子程序传参
    遵循CGI标准,子进程通过设置CGI环境变量。程序在运行时通过Linux getenv来引用。

  3. 服务器向子进程传参
    服务器通过设置CGI环境变量,传递信息。

2._in后缀是什么,有什么用?
“_in”后缀是互联网活动缩写,在“socket.h”库中代表着函数变量格式应用于网络层传输。

结对学习搭档链接

http://www.cnblogs.com/LeeX1997/p/8047327.html

结对学习照片

其他(感悟、思考等,可选)

通过第11章网络编程的学习,我对于用c语言搭建服务器和客户端有了深入理解,并且更加实质性的明白了音频、文件等在网络中以二进制传输。

代码托管

码云链接:https://gitee.com/besti155214/BESTI.IS.ISSDB.20155214/

参考资料

posted @ 2017-12-17 19:13  曾士轩  阅读(334)  评论(1编辑  收藏  举报