
实验目的
理解并掌握以下内容:
- 网络进程标识(即套接字地址)在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、