文档章节

Unix/Linux系统编程-知识脉络

cnyinlinux
 cnyinlinux
发布于 2016/06/23 17:41
字数 6975
阅读 504
收藏 5

本文档 下载地址 http://pan.baidu.com/s/1dFqeJvz

Unix/Linux系统编程

尹德位 2016 cnyinlinux@163.com


目 录

第一部分 知识体系概览

第二部分 系统编程兵法

第三部分 实战案例综述


第一部分 知识体系概览

输入图片说明


第二部分 系统编程兵法

第一章 C语言应用

第二章 数据结构

第三章 Shell编程

第四章 Makefile编程

第五章 Unix/Linux系统编程


第一章 C语言应用

1.程序概述

1.1 冯诺依曼结构与可执行程序的对应关系

1.2 程序在系统上运行的实现过程

1.3 程序执行的起点,以及可被调用的main函数

1.4 进程调度到底做了什么

1.5 程序也会写遗书

2.C语言关键字

2.1 关键字的意义

2.2 声明与定义的不同之处

2.3 关键字与内存的关系

2.4 typedef与define的清白

2.5 让人伤脑筋的const

2.6 操作系统的寻址位数的意义

2.7 寻址位数设下的陷阱

2.8 不再惧怕指针——基本指针,函数指针,数组指针

2.9 指针与数据类型的关系

注:关于指针请参考后续章节

3.常量与变量

3.1 常量与变量的关系

3.2 系统如何分配内存

3.3 可执行文件的“段”

3.4 常量,变量,全局变量,局部变量的内存属性

3.5 表达式与变量的值传递

3.6 条件表达式 与 逗号表达式 的使用陷阱

3.7 变量的作用域

4.数据类型

4.1 基本数据类型

4.2 数据类型与内存的关系

4.3 内存对齐

4.4 考虑内存对齐的数据结构设计

4.5 结构体与联合体

4.6 你总是错误地计算结构体的size

4.7 结构体与指针

4.8 结构体嵌套

4.9 结构体与联合体的交叉定义

4.10 枚举类型与命令参数设计的结合

4.11 数据类型与系统寻址位数的关系

4.12 设计夸平台的数据结构(兼容性设计)

5.进制转换

5.1 进制与基本变量的存储关系

5.2 进制转换方法

5.3 无限大数的进制转换(如1个100亿位十进制数转成二进制)

5.4 字符串与整数的转换

6.函数

6.1 函数的定义

6.2 函数申明的作用

6.3 函数的作用范围

6.4 形参与实参

6.5 传入参数的实现过程

6.6 基本类型与指针传递的不同含义

6.7 函数指针作为传入参数的应用

6.8 参数类型与个数的优化设计

6.9 函数的退出码

6.10 复合类型的返回

6.11 传入指针的复用

6.12 函数深度的考虑

6.13 执行路径的连贯性设计

6.14 递归函数

6.15 变参函数设计(如 printf)

7.编译

7.1 编译的阶段

7.2 编译错误排解

7.3 编译与连接

7.4 gcc的使用

7.5 gcc参数详解

8.debug调试

8.1 错误信息收集

8.2 gdb的使用

8.3 断点设置与清除

8.4 单步执行数据跟踪

8.5 越过子函数

8.6 跳出循环

8.7 调试子线程

8.8 调试子进程

8.9 ps命令详解

8.10 top命令详解

8.11 pstree命令详解

8.12 kill命令详解

8.13 find命令详解

9.coredump调试手段

9.1 系统dump机制实现原理

9.2 系统参数设置

9.3 捕获core信息文件

9.4 调试core文件

9.5 core与可执行文件的关联debug

9.6 二进制文件反汇编

10.errno机制

10.1 errno实现原理

10.2 程序错误码的获取

10.3 错误码含义字典查询

10.4 逻辑错误的debug

11.宏

11.1 宏的定义

11.2 宏的有效范围

11.3 宏的展开

11.4 编译导入宏

11.5 代码分支无效化注释之宏分隔

11.6 宏式函数

