📄 bookclient.cpp
字号:
#include "Winsock.h"
#include "windows.h"
#include "stdio.h"
#pragma comment(lib,"wsock32.lib")
#define RECV_PORT 2000
#define SEND_PORT 3000
#define MAX_FILESIZE 64*1024
#define SERVERADDR "127.0.0.1"
SOCKET sock;
sockaddr_in ServerAddr;
int len =sizeof(ServerAddr);
struct Filedata
{
char ffname[30];
char ffdata[MAX_FILESIZE];
int len;
}DataPacket;
DWORD StartSock()
{
WSADATA WSAData;
if (WSAStartup(MAKEWORD(2,2),&WSAData)!=0) //初始化套接字
{
printf("sock init fail!\n");
return(-1);
}
return(1);
}
DWORD CreateSocket(char ip[])
{
sock=socket(AF_INET,SOCK_STREAM,0); //创建套接字
if (sock==SOCKET_ERROR)
{
printf("sock create fail!\n");
WSACleanup();
return(-1);
}
ServerAddr.sin_family=AF_INET; //填充服务器地址端口号
ServerAddr.sin_addr.s_addr=inet_addr(ip);
ServerAddr.sin_port=htons(RECV_PORT);
printf("connect ok! \n");
return(1);
}
void CallServer(char ip[])
{
CreateSocket(ip);
if (connect(sock,(struct sockaddr *)&ServerAddr,sizeof(ServerAddr))==SOCKET_ERROR)
{
printf("Connect ... \n");
}
}
DWORD GetFile(char *fname) //由文件全名打开文件
{
FILE *fp;
int Filesize;
int i;
//char c;
int count,total=0;
char buffer[100];
char Senddata[MAX_FILESIZE];
fp=fopen(fname,"r");
if (fp==NULL)
{
printf("can not open this file\n");
return(0);
}
i=0;
Filesize=0;
memset(Senddata,0,MAX_FILESIZE);
while(!feof(fp))
{
count =fread(buffer,sizeof(char),100,fp); //读文件,一次读入100个字节
if (ferror(fp))
{
printf("Read File error");
break;
}
Filesize+=count;
if (Filesize>MAX_FILESIZE) //文件大于32KB,出错
{
printf("your file is too big\n");
fclose(fp);
return(0);
}
memcpy(&Senddata[i],buffer,count);
i+=count;
}
fclose(fp);
Senddata[i]='\0';
strcpy(DataPacket.ffname,fname);
memcpy(DataPacket.ffdata,Senddata,Filesize);
DataPacket.len=Filesize;
printf("The file is :%s %dB\n",DataPacket.ffname,DataPacket.len);
return(1);
}
DWORD TCPSendPacket(struct Filedata Packet,SOCKET s) //FTP传输函数,通过Socket发送
{
int length;
length=send(s,(char *)&Packet,sizeof(DataPacket),0);
if (length<=0)
{
printf("send Filedata error!\n");
closesocket(sock);
WSACleanup();
return(-1);
}
return(1);
}
DWORD WriteFile(char *fname,char *fdata,int flen) //写文件函数
{
int i;
FILE *fp;
fp=fopen(fname,"w");
if (fp==NULL)
{
printf("can not open this file\n");
}
i=0;
for (i=0;i<flen;i++)
{
fputc(fdata[i],fp); //逐个字节写入文件
}
fclose(fp);
return(1);
}
void FTPSevice()
{
char sendfilename[30];
char buf[30];
char banner[10][30]; //导航框
int i,j;
char select[30];
system("cls"); //清屏准备输出导航框
if (recvfrom(sock,banner[0],sizeof(banner),0,(struct sockaddr*)&ServerAddr,&len) != SOCKET_ERROR)
for(i=0;i<10;i++) //输出导航框
{
for(j=0;j<30;j++)
{printf("%c",banner[i][j]);
Sleep(1); }
printf("\n");
}
Sleep(100);
while(1)
{
printf("\nYou can choose download upload or exit now!\n");
scanf("%s",select);
sendto(sock,select,sizeof(select),0,(struct sockaddr*)&ServerAddr,sizeof(ServerAddr));
///////////用户上载
if(strcmp(select,"upload")==0)
{
while(1)
{
printf("please input the filename to send!\n"); //输入要上传的文件
scanf("%s",sendfilename);
if (GetFile(sendfilename)==0) //获得要上传的文件
continue;
TCPSendPacket(DataPacket,sock); //上传文件
break;
}
continue;
}
/////////用户下载
else if(strcmp(select,"download")==0)
{
Sleep(200);
if (recvfrom(sock,buf,sizeof(buf),0,(struct sockaddr*)&ServerAddr,&len) != SOCKET_ERROR) //接收服务器发来的下载信息
printf("receive from server:%s\n",buf);
scanf("%s",sendfilename); //输入要下载的文件
sendto(sock,sendfilename,sizeof(sendfilename),0,(struct sockaddr*)&ServerAddr,sizeof(ServerAddr));//向服务器发送要下载的文件的全名
Sleep(500);
while(1)
{
memset(DataPacket.ffname,0,30); //为将要下载的文件开辟缓存空间
memset(DataPacket.ffdata,0,MAX_FILESIZE);
DataPacket.len=0;
Sleep(200);
if (recv(sock,(char *)&DataPacket,sizeof(DataPacket),0)<=0) //接收文件
{
break;
}
printf("Has received file: %s ,length is %dB ",DataPacket.ffname,DataPacket.len);
DataPacket.ffname[0]='F'; //全名改在F盘
WriteFile(DataPacket.ffname,DataPacket.ffdata,DataPacket.len); //在F盘对应ftp文件夹写入文件
printf("\nThe file save in :%s\n\n",DataPacket.ffname);
break;
}
}
////////////////////用户选择退出
else if(strcmp(select,"exit")==0)
{ printf("\nClient exit!\n");
closesocket(sock);
exit(0);}
///////////////////用户输入错误!
else {
printf("input wrong!!\n you must input \" download \" \" upload \" or \" exit \"!!\n");
}
}
}
void main()
{
char ip[10];
printf("please input the IP of FTP server:\n");
scanf("%s",ip); //输入FTP服务器的ip地址
StartSock(); //初始化
CallServer(ip); //连接FTP服务器
printf("\n");
Sleep(800);
FTPSevice(); //开始FTP服务
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -