实验内容
- 学习使用Linux命令wc(1)
- 基于Linux Socket程序设计实现wc(1)服务器(端口号是你学号的后6位)和客户端
- 客户端传一个文本文件给服务器
- 服务器返加文本文件中的单词数
实验知识点
- wc命令
- socket编程
- tcp文件传输
实验步骤
(一)实现wc(1)
-
使用man查看wc(1)
命令参数 作用 -c 统计字节 -m 统计字符 -l 统计行数 -L 最长的一行的长度 -w 统计单词 -
主要问题1:应题目要求,暂时只实现了
wc -w
的功能,即打印单词数。在编译代码的过程中,同样遇到了和以前一样的"/n"问题,按照以前的实践将其改过之后,统计出的结果与预想结果不一样,总会存在误差,查找资料显示,是因为将测试文件编辑的时候,从Windows到Linux粘贴的过程中,会产生一些看不见的非法字符,使用od -tc xxx
就能看出来,但实际上,这些字符在统计的时候是不会被统计到的,因此,结果总有偏差。 -
主要问题2:使用socket编程的时候,发现用书上的知识无法直接传输文件,结合老师讲过的web编程,客户端使用send和recv实现文件传输,但是运行的时候报错,出现
段错误(核心已转储)
检查发现存在地址越界的错误,将代码改过之后,代码运行成功。 -
运行截图:
(二)并发程序
使用多线程实现wc服务器并使用同步互斥机制保证计数正确
-
主要问题:和之前的问题一样出现核心转储错误,发现是文件名输入错误。但是在定义的时候,声明过文件名出错会有打不开文件的错误,但是结果却是直接出现段错误,不理解为什么。
-
[代码链接]https://gitee.com/ZZYYLL/20155315zyl/tree/master/exp/3)
-
运行截图:
对比单线程的版本的性能,并分析原因。
- 单线程容易实现,但是一次只允许一个客户端连接。
- 多线程更复杂,但是一次允许多个客户端,工作效率更高。
- 单线程保证单用户的安全性,但多线程保证任务的高效性。
PSP时间统计
步骤 | 耗时 | 百分比 |
---|---|---|
需求分析 | 10min | 10% |
设计 | 20min | 20% |
代码实现 | 50min | 50% |
测试 | 10min | 10% |
总结分析 | 10min | 10% |