11.7 特殊的宏( __VA_ARGS__ , __LINE__ , ...)

12.指针

12.1 指针的含义

12.2 指针与内存的关系

12.3 指针的值传递

12.4 作为返回值的指针

12.5 传入参数的指针

12.6 函数指针

12.7 函数指针的传递

12.8 函数指针的参数传入

12.9 数组指针

12.10 复合类型指针

12.11 指针的强制类型转换

12.12 指针自身的存储

12.13 二重指针的应用

12.14 三重指针的应用

12.15 多重指针设计原则

12.16 指针的保值特殊用法

12.17 指针的步长

12.18 指针的加减运算

12.19 指针与变量地址的关系

12.20 指针的访问方式

13.程序日志的设计

13.1 debug日志设计

13.2 变参函数在日志格式化中的应用

13.3 宏分隔的日志函数设计

13.4 编译选项控制的日志输出

13.5 日志缓存的设计

13.6 日志同步子程序设计

14.C语言编码规范

14.1 程序模块划分原则

14.2 程序文件名命名规范

14.3 头文件设计规则

14.4 代码目录设计规则

14.5 函数风格设计规则

14.6 变量申明规则

14.7 结构设计规则

14.8 代码深度设计规则

14.9 嵌套规则

14.10 子函数规模设计规则

14.11 函数功能划分规则

14.12 变量名划分规则

14.13 函数名划分规则

15.位运算

15.1 逻辑 ”与” “或” 运算

15.2 按位 ”与” “或” 运算

15.3 逻辑位移

15.4 算数位移

15.5 循环位移

15.6 组合大存储量复合数据类型的位移运算

15.7 无限计数器实现


第二章 数据结构

1.数据结构概述

1.1 程序与数据结构

1.2 数据结构设计方法

1.3 数据结构与数据类型的关系

1.4 数据的生命力

1.5 优秀的数据结构就是生产力

1.6 算法与数据结构的双剑合璧

1.7 数据结构的扩展性考虑

1.8 系统兼容性考虑

1.9 指针与数据结构

1.10 执行效率的考虑

1.11 空间复杂度

1.12 时间复杂度

1.13 迭代与递归

1.14 大数据量离散信息的数据模型

1.15 数据 与 结构 的深层含义

2.线性表

2.1 线性表的含义

2.2 物理连续与逻辑连续

2.3 线性表的连续存储与离散存储

2.4 数组空间的静态与动态分配

2.6 链表与数组的联系

3.链表

3.1 链表的逻辑结构

3.2 链表节点的设计

3.3 链表的遍历

3.4 链表的操作(建,插,删,改,增,断)

3.5 单链表的逆序

3.6 O(1)复杂度插入/删除节点

3.7 链表访问的空间复杂度与时间复杂度权衡

3.8 双链表的操作

3.9 双链表的复杂度分析

3.10 链表与数组的访问效率比较

3.11 单链表交点的计算

3.12 十字交叉链

4.堆栈

4.1 堆栈的属性

4.2 堆栈与数组

4.3 堆栈的存储

4.4 堆栈的操作

4.5 堆栈的数据结构

4.6 链式堆栈

4.7 链栈与链表的异同

5.队列

5.1 队列的属性

5.2 队列的存储

5.3 队列的操作

5.4 队列的数据结构设计

5.5 链式队列

5.6 堆栈与队列的转换

5.7 堆栈与队列的应用场景分析

5.8 堆栈与队列的应用——无限大数乘法

6.树

6.1 树的特性

6.2 二叉树特征

6.3 二叉树的性质

6.4 二叉树的存储

6.5 二叉树的遍历算法

6.6 算术表达式的树形表示

6.7 广义表表示法

6.8 算数表达式的二叉树构算法研究

6.9 树与森林

6.10 哈夫曼编码

6.11 哈夫曼树的构造

6.12 哈夫曼加密与解密

6.13 B+树

6.14 红黑树

7.哈希表

7.1 哈希算法的构造

7.2 哈希散列数据结构

7.3 内存空间与哈希的关系

7.4 哈希函数设计

