来源:znzxc 发布时间:2018-11-21 15:22:44 阅读量:1113
针对此开源项目的说明,结构分析。
服务端整体框架:
1. 从命令行输入得到服务端绑定端口号
2. 设置套接口选项,创建监听套接字。
3. 用while循环 + fork实现子进程与客户端的交流。
4. 父进程的交流套接字关闭,子进程的监听套接字关闭。
在子进程与客户端的交流中:
1. 发送220欢迎应答码。
2. 接收客户端传来的用户名、密码信息,与文件的内容相比对,如果有,则认证成功,发送230应答码;失败发送430应答码,并退出。
3. 循环处理用户的请求,接收客户端传来的命令,此项目提供如下命令的解析。接收到USER,PASS,LIST,RETR则发送应答码200,收到QUIT发送应答码221(),其他命令视为无效命令。
4. 如果应答码为200,继续处理。采用被动模式,客户端创建监听套接字等待服务端主动连接,建立数据连接,之前建立的是控制连接。
5. 如果接收到LIST命令,将当前目录重定向到文件中,在数据连接中发送文件中的内容,发送成功后,在控制连接中发送应答码226,关闭数据连接;
如果接收到RETR命令,则打开文件,在数据连接中传送文件,发送成功后,在控制连接中发送应答码226,关闭数据连接。
客户端整体框架:
1. 从命令行输入得到服务器主机名和端口号。
2. 通过getaddrinfo得到期望的返回类型信息的暗示,实现主机名和服务器名转换成套接口地址结构的功能,与服务端进行连接。
3. 输入用户名、密码进行验证。
4. 发送命令到服务器,接收服务器返回应答码,如接收到221,则退出;接收到502,则显示不合法的输入;接收到200,处理命令。
接收到200,打开数据连接,客户端创建监听套接字,在之前的控制连接上发送一个ACK确认,接收服务器的连接,关掉监听套接字。如果是LIST命令,先通过控制连接接收服务器传来的消息,在通过数据连接打印出目录,最后接收服务器传来完成的消息,关闭数据连接。如果是RETR命令,打开文件失败返回错误码550,关闭数据连接进行下一个循环;文件存在则通过数据连接写入文件,关闭数据连接。
---------------------