套接字缓冲区类包括错误功能、准备好检测、直接操作、上溢出、下溢出和超时功能。套接字选项如消息路由、局部地址的再使用、广播等等都要设置。这样,套接字的详细情形就可以如希望的那样了。
在我们特殊的课程中,使用这些C++类一方面的益处是学生们必须在一年级/二年级的水平课程中使用到C++语言,帮助他们保持学到的技能。
● 任务
在选择一个为期三学期的课程任务时,我们渴望实现很多目标。我们被希望设计出一系列的任务来让学生编写一个客户端的应用、一个服务器的应用、一个对等网络应用,也提供一些像电子邮件和文件传输这样一些标准应用的经验。另外,任务应该由简单到复杂,循序渐进。我们在下面列出了这些任务要点。
这些任务得到了学生们的良好反响。他们感觉到了实践的乐趣,同时,也有了一个好的计划。一些以前没有接触过
它们的学生经过努力也都有非常好的结果。这五项明确的任务是:
▲ 任务一:套接字客户端到电子邮件服务器
在本地或远程的机器上编写一个客户端程序去连接电子邮件服务器,然后发送一封电子邮件到一个用户名(userid—在电子邮件地址中@符号之前的名称)。用户不必要是本地或远程机器上的。例如,这个程序可能叫做smtp,包括两项任务:主机名和用户名。
我们要求有一个简单的命令行接口,但是学生们可以自由地发挥,做出更多精致的电子邮件类型接口来。SMTP(SMTP —Simple Message Transfer Protocol, 简单邮件传输协议, 用于电子邮件的传输)的命令是一定会用到的。列举一些如下:
HELO localname 确认连接机器——本地名称不需要——一些服务器不需要HELO,但一些要包括。 HELP 发送命令列表
MAIL FROM:name 可以是你愿意的任何东西——不经过合法性的检验
RCPT TO:name 邮件的容器—— 不需要是本地名称
DATA 允许信息进入——以“.”作为消息的终止字符
QUIT 断开连接
同其他的任务一样,这个任务也会带给学生一些不合适的活动。下面是提给学生们的一些警告:
显然你可能在程序中做一些不礼貌的事情。例如,你可能从Daffy Duck那里发送一串管理员的消息。这需要一些工作量,但这些消息的发送人将会被记录。请不要热衷于这样幼稚的行为。
一些人可能会争辩说这样的任务太“危险” ,但是学生们可以学到如何操作套接字,能够解决如何自己发送邮件的问题。我们的方法是承认这样一个问题的存在并提出警告。
▲ 任务二:简单的网络信息服务器
编写一个有如下特征的网络服务器程序:
1. 从输入套接字接受命令
2. 解释命令并集合信息
3. 发送输出命令到输出套接字
你不需要为这个任务编写一个客户端程序,因为标准的telnet(Telnet—用于远程联接服务的标准协议或者实现此协议的软件,远程登录)客户端将可以提供这样的功能。Telnet允许你在客户端上给一个服务器过程发送信息并把握返回信息。一个信息的选择提供系统命令,像域名等等。系统的功能可以从一个C++程序内部执行。困难的部分是将命令的输出并发送输出到套接字与客户端连接起来。命令的输出应该与套接字直接连接。建议有两种途径:用管道流类和用传统的通过用户构造管道连接的C fork()来执行系统功能。
▲ 任务三:对等网络套接字通信
编写一个作为两个相同程序执行的“聊天”程序。它应该允许用户自定义连接过程的输出所出现的信息。这两个过程经过一个套接字连接。程序将允许用户连接一个确定的过程并监听另一个试图连接的处理。
两台机器上运行相同的程序,任务必须包括这些要点:监听的超时、通过服务器程序创建子进程、关闭套接字并终止子进程。一个有限状态过渡模型应该呈现出来帮助程序的设计。
▲ 任务四:文件传输——服务器和客户端
通过TCP/IP网络套接字连接编写一个文件传输程序。
第一个程序应该与一个FTP服务器功能相同。它应该在幕后运行并等待一个指定端口的连接。第二个程序应该与一个FTP客户端功能相同。因此,需要一个用户接口。命令将通过响应进入并发送到服务器。文件应该可以进行双向传输。
客户端程序应该通过响应行为接受下列命令:
ls 服务器上文件列表
put 从客户端到服务器传送文件
get 从服务器到客户端传送文件
quit 断开与服务器的连接
:<command> 在客户端执行<command>
这对服务器/客户端的性能比FTP要简单许多。SFTP(简单文件传输协议)与它类似。举例来说,FTP运用2个TCP连接,其中一个类似telnet连接用于控制,另一个作数据传输。SFTP用一个简单的TCP连接并提供用户访问控制,目录列表和变更,文件重命名和文件删除。对于这些命令,这里只有目录列表是需要的。FTP同样支持lcd、mput、mget等等。这个任务需要一个握手协议。
▲ 任务五:三个选择
任务五A:使用UDP的FTP文件传输
建立UDP套接字而不是TCP套接字执行任务4的文件传输程序。这个程序需要:
⊙ 集合数据包
⊙ 提供CRC错误校验
⊙ 提供包的先后顺序
数据包可能不是按照顺序到达,可能重复或丢失,需要重新请求或重新排列。每个数据包应该被确认(肯定地或否定地)。我们将采用一个协议来描述数据包的格式和错误信息等等。为了测验使用的协议,允许用户指定传输中将会出错的部分。
任务五B:双向文件传输
改为打开2个套接字执行任务4的文件传输程序,一个用于控制信息一个用于数据传输。另外,允许两个程序同时来回地发送文件,通过控制信道取消传送过程。使用多个子进程将是有益的。(一个有限状态机器将会是一个好方法)。
FTP有着相似的工作方式。它有两个套接字连接,但是基于不同的原因,因为在这里它执行的是一个真正的服务器——客户端协议,而不是对等网络协议。