8.排序算法

8.1 冒泡

8.2 选择

8.3 插入

8.4 折半插入

8.5 希尔

8.6 快速

8.7 归并

8.8 快排与递归

8.9 归并与递归

8.10 排序效率比较

8.11 大数据量的排序算法设计

8.12 排序与查找


第三章 Shell编程

1.计算机体系结构

1.1 kernel与APL

1.2 应用层与内核的通道

1.3 内核解释器设计原理

1.4 Shell工作模式

1.5 操作系统登录意味着什么

1.6 ksh csh bash 等主流Unix/Linux解释器

1.7 Shell的安全性

1.8 系统命令的执行上下文

1.9 环境变量

2.Shell编程

2.1 循环控制结构 while-do-done/for-in-do-done

2.2 条件控制if

2.3 case分支

2.4 Shell变量的申明与使用

2.5 命令在Shell中的特性

2.6 Shell程序的退出码

2.7 Shell程序的传入参数解析

2.8 Shell的函数定义

2.9 Shell函数的参数传递

2.10 Shell函数的返回值

2.11 Shell函数调用

2.12 Shell与gdb

2.13 文件处理

2.14 sed编程概论

2.15 sed语法细则

2.16 sed脚本

2.17 Shell与sed脚本的嵌套

2.18 awk语法细则

2.19 awk脚本

2.20 Shell与awk的嵌套

2.21 Shell与C语言程序的嵌套

3.自动化脚本

3.1 自动化脚本的实践意义

3.2 自动化脚本的实现原理

3.3 自动化脚本数据流

3.4 ftp自动化脚本

3.5 expect自动化编程

3.6 expect组件

3.7 expect语法

3.8 expect脚本

3.9 Shell与expect的嵌套

4.定时任务

4.1 定时任务特性

4.2 定时任务设置 at

4.3 cron定时

4.4 cron权限设置

4.5 定时任务脚本的注意事项

5.后台任务

5.1 前台与后台进程的异同

5.2 启动后台任务

5.3 控制后台脚本


第四章 Makefile编程

1.自动化编译

1.1 大型项目的架构设计

1.2 代码目录结构设计与功能子模块划分

1.3 编译结果输出文件的预先定义

1.4 源码与输出的对应关系

2.Makefile编程

2.1 Makefile的实现原理

2.2 依赖关系

2.3 规则推导

2.4 隐晦规则

2.5 变量的使用

2.6 Shell命令调用

2.7 变量引用与Shell的区别

2.8 条件编译

2.9 自动变量

2.10 Makefile的嵌套

2.11 Makefile的出错处理

2.12 Makefile的命令结果处理


第五章 Unix/Linux系统编程

1.Unix/Linux开发环境

1.1 系统体系结构

1.2 文件系统

1.3 系统目录

1.4 文件管理

1.5 设备

1.6 系统配置

1.7 系统库

1.8 系统接口

1.9 内核参数

1.10 系统限制

1.11 国际标准POSIX与ISO

1.12 系统健康监测

1.13 网卡工作模式

1.14 计算机与网络

1.15 数据通信过程

1.16 系统缓存

1.17 系统调用接口

1.18 应用层

2.系统I/O编程

2.1 文件属性

2.2 系统权限

2.3 文件存储

2.4 文件管理

2.5 系统调用与库

2.6 文件描述符

2.7 文件创建

2.8 文件打开

2.9 文件读取

2.10 文件写入

2.11 文件同步

2.12 缓存刷新

2.13 文件状态

2.14 文件关闭

2.15 状态更改

2.16 文件关闭

2.17 文件size监视

2.18 文件截断

2.19 文件复制

2.20 目录操作

3.流

3.1 带缓存的I/O

3.2 流的属性

3.3 流的操作

3.4 打开流

3.5 读取流

3.6 写入流

3.7 流缓存

3.8 关闭流

3.9 流的阻塞

3.10 流的网络操作

3.11 流与系统I/O

3.12 网络流

3.13 流的同步

3.14 流与指针

3.15 流的截断

4.用户认证

