你好,我们之前已经学习了网络编程的基础篇和提高篇。经过近两个月的学习,不知道你对这些内容的掌握程度如何呢?

我之前说过,网络编程是一个既重视理论,又重视实战的内容模块。一味地消化理论并不足以让你掌握网络编程,只有自己亲自动手写代码,编写程序,才能对 TCP、UDP、套接字这些内容有更深切的体会,才能切实感受到它们是如何帮助我们的程序进行互联互通的。

网络编程就像一个魔法棒,我们之前已经学习了一些“咒语”,但上手操纵才能真实地施展魔法。所以我在专栏中安排了一个期中作业,借由这个作业让你上手编写代码,相信你在这个过程中也会更有成就感。

我在这里再提供一些“咒语”提示,方便你回顾之前的内容,以便在解题的时候更加胸有成竹。

客户端程序可以以第 11 篇文章的程序例子为原型,这里主要考察使用 select 多路复用,一方面从标准输入接收字节流,另一方面通过套接字读写,以及使用 shutdown 关闭半连接的能力。

服务器端程序则考察套接字读写的能力,以及对端连接关闭情况下的异常处理等能力。

题目不难,相信你可以做好。

题干

请你分别写一个客户端程序和服务器程序,客户端程序连接上服务器之后,通过敲命令和服务器进行交互,支持的交互命令包括:

  • pwd:显示服务器应用程序启动时的当前路径。
  • cd:改变服务器应用程序的当前路径。
  • ls:显示服务器应用程序当前路径下的文件列表。
  • quit:客户端进程退出,但是服务器端不能退出,第二个客户可以再次连接上服务器端。

客户端程序要求

  1. 可以指定待连接的服务器端 IP 地址和端口。
  2. 在输入一个命令之后,回车结束,之后等待服务器端将执行结果返回,客户端程序需要将结果显示在屏幕上。
  3. 样例输出如下所示。
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158

第一次连接服务器

$./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

服务器程序要求

  1. 暂时不需要考虑多个客户并发连接的情形,只考虑每次服务一个客户连接。
  2. 要把命令执行的结果返回给已连接的客户端。
  3. 服务器端不能因为客户端退出就直接退出。

你可以把自己编写的程序代码放到 GitHub 上,并在评论里留下链接。我会认真查看这些代码,并在周五给出自己的反馈意见以及题目分析。由于时间有限,无法尽数查看,后续我会以答疑或者加餐的形式再做补充。

期待你的成果!