一、框架简介
- common 模块 <头文件定义>
- sysutil 模块 <公有工具定义>
- miniftp 模块 <检测是否root启动,主进程完成客户端的连接,以及子进程的创建, 开启会话>
- session 模块 <会话结构的定义,实现会话函数,创建子进程,区分出ftp进程和nobody进程,实现ftp与nobody之间的通讯连接,更改nobody进程getpwnam>
- ftpproto 模块 <ftp进程>
- priparent 模块 <nobody进程>
- Makefile 文件
二、各个模块代码框架
1、common 模块 <头文件定义>
#ifndef _COMMON_H_
#define _COMMON_H_
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <pwd.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
//ERR_EXIT函数宏定义
#define ERR_EXIT(m) \
do{ \
perror(m);\
exit(EXIT_FAILURE);\
}while(0);
#define MAX_COMMAND_LINE 1024 //获取的最大命令
#define MAX_COMMAND 32 //获取的最大命令数
#define MAX_ARG 1024 //获取的最大参数
#endif /* _COMMOM_H_ */
2、sysutil 模块 <公有工具定义>
① sysutil.h 头文件
#ifndef _SYSUTIL_H_
#define _SYSUTIL_H_
#include"common.h"
int tcp_server(const char *host, unsigned short port);
int accept_timeout(int fd, struct sockaddr_in *addr, unsigned int wait_seconds);
ssize_t readn(int fd, void *buf, size_t count);
ssize_t writen(int fd, const void *buf, size_t count);
ssize_t readline(int sockfd, void *buf, size_t maxline); //按行读取函数
ssize_t recv_peek(int sockfd, void *buf, size_t len);
#endif
② sysutil.c 源文件
//公有工具定义
#include"sysutil.h"
/**
* tcp_server - 启动tcp服务器
* @host: 服务器IP地址或者服务器主机名
* @port: 服务器端口
* 成功返回监听套接字
*/
int tcp_server(const char *host, unsigned short port)
{
int listenfd; //监听套接字
//(PF_INET网际协议, SOCK_STREAM(套接字类型-流式套接字),
//0(自动选择TCP协议));
if ((listenfd = socket(PF_INET, SOCK_STREAM, 0)) < 0)
ERR_EXIT("tcp_server");
//struct socketaddr_in
//{
// short int sin_family;
//}
struct sockaddr_in servaddr;//地址套接字变量
memset(&servaddr, 0, sizeof(servaddr));//用0初始化servaddr内容
servaddr.sin_family = AF_INET;//地址家族-AF_INET
if (host != NULL)
{
//inet_aton 将点分十进制的IP地址转换成一个网络字节序的32位的整数,
//将host的转换IP地址sinaddr放到servaddr.sin_addr里,若返回值等于零
//则返回的是无效的IP地址,说明host很可