實驗目的
理解并掌握以下內容:
- 網絡進程標識(即套接字地址)在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
、