FTP服务器客户端源代码C语言.docx
- 文档编号:10018077
- 上传时间:2023-02-08
- 格式:DOCX
- 页数:18
- 大小:42.95KB
FTP服务器客户端源代码C语言.docx
《FTP服务器客户端源代码C语言.docx》由会员分享,可在线阅读,更多相关《FTP服务器客户端源代码C语言.docx(18页珍藏版)》请在冰豆网上搜索。
FTP服务器客户端源代码C语言
FTP服务器源代码:
#include"Winsock.h"
#include"windows.h"
#include"stdio.h"
#defineRECV_PORT200
#defineSEND_PORT3000
#pragmacomment(lib,"wsock32.lib")
SOCKETsock,sock1,sockdir,sockput,sockget;
sockaddr_inServerAddr;
sockaddr_inClientAddr;
intAddrlen;//地址长度
charfilename[20];//文件名
charorder[10];//命令
charrbuff[1024];//接收缓冲区
charsbuff[1024];//发送缓冲区
//初始化winsock
DWORDStartSock()
{WSADATAWSAData;
if(WSAStartup(MAKEWORD(2,2),&WSAData)!
=0)
{printf("sockinitfail!
\n");
return(-1);
}
return
(1);
}
DWORDCreateSocket()
{
sock=socket(AF_INET,SOCK_STREAM,0);/*建立套接字*/
if(sock==SOCKET_ERROR)
{
printf("sockcreatefail!
\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,(structsockaddrFAR*)&ServerAddr,sizeof(ServerAddr))==SOCKET_ERROR)
{
printf("bindistheerror");
return(-1);
}
return
(1);
}
//发送文件
intSendFileRecord(SOCKETdatatcps,WIN32_FIND_DATA*pfd)
//usedtosendresponsetoclient
{
charfilerecord[MAX_PATH+32];
FILETIMEft;
FileTimeToLocalFileTime(&pfd->ftLastWriteTime,&ft);
SYSTEMTIMElastwtime;
FileTimeToSystemTime(&ft,&lastwtime);
char*dir=pfd->dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY?
"
"";
sprintf(filerecord,"%04d-%02d-%02d%02d:
%02d%5s%10d%-40s\n",
lastwtime.wYear,
lastwtime.wMonth,
lastwtime.wDay,
lastwtime.wHour,
lastwtime.wMinute,
dir,
pfd->nFileSizeLow,
pfd->cFileName);
if(send(datatcps,filerecord,strlen(filerecord),0)==SOCKET_ERROR)
{
printf("Erroroccurswhensendingfilelist!
\n");
return0;
}
return1;
}
intSendFileList(SOCKETdatatcps)
{
HANDLEhff;
WIN32_FIND_DATAfd;
//搜索文件
hff=FindFirstFile("*",&fd);
if(hff==INVALID_HANDLE_VALUE)//发生错误
{
constchar*errstr="can'tlistfiles!
\n";
printf("listfileerror!
\n");
if(send(datatcps,errstr,strlen(errstr),0)==SOCKET_ERROR)
{
printf("erroroccurswhensengingfilelist!
\n");
}
closesocket(datatcps);
return0;
}
BOOLfMoreFiles=TRUE;
while(fMoreFiles)
{
//发送此项文件信息
if(!
SendFileRecord(datatcps,&fd))
{
closesocket(datatcps);
return0;
}
//搜索下一个文件
fMoreFiles=FindNextFile(hff,&fd);
}
closesocket(datatcps);
return1;
}
intSendFile(SOCKETdatatcps,FILE*file)
{
printf("sendingfiledata..");
for(;;)
//从文件中循环读取数据并发送客户端
{
intr=fread(sbuff,1,1024,file);
if(send(datatcps,sbuff,r,0)==SOCKET_ERROR)
{
printf("losttheconnectiontoclient!
\n");
closesocket(datatcps);
return0;
}
if(r<1024)//文件传送结束
break;
}
closesocket(datatcps);
printf("done\n");
return1;
}
//连接
DWORDConnectProcess()
{
Addrlen=sizeof(sockaddr_in);
if(listen(sock,5)<0)//连接数?
{
printf("Listenerror");
return(-1);
}
printf("Listening...\n");
for(;;)
{
sock1=accept(sock,(structsockaddrFAR*)&ClientAddr,&Addrlen);
for(;;)
{
memset(rbuff,0,1024);
memset(sbuff,0,1024);
if(recv(sock1,rbuff,1024,0)<=0)
{
break;
}printf("\n");
printf("获取并执行的命令为:
");
printf(rbuff);
if(strncmp(rbuff,"get",3)==0)
{
strcpy(filename,rbuff+4);printf(filename);
FILE*file;
//处理下载文件请求
file=fopen(filename,"rb");//打开下载的文件
if(file)
{
sprintf(sbuff,"getfile%s\n",filename);
if(!
send(sock1,sbuff,1024,0))
{fclose(file);
return0;}
else
{//创建额外数据连接传送数据
if(!
SendFile(sock1,file))
return0;
fclose(file);}
}//file
else//打开文件失败
{
strcpy(sbuff,"can'topenfile!
\n");
if(send(sock1,sbuff,1024,0))
return0;
}//lost
}//get
if(strncmp(rbuff,"put",3)==0){
FILE*fd;intcount;
strcpy(filename,rbuff+4);
fd=fopen(filename,"wb");
if(fd==NULL){
printf("openfile%sforwritefailed!
\n",filename);return0;}
sprintf(sbuff,"putfile%s",filename);
if(!
send(sock1,sbuff,1024,0))
{fclose(fd);
return0;}
while((count=recv(sock1,rbuff,1024,0))>0)
fwrite(rbuff,sizeof(char),count,fd);
fclose(fd);
}//put
if(strncmp(rbuff,"dir",3)==0){
strcpy(sbuff,rbuff);
send(sock1,sbuff,1024,0);
SendFileList(sock1);}
if(strncmp(rbuff,"cd",2)==0){
strcpy(filename,rbuff+3);
strcpy(sbuff,rbuff);
send(sock1,sbuff,1024,0);
SetCurrentDirectory(filename);
}
closesocket(sock1);
}//for2
}//for1
}
intmain()
{
if(StartSock()==-1)
return(-1);
if(CreateSocket()==-1)
return(-1);
if(ConnectProcess()==-1)
return(-1);
return
(1);
}
运行结果
FTP客户端运行源代码:
#include"Winsock.h"
#include"windows.h"
#include"stdio.h"
#include"time.h"
#include
#defineRECV_PORT200
#defineSEND_PORT3000
#pragmacomment(lib,"wsock32.lib")
SOCKETsock;
charfilename[20];
sockaddr_inServerAddr;
charrbuff[1024];
charsbuff[1024];
charIIP[20];
//处理help命令
voidhelp()
{
cout<<"*********************COMMANDShelp***********************"< <<"****命令*******************作用*****************"< <<"? 或者'help'...........显示你提供的所有命令"< <<"dir...................显示远方当前目录的文件"< <<"cd....................改变远方当前目录和路径"< <<"cd的用法(进入下级目录): 'cd路径名'"< <<"cd的用法(进入上级目录): 'cd..'"< <<"get...................下载(接受)文件"< <<"get的用法: 'get文件名'"< <<"put..................上传(发送)文件"< <<"put的用法: 'put文件名'"< <<"quit...................退出"< <<"*****************************************************"< } //处理dir命令 voidlist(SOCKETsockfd) { intnRead; while(true) { nRead=recv(sock,rbuff,1024,0); if(nRead==SOCKET_ERROR) { printf("readresponseerror! \n"); exit (1); } if(nRead==0)//数据读取结束 break; //显示数据 rbuff[nRead]='\0'; printf("%s",rbuff); } } intSendFile(SOCKETdatatcps,FILE*file) { printf("sendingfiledata.."); for(;;) //从文件中循环读取数据并发送客户端 { intr=fread(sbuff,1,1024,file); if(send(datatcps,sbuff,r,0)==SOCKET_ERROR) { printf("lostthrconnectiontoclient! \n"); closesocket(datatcps); return0; } if(r<1024)//文件传送结束 break; } closesocket(datatcps); printf("done\n"); return1; } //初始化scoket DWORDStartSock() {WSADATAWSAData; chara[20]; memset(a,0,20); if(WSAStartup(MAKEWORD(2,2),&WSAData)! =0) {printf("sockinitfail! \n"); return(-1); } if(strncmp(IIP,a,20)==0){ printf("请输入连接的主机号: "); scanf("%s",&IIP);} ServerAddr.sin_family=AF_INET; ServerAddr.sin_addr.s_addr=inet_addr(IIP); ServerAddr.sin_port=htons(RECV_PORT); return (1); } //创建套接字 DWORDCreateSocket() { sock=socket(AF_INET,SOCK_STREAM,0); if(sock==SOCKET_ERROR) {printf("sockcreatefail! \n"); WSACleanup(); return(-1); } return (1); } //发送连接请求 DWORDCallServer(){ CreateSocket(); if(connect(sock,(structsockaddr*)&ServerAddr,sizeof(ServerAddr))==SOCKET_ERROR) { printf("Connectfail\n"); memset(IIP,0,20); return(-1); } return (1); } //发送命令 DWORDTCPSend(chardata[]){ intlength; length=send(sock,data,strlen(data),0); if(length<=0) { printf("senddataerror! \n"); closesocket(sock); WSACleanup(); return(-1); } return (1); } //主程序 intmain() {charmessge1[10]; charmessge2[20]; charorder[30]; order[0]='\0'; charbuff[80]; FILE*fd; FILE*fd2; intcount; intsin_size=sizeof(ServerAddr); StartSock(); if(CallServer()==-1)returnmain(); printf("connectok! \n"); printf("Inputorder: \n"); memset(buff,0,80); memset(messge2,0,20); memset(order,0,30); memset(messge1,0,10); memset(rbuff,0,1024); memset(sbuff,0,1024); scanf("%s",&messge1); if(strncmp(messge1,"get",3)==0) scanf("%s",&messge2); if(strncmp(messge1,"put",3)==0) scanf("%s",&messge2); if(strncmp(messge1,"cd",2)==0) scanf("%s",&messge2); strcat(order,messge1); strcat(order,""); strcat(order,messge2); sprintf(buff,order); //help和? printf("\n"); if(strncmp(messge1,"help",4)==0){ help();} if(strncmp(messge1,"? ",1)==0){ help();} if(strncmp(messge1,"quit",4)==0){ closesocket(sock); WSACleanup(); return0;} TCPSend(buff); recv(sock,rbuff,1024,0); printf(rbuff); if(strncmp(rbuff,"get",3)==0) { fd=fopen(messge2,"wb");//使用二进制方式 if(fd==NULL) { printf("openfile%sforweitefailed! \n",messge2); return0; } while((count=recv(sock,rbuff,1024,0))>0){ fwrite(rbuff,sizeof(char),count,fd);} fclose(fd); }//get if(strncmp(rbuff,"put",3)==0) { strcpy(filename,rbuff+9); fd2=fopen(filename,"rb"); if(fd2){ if(! SendFile(sock,fd2)){ printf("sendfailed! "); return0;} fclose(fd2);} else//打开文件失败 { strcpy(sbuff,"can'topenfile! \n"); if(send(sock,sbuff,1024,0)) return0;} }//put if(strncmp(rbuff,"dir",3)==0) { list(sock); }//dir if(strncmp(rbuff,"cd",2)==0){ } closesocket(sock); WSACleanup();//cd returnmain(); }//main 运行结果:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- FTP 服务器 客户端 源代码 语言