main.cpp
#define _CRT_SECURE_NO_WARNINGS
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#pragma(lib,"ws2_32.lib")
#include"ftpClient.h"
#include<stdio.h>
int main()
{
ftpClient a;
a.start();
return 0;
}
ftpServer.h
#pragma once
#include<winsock.h>
class ftpServer
{
private:
enum {
SERVER_PORT = 9999,
BUFFER_SIZE = 4096,
QUEUE_SIZE = 10
};
char buffer[BUFFER_SIZE];
sockaddr_in serverChannel;
char name[50];
char workDir[100]; //store like C:Users MARK:字符串末没有斜线!!
int serverSocket; //socket
int clientSocket;
bool sendFile();
bool receiveFile();
bool doPwd();
bool doCd();
bool isValidPath(char* path);
public:
ftpServer();
bool start();//开启服务器
};
ftpServer.cpp
#define _CRT_SECURE_NO_WARNINGS
#include"ftpServer.h"
#include<cstdio>
#include<cstdlib>
#include<fstream>
#include<cstring>
ftpServer::ftpServer()
{
WORD wVersionRequested;
WSADATA wsaData;
int ret;
//WinSock初始化:
wVersionRequested = MAKEWORD(2, 2);//希望使用的WinSock DLL的版本
ret = WSAStartup(wVersionRequested, &wsaData);
if (ret != 0)
{
printf("WSAStartup() failed!n");
}
//确认WinSock DLL支持版本2.2:
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
{
WSACleanup();
printf("Invalid Winsock version!n");
}
//workDir初始化为当前路径
system("cd > tempFile");
std::ifstream in("tempFile", std::ifstream::in);
in >> workDir;
in.close();
}
bool ftpServer::start()
{
int on = 1;
//初始化服务器
memset(&serverChannel, 0, sizeof(serverChannel));
serverChannel.sin_family = AF_INET;
serverChannel.sin_addr.s_addr = htonl(INADDR_ANY);
serverChannel.sin_port = htons(SERVER_PORT);
//创建套接字
this->serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (serverSocket < 0) {
printf("cannot create socketn");
return false;
}
else printf("successfully create socketn");
setsockopt(serverSocket, SOL_SOCKET, SO_REUSEADDR,
(char*)&on, sizeof(on));
//绑定
int b = bind(serverSocket, (sockaddr*)&serverChannel,
sizeof(serverChannel));
if (b < 0) {
printf("bind errorn");
return false;
}
else printf("successfully bindn");
//监听
int l = listen(serverSocket, QUEUE_SIZE);
if (l < 0) {
printf("listen failedn");
return false;
}
else printf("successfully listenn");
int len = sizeof(serverChannel);
//服务器等待连接
while (1) {
printf("waiting for connection...n");
//接受一个连接
clientSocket = accept(serverSocket, (sockaddr*)&serverChannel,
&len);
if (clientSocket < 0) {
printf("accept failedn");
}
else {
printf("successfully connectn");
while (1) {
memset(buffer, 0, sizeof(buffer));
int ret;
ret = recv(clientSocket, buffer, BUFFER_SIZE, 0);
if (ret == SOCKET_ERROR) {
printf("receive failedn");
}
else {
char opt[50];
printf("successfully receiven");
int i = 0, j = 0;
printf("buffer = %sn", buffer);
while (buffer[i] != ' '&&buffer[i] != '