📄 bookserver.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
SOCKET sock,sock1;
sockaddr_in ServerAddr;
sockaddr_in ClientAddr;
struct Filedata
{
char ffname[30];
char ffdata[MAX_FILESIZE];
int len;
}DataPacket;
int Addrlen;
DWORD StartSock() //初始化
{
WSADATA WSAData;
if (WSAStartup(MAKEWORD(2,2),&WSAData)!=0)
{
printf("sock init fail!\n");
return(-1);
}
return(1);
}
DWORD CreateSocket() //初始化socket!
{
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=htonl(INADDR_ANY);
ServerAddr.sin_port=htons(RECV_PORT);
if (bind(sock,(struct sockaddr FAR *)&ServerAddr,sizeof(ServerAddr))==SOCKET_ERROR)
{
printf("bind is the error");
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);
}
//客户端下载用到的函数
//////////////////////////////////////////////////////////////////////////////////////////////////
DWORD TCPSendPacket(struct Filedata Packet,SOCKET s) //使用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 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\n",DataPacket.ffname,DataPacket.len);
return(1);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
DWORD ConnectProcess()
{
char banner[10][30]={
{'*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*'},
{'*','\0','W','e','l','c','o','m','e','\0','t','o','\0','M','y','\0','F','T','P','!','\0','\0','\0','\0','\0','\0','\0','\0','\0','*'},
{'*','Y','o','u','\0','c','a','n','\0','d','o','w','n','\0','o','r','\0','u','p','l','o','a','d','\0','h','e','r','e','!','*'},
{'*','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','*'},
{'*','Y','o','u','\0','c','a','n','\0','d','o','w','n','l','o','a','d','\0','o','r','\0','u','p','l','o','a','d','\0','\0','*'},
{'*','t','h','e','s','e','\0','f','i','l','e','s','\0','i','n','\0','t','h','i','s','\0','t','e','s','t',':','\0','\0','\0','*'},
{'*','\0','\0','D',':','\\','F','T','P','\\','t','e','s','t','1','.','t','x','t','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','*'},
{'*','\0','\0','D',':','\\','F','T','P','\\','t','e','s','t','2','.','t','x','t','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','*'},
{'*','\0','\0','D',':','\\','F','T','P','\\','t','e','s','t','3','.','t','x','t','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','*'},
{'*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*'}
}; //////////导航框
char buf1[]="which files you want?";
char select[30];
char receivefilename[30];
int len =sizeof(ServerAddr);
Addrlen=sizeof(sockaddr_in);
if (listen(sock,5)<0) /////////服务器开始监听
{
printf("Listen error");
return(-1);
}
printf("Listening...\n");
for (;;)
{
sock1=accept(sock,(struct sockaddr FAR *)&ClientAddr,&Addrlen); //接受用户连接请求
printf("connect ok!\n");
sendto(sock1,banner[0],sizeof(banner),0,(struct sockaddr*)&ClientAddr,sizeof(ClientAddr));//发给用户导航框
while (recvfrom(sock1,select,sizeof(select),0,(struct sockaddr*)&ServerAddr,&len) != SOCKET_ERROR)//等待用户输入命令
{
////////////////////用户上载
if(strcmp(select,"upload")==0)
{
printf("Client upload!!\n");
for (;;)
{
memset(DataPacket.ffname,0,30);
memset(DataPacket.ffdata,0,MAX_FILESIZE);
DataPacket.len=0;
while (recv(sock1,(char *)&DataPacket,sizeof(DataPacket),0)<=0)
{
break;
}
printf("Has received file: %s ,length is %dB ",DataPacket.ffname,DataPacket.len);
DataPacket.ffname[0]='F';
printf("\nThe file save in:%s\n",DataPacket.ffname);
WriteFile(DataPacket.ffname,DataPacket.ffdata,DataPacket.len);
break;
}
}
//////////////////////////客户下载
else if(strcmp(select,"download")==0)
{
printf("Client download!!\n");
sendto(sock1,buf1,sizeof(buf1),0,(struct sockaddr*)&ClientAddr,sizeof(ClientAddr));
recvfrom(sock1,receivefilename,sizeof(receivefilename),0,(struct sockaddr*)&ServerAddr,&len);
printf("The client will download this file: %s\n",receivefilename);
GetFile(receivefilename);
TCPSendPacket(DataPacket,sock1);
}
////////////////用户退出
else if(strcmp(select,"exit")==0)
{
printf("Client exit!!\n");
closesocket(sock1);
closesocket(sock);
return 1;
}
else {printf("\n Client input wrong!!\n");}
}
}
}
int main()
{
if (StartSock()==-1)
return(-1);
if (CreateSocket()==-1)
return(-1);
if (ConnectProcess()==-1) //开始FTP服务流程
return(-1);
return(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -