文章目录
基于Socket套接字的FTP服务简单实现
文件传输协议(File Transfer Protocol,FTP)是用于在网络上进行文件传输的一套标准协议,它工作在 OSI 模型的第七层, TCP 模型的第四层, 即应用层, 使用 TCP 传输而不是 UDP, 客户在和服务器建立连接前要经过一个“三次握手”的过程, 保证客户与服务器之间的连接是可靠的, 而且是面向连接, 为数据传输提供可靠保证。
一、项目简介
1、利用套接字实现客户端和服务端的连接;
2、服务端和客户端可以互传文件;
3、客户端和服务端信息交互实现类似Linux系统下vi的快捷指令操作。
二、项目具体实现功能
1、客户端本地功能(xx代表文件或者文件夹名称):
- 客户端查看当前文件路径:lpwd
- 查看客户端当前目录下所有本地文件:lls
- 客户端进入本地文件夹:lcd xx
2、客户端和服务端远程功能:
- 客户端查看服务端的当前文件路径:pwd
- 客户端查看服务端当前路径下所有文件:ls
- 客户端进入服务端文件夹:cd xx
- 客户端上传文件至服务端:upload xx
- 客户端下载服务端文件到本地:download xx
三、代码实现
1、服务端代码实现:
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/stat.h>
#include <fcntl.h>
//宏定义相关端指令
#define QUIT 0
#define LS 1
#define PWD 2
#define LLS 3
#define LPWD 4
#define LCD 5
#define CD 6
#define UPLOAD 7
#define DOWNLOAD 8
struct Msg{
int type;
char cmd[128];
char filename[128];
char data[1024];
}msg;
char *getDir(char *cmd);//分割指令和文件,返回文件/文件夹名称
int analyse_Cmd(char *cmd);//分析指令
void getCmd(int c_fd,struct Msg msg);//根据指令做出响应
int main(int argc, char **argv)
{
int s_fd;
int c_fd;
struct sockaddr_in s_addr;
struct sockaddr_in c_addr;
int s_len = sizeof(struct sockaddr_in);
int c_len = sizeof(struct sockaddr_in);
memset(&s_addr,'\0',s_len);
memset(&c_addr,'\0',c_len);
//1.socket
if((s_fd = socket(AF_INET,SOCK_STREAM,0)) == -1){
printf("creat socket failed\n");
exit(-1);
}
//2.bind
s_addr.sin_family = AF_INET;
s_addr.sin_port = htons(atoi(argv[2]));
inet_aton(argv[1],&s_addr.sin_addr);
if(bind(s_fd,(struct sockaddr *)&s_addr,s_len) != 0){
perror("bind");
exit(-1);
}
//3.listen
if(listen(s_fd,10) != 0){
perror("listen");
exit(-1);
}
while(1){
printf("wait connect -----\n");
//4.accept
if((c_fd = accept(s_fd,(struct sockaddr *)