4.1 系统用户管理

4.2 认证登录

4.3 md5加密

4.4 系统密码管理

4.5 用户有效性校验

4.6 密码认证

4.7 带用户认证的程序设计 

5.进程环境

5.1 操作系统启动过程

5.2 内核加载过程

5.3 系统管理服务的启动

5.4 祖先进程

5.5 进程管理体系

5.6 进程属性

5.7 进程相关关系

5.8 进程状态

5.9 进程调度

5.10 进程资源

5.11 进程控制

5.12 进程回收

5.13 进程收养

5.14 调度优先级

5.15 CPU时钟周期

5.16 墙上时间与CPU时间

5.17 进程特征

5.18 调度算法

5.19 demon进程

5.20 服务进程设计原则

6.多进程编程

6.1 进程ID

6.2 子进程的创建

6.3 子进程与父进程

6.4 竞争调度

6.5 进程空间交集

6.6 进程资源拷贝

6.7 写时复制机制

6.8 fork与vfork异同

6.9 进程与exec

6.10 子孙进程关系

6.11 僵尸进程

6.12 孤儿进程

6.13 进程回收与收养操作

6.14 多进程程序设计

6.15 父子进程通信手段

6.16 独立进程间关系

6.17 进程退出exit

6.18 服务进程设计初探

6.19 进程调试 

7.信号

7.1 中断机制

7.2 信号机制

7.3 信号捕捉

7.4 信号含义

7.5 信号发生

7.6 信号处理

7.7 信号hander的系统默认操作

7.8 信号hander自定义

7.9 信号注册

7.10 信号屏蔽字

7.11 屏蔽字设置

7.12 屏蔽字清除

7.13 屏蔽字获取

7.14 屏蔽字作用域

7.15 信号阻塞机制

7.16 进程控制之信号

7.17 进程间的传呼机——信号应用

7.18 特殊信号

7.19 信号与kill命令

7.20 kill命令与kill函数

8.多线程编程

8.1 POSIX线程

8.2 线程与进程区别

8.3 线程特性

8.4 线程调度

8.5 线程空间与资源

8.6 线程子程序设计

8.7 线程传参

8.8 线程ID

8.9 线程ID与进程ID

8.10 用户线程与内核线程

8.11 线程创建

8.12 线程与信号

8.13 线程控制

8.14 线程终止

8.15 线程竞争

8.16 指针的特殊用法之地址传值

8.17 线程同步

8.18 线程互斥量——线程锁

8.19 线程加解锁

8.20 读写锁

9.高级线程控制

9.1 线程属性

9.2 属相结构设置

9.3 detached属性

9.4 线程取消(cancel)

9.5 线程栈设置

9.6 线程与exit

9.7 线程与信号

9.8 线程的信号屏蔽字

9.9 线程与fork

9.10 线程锁属性

9.11 线程锁类型设置

9.12 高速线程锁

9.13 避免死锁

9.14 自旋锁

9.15 读写锁属性

9.16 读写锁应用

9.17 读写锁与普通锁之异同

9.18 线程监测

9.19 线程调试

9.20 线程阻塞

10.进程间通信IPC

10.1 传统Unix的IPC技术

10.2 IPC与key

10.3 进程同步

10.4 共享内存的属性

10.5 共享内存的产生

10.6 共享内存的应用

10.7 共享内存管理

10.8 共享内存的命令行控制

10.9 父子进程/独立进程间的共享内存应用

10.10 共享内存的回收

10.11 管道的特性

10.12 管道的生成

10.13 管道的作用域

10.14 管道的使用

10.15 管道的回收

10.16 有名管道特性

10.17 有名管道创建

10.18 有名管道应用

10.19 有名管道与文件

10.20 有名管道撤销

10.21 独立进程间通信应用

10.22 消息队列的属性

10.22 消息队列的原理

10.23 消息队列的工作模式

10.24 消息队列的创建

10.25 消息的type

10.26 消息的发送

10.27 消息的接收

10.28 消息队列与中断信号

10.29 消息队列的阻塞调用

