前言
因为课设需要,所以这个端午花了2天研究这个socket怎么实现FTP server和FTP client,只是草率的写出来了get、put、 pwd 、dir、 cd五个功能,有很多潜在问题,比如不按格式正确输入就会有奇怪的错误,无法多个客户端连接一个服务器端等等,以后有机会再研究下socket网络编程吧,先把代码分享在这里,也希望有大佬不吝赐教。
一、 实验目的
文件传送是各种计算机网络都实现的基本功能,文件传送协议是一种最基本的应用层协议按照客户/服务器的模式进行工作,提供交互式的访问,是INTERNET使用最广泛的协议之一。
本实验的目的是,学会利用已有网络环境设计并实现简单应用层协议,掌握TCP/IP 网络应用程序基本的设计方法和实现技巧。
二、 实验内容和要求
1、实验内容
我们的计算机网络实验环境建立在TCP/IP 网络体系结构之上。各计算机除了安装TCP/IP 软件外,还安装了TCP/IP 开发系统。实验室各计算机具备Windows环境中套接字socket 的编程接口功能,可为用户提供全网范围的进程通信功能。本实验要求学生利用这些功能,设计和实现一个简单的文件传送协议。
2、具体要求
用socket 编程接口编写两个程序,分别为客户程序(client.c)和服务器程序(server.c),该程序应能实现下述命令功能:
get:取远方的一个文件
put:传给远方一个文件
pwd:显示远主当前目录
dir:列出远方当前目录
cd :改变远方当前目录
help:显示你提供的命令
bye:退出返回
直接上代码啦,另外分享一个速成学习socket的网站:
http://c.biancheng.net/cpp/html/3029.html
server.cpp
#include<string>
#include<iostream>
#include <winsock2.h>
#include<dirent.h>
#pragma comment (lib, "ws2_32.lib") //加载 ws2_32.dll
#define BUF_SIZE 100
using namespace std;
SOCKET servSock;//服务器端socket
SOCKET clntSock;//客户端socket
SOCKADDR clntAddr;//客户端地址
int nSize = sizeof(SOCKADDR);
char currentPath[100]="\\";//当前目录
char buffer[BUF_SIZE] = {
0}; //缓冲区
void myGet()
{
char temp[100]={
0};
for(int i=0,j=4;buffer[j]!='\0';i++,j++)
temp[i]=buffer[j];
char fileRoot[100]="D:\\FTP";
char *filename = strcat(fileRoot,currentPath);
cout<<fileRoot<<endl;
int j=0;
while(currentPath[j]!='\0') j++;
if(currentPath[j-1]!='\\')
strcat(fileRoot,"\\");
cout<<fileRoot<<endl;
filename = strcat(fileRoot,temp);
cout<<fileRoot<<endl;
FILE *fp = fopen(filename, "rb"); //以二进制方式打开文件
if(fp == NULL){
char buffSend[100]="the specifed file doesn't exist\n";
send(clntSock,buffSend,strlen(buffSend),0);
cout<<buffSend;
}
else
{
char buffSend[BUF_SIZE] = {
0}; //缓冲区
int nCount;
while( (nCount = fread(buffSend, 1, BUF_SIZE, fp)) > 0 )
{
send(clntSock, buffSend, nCount, 0);
}
shutdown(clntSock, SD_SEND); //文件读取完毕,断开输出流,向客户端发送FIN包
recv(clntSock, buffSend, BUF_SIZE, 0); //阻塞,等待客户端接收完毕
}
fclose(fp);
}
void myPut()
{
char fileName[100]={
0};
int i=0,j;
while(buffer[i]!='\0') i++;
while(buffer[i]!='\\') i--;
i=i+1;
for(j=0;buffer[i]!='\0';i++,j++)
fileName[j]=buffer[i];
fileName[j]='\0';
char fileRoot[100]="D:\\FTP";
char *filePath = strcat(fileRoot,currentPath);
cout<<fileRoot<<endl;
int m=0;
while(currentPath[m]!='\0') m++;
if(currentPath[m-1]!='\\')
strcat(fileRoot,"\\");
cout<<fileRoot<<endl;
filePath=strcat(fileRoot,fileName);
cout<