期中大作业 | 网络编程实践项目
在完成基础篇和提升篇的学习后,本课程安排了一次期中实践项目,旨在将理论知识转化为实际编程能力。网络编程的核心特征在于理论与实践的高度耦合:仅理解协议规范和 API 语义不足以应对实际工程需求,必须通过编写和调试代码,才能对 TCP、UDP、套接字(Socket)等核心概念形成深入认知。
实践目标
本项目要求实现一个基于 TCP 的客户端-服务器(Client-Server)交互程序,重点考察以下能力:
- 客户端:使用
select实现 I/O 多路复用(I/O Multiplexing),同时处理标准输入和套接字读写;使用shutdown实现半关闭(Half-Close) - 服务器端:套接字读写能力,以及对端连接关闭时的异常处理能力
图表渲染中…
题干
请分别编写一个客户端程序和服务器程序,客户端连接服务器后,通过命令行与服务器进行交互,支持的交互命令包括:
- pwd:显示服务器应用程序启动时的当前工作路径
- cd:改变服务器应用程序的当前工作路径
- ls:显示服务器应用程序当前路径下的文件列表
- quit:客户端进程退出,服务器端不退出,后续客户端可再次连接
客户端程序要求
- 可指定待连接的服务器端 IP 地址和端口
- 输入命令后按回车发送,等待服务器端返回执行结果,客户端将结果显示在屏幕上
- 样例输出如下:
plaintext
第一次连接服务器
$./telnet-client 127.0.0.1 43211
pwd
/home/vagrant/shared/Code/network/yolanda/build/bin
cd ..
pwd
/home/vagrant/shared/Code/network/yolanda/build
cd ..
pwd
/home/vagrant/shared/Code/network/yolanda
ls
build
chap-11
chap-12
chap-13
chap-14
chap-15
chap-16
chap-17
chap-18
chap-20
chap-21
chap-22
chap-23
chap-25
chap-26
chap-27
chap-28
chap-4
chap-5
chap-6
chap-7
clean.sh
cmake-build-debug
CMakeLists.txt
lib
mid-homework
README.md
cd -
pwd
/home/vagrant/shared/Code/network/yolanda
cd /home
pwd
/home
ls
ubuntu
vagrant
quit
//再次连接服务器
$./telnet-client 127.0.0.1 43211
pwd
/home/vagrant/shared/Code/network/yolanda/build
ls
bin
chap-11
chap-12
chap-13
chap-15
chap-16
chap-17
chap-18
chap-20
chap-21
chap-22
chap-23
chap-25
chap-26
chap-28
chap-4
chap-5
chap-6
chap-7
CMakeCache.txt
CMakeFiles
cmake_install.cmake
lib
Makefile
mid-homework
quit
服务器程序要求
- 暂不考虑多个客户端并发连接的情形,每次仅服务一个客户端连接
- 将命令执行结果返回给已连接的客户端
- 服务器端不能因客户端退出而终止运行
关键技术要点
| 技术点 | 说明 |
|---|---|
select 多路复用 | 同时监听标准输入与套接字的可读事件 |
shutdown 半关闭 | 客户端退出时关闭写端,保留读端 |
read 返回 0 | 检测对端关闭连接的 EOF 条件 |
SIGPIPE 信号 | 服务器端需忽略该信号,防止写入已关闭套接字时进程终止 |
版本信息
| 项目 | 说明 |
|---|---|
| 更新日期 | 2026-06-09 |
| 目标内核 | Linux 7.0 |
| I/O 模型参考 | select, epoll, io_uring |
| 编译工具链 | GCC 14+, Clang 18+ |