10.30 消息队列的限制

10.31 消息队列的回收

10.32 信号量的属性

10.33 信号量的原理

10.34 信号量的创建

10.35 信号量的资源计数作用

10.36 信号量与互斥锁

10.37 进程间互斥同步

10.38 信号量的设定

10.39 P/V操作

10.40 信号量的原子性

10.41 信号量的回收

10.42 IPC综合运用

11.网络编程

11.1 TCP/IP网络模型

11.2 协议的实现原理

11.3 tcpdump网卡截获

11.4 网络数据包分析

11.5 TCP协议的3次握手连接与4次分手断开

11.6 TCP协议可靠性机制

11.7 TCP的优势与缺陷

11.8 UDP协议

11.9 UDP的高效性

11.10 UDP的优缺点

11.11 UDP与TCP的特性比较

11.12 基于算法的可靠UDP

11.13 协议在网络程序中的地位

11.14 协议报头特征

11.15 用户自定义报头

11.16 网络通信的数据分割

11.17 路由

11.18 DNS

11.19 IPv4与IPv6

11.20 网络字节序与主机字节序

11.21 IP与端口

12.SOCKET编程

12.1 通信节点

12.2 网络缓存

12.3 地址结构填充

12.4 IP地址有效性

12.5 网络字节序转换

12.6 网络端口监视

12.7 套接字创建

12.8 套接字属性设置

12.9 基于TCP的网络编程

12.10 TCP套接字绑定

12.11 端口监听

12.12 请求连接connect(3次握手之客户端)

12.13 接受连接accept(3次握手之服务端)

12.14 连接句柄之网络读写(accept返回)

12.15 服务端多进程模型设计

12.16 数据送信send/sendto

12.17 数据接收recv/recvfrom

12.18 网络I/O操作

12.19 网络通信子进程/线程的控制与终止

12.20连接断开(4次分手)

12.21服务程序退出

12.22 基于UDP的网络通信设计

12.23 UDP端口绑定

12.24 UDP的”连接”connect

12.25 UDP的数据发送 send/sendto

12.26 UDP的数据接收recv/recvfrom

12.27 用户报头设计

12.28 可靠的UDP算法

12.29 套接字阻塞模式

12.30 套接字缓存设置

12.31 套接字关闭

12.32 基于C/S模式的demon程序设计

13.实战应用

13.1 C/S模式的FTP服务设计实现

13.2 C/S模式的远程登录/执行系统的实现

13.3 C/S模式的在线交际服务系统

13.4 可靠UDP增强协议实现

13.5 通用资源池设计(线程池,内存池,连接池)

第三部分 实战案例综述

C语言部分

1.『union』测试你所用电脑的内存存储方式是大端还是小端。 也可用指针方式

2.求任意二维数组的鞍点(行中最大,列中最小的元素)。 要求:从命令行启动程序的时候以参数形式将二维数组的行和列输入(数组大小动态化)。 如

./saddle_point 3 6

.=================================

428 735 304 626 824 22
201 616 223 926 945 791
378 530 358 316 601 260

.=================================

428 735 304 626 824 22
201 616 223 926 945 791
378 530 358 316 *** 260

3.求pi/2的近似值。 pi/2 = 1 + 1/3 + 1/3 x 2/5 + 1/3 x 2/5 x 3/7 ... 当某一项的值小于 10的-5次方时,认为达到精度要求。

4.unsigned long 可存储的最大值为 : 18446744073709551615 , 其值的1/2为 : 9223372036854775808 。 请设计实现满足下列条件的程序:

         1, 程序运行时带参数启动,参数的范围为1~1024,若参数超范围,则启动失败。

            如:./cmdline 1024

         2, 在9223372036854775808 ~ 18446744073709551615之间寻找

            满足下列条件的数:

            条件1:该数为素数;

            条件2:该素数与输入参数求模,且模值为奇数。

         3, 将满足上述条件的素数求和,将和值输出。

