实验目的
理解并掌握以下内容:
- 网络进程标识(即套接字地址)在Linux中的数据结构与地址转换函数。
- 网络字节序与主机字节序的定义、转换以及相关函数在网络编程中的应用。
- 数据结构内存对齐的基本规则,以及基于数据结构构建PDU的基本方法。
- TCP单进程循环服务器与单进程客户端的编程模式,包括但不限于:
- 客户端与服务器套接字系统调用基本流程。
- 服务器对于客户端正常结束的识别与处理。
- 客户端基于命令行指令的退出设计与实现。
- Linux软中断信号处置原则与实际应用(SIGINT,SIGPIPE)。
- 慢系统调用的软中断退出问题及其处理。
实验内容
编写TCP单进程循环服务器与单进程客户端,其中客户端可以向服务器发送二元运算请求PDU,服务器收到请求后解析PDU,获取运算符与操作数,执行运算并向客户端返回运算结果。具体要求如下:
- 二元运算包括加(+,ADD)、减(-,SUB)、乘(*,MUL)、整除(/,DIV)、取模(%,MOD),运算数及结果均为64位有符号整型数。
- 计算指令在命令行以
operator operand1 operand2
的形式给出,如ADD 123 456
。 - 客户端从
stdin
读取解析运算指令后,构建"计算请求报文RQT PDU"并发送给服务器。 - 服务器读取解析RQT PDU,按要求进行运算,并将运算结果封装为"计算回复报文REP PDU"发回客户端。
- 客户端读取解析REP PDU,提取计算结果,并基于从
stdin
读取解析的运算指令构建运算表达式,且输出至stdout
。
PDU设计定义
- 本实验设定PDU没有头部(Header),仅有定长负载(Fixed-length Payload)。
- 请求报文RQT PDU包含一个操作符与两个操作数,而回复报文REP PDU则只包含运算结果。
操作符
- 操作符包括
+
、-
、*
、/
、%
五种类型,使用32位有符号整数表示。操作符与其编号映射关系为:- 加 (
+
): 0x00000001 - 减 (
-
): 0x00000002 - 乘 (
*
): 0x00000004 - 整除 (
/
): 0x00000008 - 取模 (
%
): 0x00000010
- 加 (
数据结构
- 左操作数
OP1
、右操作数OP2
及运算结果RES
均为64位有符号整数。 - 必须使用
<stdint.h>
定义的定长整数类型,如int32_t
、