5.位运算相关题目。 用16个char实现一个巨大数的存储。初始时为0,即16个char都为0。 然后,将这个大数进行自增运算,当自增到最大值为止,即大数的值为(2^128-1)。 运算过程中,满足下列条件的数以十进制形式输出(16进制输出)。 条件:每自增2^96次就输出。

数据结构部分

6.约瑟夫环问题

7.单项链表的逆序(O(n)复杂度)。

8.判断两单链表是否有交点(O(n+m))。

9.用两个栈实现队列的访问控制。

10.大数乘法。 实现任意大小的两个十进制数的乘法运算,并输出结果。

11.算数表达式(带括号)的二叉树存储实现(递归,双链表),并实现前/中/后序三种遍历。

12.分别实现 插入,折半插入,冒泡,选择,希尔,快速排序,归并排序 共7中排序方法的时间消耗统计(用gettimeofday获取时间)。

要求:运行时输入排序序列长度(各数字随机生成), 另一个可选参数控制是否输出数列结果(1|0)。

    如:./sort_method_all 1000 1 表示随机生成1000个数并排序,
        然后输出排序前后结果。

       ./sort_method_all 2000 0 表示随机生成2000个数并排序,
        无需输出排序前后结果。

13.利用归并排序的特点,递归调用此算法实现1亿个数(大数据量)的排序。 并比较 归并与快排的效率 。

实现思想:将待排序的数列分割成若干子序列,然后利用快速排序将各子序列排序, 再归并子序列,最后得到排序后的最终结果。

Unix系统编程阶段

14.编写一个程序:w_copy,执行make install时将其安装到/usr/local/bin下, 执行make uninstall时卸载。 要求功能:执行时指定源文件,目标文件,以及是否保持原属性(-p参数)。 若目标文件指定为目录,则保持原文件名不变,将其拷贝到指定目录。

    运行范例:w_copy /bin/ls /tmp            ;

            w_copy /bin/ls /tmp/lll -p      ;

            w_copy -p /bin/ls ../           ;

  15.编写一个网络会话程序。 实现功能:在本地开启本程序,可一与本地的其他本程序的实例间进行实时的对话。 对话内容显示在屏幕上。程序运行时可以手动指定本次会话启动时自己的昵称。

要求:

1).项目代码结构: Unix_Chat_Cprj 。

2).make install 时将程序安装于系统上 。

  安装目录   : /opt/Unix_Chat_Local/bin

             /opt/Unix_Chat_Local/tool

             /opt/Unix_Chat_Local/log

3).主服务程序的名称为:Unix_Chat_Cpro 。

4).程序的实例启动与停止由 Unix_Chat_Cctl 来控制 。

  Unix_Chat_Cctl start       <=启动服务

  Unix_Chat_Cctl stop        <=停止服务 
 
  服务器程序(Unix_Chat_Cpro)只能启动一个实例 。

  服务停止时,不再接收客户连接请求,告知客户端退出,等待所有客户端退出后服务停止 。

5).运行时日志输出到以下文件:

  /opt/Unix_Chat_Local/log/Unix_Chat_log.txt

  日志文件的size为10Mb,到达size上限时则截断文件为0 。

6).客户端程序为 Unix_Chat_Ccli ,客户端启动:

  Unix_Chat_Ccli <昵称> ,客户端启动后连接上Server之后被分配唯一的客户端ID。

  客户端实例的停止用 Ctrl_C 按键触发 (断开连接,回收资源)。

7).服务端允许同时链接的客户端数最大为256个(Server端控制)。若启动的客户端实例大于2个,则进入群聊模式 。

8).单次会话可发送的消息字节数上限为256个字符 。

9).显示示例

.----------------------------

[昵称][ID] Say: Hello World !

.----------------------------

16.编写FTP文件传送程序(TCP)。

要求:

   1).代码目录 : Wftp_Pro 。

   2).make install 时安装于 /opt/Wftp_Pro/{bin,log,tool} 。

   3).服务端名称: wftp_serv, 客户端名称: wftp, tool名称: wftpctl 。

   4).服务启动/停止方式: wftpctl start/stop 。

   5).客户端运行方式: wftp ip-address (或者: wftp \n  >> open ip-address) 。

   6).服务器端口号 24800 。

   7).同时允许连接数为 128 。

   8).客户端命令行 : cd , ls , lcd , lls , put , get 。除此而外,非法输入处置。

   9).客户端退出 : by , bye ,quit ,exit ,Ctrl+C 。

   10).日志文件名称为wftp_log.txt,要求文件size上限为10Mb ,

       达到最大size时转存至wftp_log.txt.old ,日志文件截断为0 。

17.C/S架构远程执行系统的设计实现 。

实现功能:实现功能近似于SSH,客户端通过请求服务端执行命令(Shell), 并将服务端的命令执行结果返回客户端输出 。

要求:

  1).项目代码结构: Rmt_ExecuePro 。

  2).make install 时将程序安装于系统上 。

  安装目录   : /opt/Rmt_ExecuePro/bin

             /opt/Rmt_ExecuePro/tool

             /opt/Rmt_ExecuePro/log   
          
  3).主服务程序的名称为:Rmt_ExecueServ 。

  4).程序的实例启动与停止由 Unix_Chat_Cctl 来控制 。

  Rmt_ExecueCtl start       <=启动服务

  Rmt_ExecueCtl stop        <=停止服务

  服务器程序(Rmt_ExecueServ)只能启动一个实例 。

  服务停止时,不再接收客户连接请求,告知客户端退出,等待所有客户端退出后服务停止 。

  5).运行时日志输出到以下文件:

  /opt/Rmt_ExecuePro/log/Rmt_Serv_log.txt

  日志文件的size为10Mb,到达size上限时则截断文件为0 。

  6).客户端程序为 Rmt_cli ,客户端启动:

  *** Rmt_cli user@server-ip cmdline ,

  如: Rmt_cli redhat@192.168.1.1 "ls /mnt -l"

  客户端收到服务端的命令结果 或 按Ctrl_C退出 (断开连接,回收资源)。

  7).连接时需要输入用户密码,待服务器端用户认证成功的情况下再执行命令,

  否则服务端将用户认证失败的消息反馈给客户端。

  8).服务端允许同时链接的客户端数最大为256个(Server端控制)。

18.多用户在线交际服务系统 。

功能要求:

  1).基于C/S架构,使用UDP协议。

  2).支持 用户注册/登录/添加好友/加入群组/删除好友/退出群组/申请群组 功能 。

  3).用户注册时将被服务器分配一个帐号,由字母与数字组合共8位组成(可为全字母或全数字)。

  4).群组的帐号也为服务器分配,由字母与数字组成的10位数(可为全字母或全数字)。

  5).全部 用户/群组/好友列表 保存在文件,服务重启后依然可以正常运行。

  6).本地用户也会保存自己的 群组/好友列表,在下列时刻实施与服务器同步并刷新本地列表:

  登录时/被他人删除好友时/被剔除群组时/新增好友时/新加入群时

  7).群组的好友增删由群组管理员完成,普通成员可申请加入/邀请他人加入。

  群组管理员由申请者担当,管理员可将管理权交给其他成员。

  作为群组管理员,不可以退出群组,若要退出需将管理员权限移交其他成员。

  8).群组中成员上限为500人,每个普通用户可添加的群组个数为100个。

  9).每个成员可创建的群的个数为5个。

  10).好友添加/群组加入等申请发出时,若对方不在线,则离线保留10天,等待对方上线时再通知。

  11).好友登录成功后,可进行私聊或群聊,以及上述各项合法操作。

  12).支持用户数为1亿,群组数为10万个。

设计要求:

  1).项目代码结构: Unix_Chat_net 。

  2).make install 时将程序安装于系统上 。

  安装目录   : /opt/Unix_Chat/Serv/bin

              /opt/Unix_Chat/Serv/log

              /opt/Unix_Chat/Serv/conf

              /opt/Unix_Chat/Cli/bin

              /opt/Unix_Chat/tool 

  3).主服务程序的名称为:Unix_ChatPro 。

  4).程序的实例启动与停止由 Unix_ChatCtl 来控制 。

  Unix_ChatCtl  < start | stop >       <=启动/停止服务

  服务器程序(Unix_ChatPro)只能启动一个实例 。

  服务停止时,不再接收客户连接请求,告知客户端退出,等待所有客户端退出后服务停止 。

  5).运行时日志输出到以下文件: /opt/Unix_Chat/Serv/log/Unix_Chat_log.txt
  日志文件的size为20Mb,到达size上限时则转存至Unix_Chat_log.txt.old 。

  6).客户端程序为 Unix_ChatCli ,客户端启动:

  Unix_ChatCli <username> <password> ,

客户端启动后连接上Server之后刷新同步本地好友及群组列表。 客户端的停止用 Ctrl_C 按键触发 (断开连接,回收资源)。

  7).单次会话可发送的消息字节数上限为512个字符 。

  8).用户密码传送时采用密文传送,加密算法为md5。

19.可靠UDP通信

设计一个基于UDP协议,可靠通信服务。

要求:

 1.比UDP可靠。

 2.比TCP快。

---------------------------------------- end --------------------------------------

© 著作权归作者所有

cnyinlinux
粉丝 56
博文 17
码字总数 43918
作品 0
东城
程序员
私信 提问
快速get到学习Linux操作系统的点

Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。Linux能够运行主要的UNIX工具软件、网络协议和应用程序。它支持32位...

Linux就该这么学
2018/10/21
21
0
指导未来“钱”途规划。Linux C/C++

小弟现在大四。找的一份电信运营商的工作。但是不是很满意。为以后跳槽做准备。 而且我对linux C/C++比较感兴趣。正打算学习这方面的知识。求指导学习的方向。和未来的职业规划。 我现在在看...

挣钱取老婆
2012/05/24
1K
4
《Linux深度攻略》一书,讲述Linux日常系统管理和服务器配置内容

Linux深度攻略 首先从介绍Linux系统的安装入手,讲述了Linux系统管理和服务器配置两部分的知识。系统管理方面内容有Linux系统简介和安装,Linux字符界面,目录和文件管理,Linux常用命令,S...

airfish2000
2017/05/13
0
0
linux 学习之路(学linux必看)

很多同学接触Linux不多,对Linux平台的开发更是一无所知。 而现在的趋势越来越表明,作为一个优秀的软件开发人员,或计算机IT行业从业人员, 掌握Linux是一种很重要的谋生资源与手段。 下来我...

modernizr
2014/05/22
272.5K
29
网络工程师真的也需要好好学习linux系统

作为一名刚工作半年的小网工,想总结一下工作半年来的一些感悟。由于本人是网络工程专业,毕业前找工作的目标也是网络工程师,在经过几次面试后如愿以偿的找到了网络工程师的工作。由于上学时...

linuxprobe16
2018/08/19
15
0

没有更多内容

加载失败,请刷新页面

加载更多

聊聊nacos的LocalConfigInfoProcessor

序 本文主要研究一下nacos的LocalConfigInfoProcessor LocalConfigInfoProcessor nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/config/impl/LocalConfigInfoProcessor.java p......

go4it
昨天
5
0
前端技术之:webpack热模块替换(HMR)

第一步:安装HMR中间件: npm install --save-dev webpack-hot-middleware 第二步:webpack配置中引入webpack对象 const webpack = require('webpack’); 第三步:增加devServer配置项: ho......

popgis
昨天
5
0
死磕 java线程系列之线程池深入解析——体系结构

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 Java的线程池是块硬骨头,对线程池的源码做深入研究不仅能提高对Java整个并发编程的理解,也能提高自己...

彤哥读源码
昨天
7
0
虚函数表 图解

虚函数表 图解 p504

天王盖地虎626
昨天
6
0
java反射

学习目标  什么是反射  反射运行原理  了解反射机制的相关类  获取 class 对象的 3 种方式  通过反射获取构造方法并使用  通过反射获取成员变量并调用  通过反射获取成员方法并...

流川偑
昨天
5
2

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部