FTP客户端和服务器源代码C语言实现.docx
《FTP客户端和服务器源代码C语言实现.docx》由会员分享,可在线阅读,更多相关《FTP客户端和服务器源代码C语言实现.docx(33页珍藏版)》请在冰豆网上搜索。
FTP客户端和服务器源代码C语言实现
课程设计:
FTP的设计与实现
/****************client.c****************/
*include
*pragmament(lib,"ws2_32.lib")
*defineDEFAULT_PORT 2302
*defineDEFAULT_BUFFER 2048
*defineDEFAULT_MESSAGE "Thisisatestoftheemergency\broadcastingsystem"
char szServerip[128], //Servertoconnectto
szMessage[1024]; //Messagetosendtosever
int iPort =DEFAULT_PORT; //Portonservertoconnectto
//DWORDdwCount =DEFAULT_COUNT;//Numberoftimestosendmessage
BOOL bSendOnly=FALSE; //Senddataonly;don'treceive
intdirfun();
intgetfun();
intputfun();
intpwdfun();
intcdfun();
intmdfun();
intdelfun();
intusafun();
voidusage()
{
printf("usage:
client[-p:
*][-s:
IP][-n:
*][-o]\n\n");
printf(" -p:
* Remoteporttosendto\n");
printf(" -s:
IP Server'sIPaddressorhostname\n");
printf(" -n:
* Numberoftimestosendmessage\n");
printf(" -o Sendmessagesonly;don'treceive\n");
E*itProcess
(1);
}
voidValidateArgs(intargc,char**argv)
int i;
for(i=1;i {if((argv[i][0]=='-')||(argv[i][0]=='/')) {switch(tolower(argv[i][1])) {case'p': //Remoteportif(strlen(argv[i])>3) iPort=atoi(&argv[i][3]);break;case's': //Serverif(strlen(argv[i])>3) strcpy(szServerip,&argv[i][3]);break;case'n': //Numberoftimestosendmessageif(strlen(argv[i])>3)//dwCount=atol(&argv[i][3]);break;case'o': //Onlysendmessage;don'treceive bSendOnly=TRUE;break;default: usage();break; } } }}intmain(intargc,char**argv){ WSADATA wsd; SOCKET sClient;char szBuffer[DEFAULT_BUFFER];int ret;//unsignedint i;//intj;structsockaddr_inserver;structhostent *host=NULL;charchoice[5],choice2[40];//ParsethemandlineandloadWinsock// argv[1]="-s:127.0.0.1"; strcpy(szServerip,&argv[1][3]);//ValidateArgs(argc,argv);if(WSAStartup(MAKEWORD(2,2),&wsd)!=0) { printf("FailedtoloadWinsocklibrary!\n");return1; }//strcpy(szMessage,DEFAULT_MESSAGE);////Createthesocket,andattempttoconnecttotheserver// sClient=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if(sClient==INVALID_SOCKET) { printf("socket()failed:%d\n",WSAGetLastError());return1; } server.sin_family=AF_INET; server.sin_port=htons(iPort); printf("server.sin_port=%u\n",server.sin_port); server.sin_addr.s_addr=inet_addr(szServerip);////Ifthesuppliedserveraddresswasn'tintheform//"aaa.bbb.ccc.ddd"it'sahostname,sotrytoresolveit//if(server.sin_addr.s_addr==INADDR_NONE) { host=gethostbyname(szServerip);if(host==NULL) { printf("Unabletoresolveserver:%s\n",szServerip);return1; } CopyMemory(&server.sin_addr,host->h_addr_list[0], host->h_length); }if(connect(sClient,(structsockaddr*)&server,sizeof(server))==SOCKET_ERROR) { printf("connect()failed:%d\n",WSAGetLastError());return1; }//显示接通信息//////for(j=0;j<2;j++)// { ret=recv(sClient,szBuffer,DEFAULT_BUFFER,0);if(ret==0) //Gracefulclosereturn0;elseif(ret==SOCKET_ERROR) { printf("recv()failed:%d\n",WSAGetLastError());return0; } szBuffer[ret]='\0'; printf("%s\n",szBuffer);if(ret<15) { ret=recv(sClient,szBuffer,DEFAULT_BUFFER,0);if(ret==0) //Gracefulclosereturn0;elseif(ret==SOCKET_ERROR) {//printf("recv()failed:%d\n",WSAGetLastError());return0; } szBuffer[ret]='\0'; printf("%s\n",szBuffer); }//printf("DEFAULT_BUFFER=%d\n",DEFAULT_BUFFER); }while(1) { puts("------------------------------------------"); printf("ftp>"); scanf("%s",choice);if(strncmp(choice,"dir",3)==0||strncmp(choice,"DIR",2)==0) { dirfun(sClient);continue; } elseif(strncmp(choice,"pwd",3)==0||strncmp(choice,"PWD",3)==0) { pwdfun(sClient);continue; }elseif(strncmp(choice,"",1)==0) { usafun(sClient);continue; }elseif(strncmp(choice,"quit",4)==0||strncmp(choice,"QUIT",2)==0) {break; } scanf("%s",choice2);if(strncmp(choice,"get",3)==0||strncmp(choice,"GET",3)==0) { getfun(sClient,choice2);continue; }elseif(strncmp(choice,"put",3)==0||strncmp(choice,"PUT",3)==0) { putfun(sClient,choice2);continue; }elseif(strncmp(choice,"cd",2)==0||strncmp(choice,"CD",2)==0) { cdfun(sClient,choice2);continue; }elseif(strncmp(choice,"md",2)==0||strncmp(choice,"MD",2)==0) { mdfun(sClient,choice2);continue; }elseif(strncmp(choice,"del",3)==0||strncmp(choice,"DEL",3)==0) { delfun(sClient,choice2);continue; }//else puts("输入错误,请重新输入"); fflush(stdin); fflush(stdin); printf("\n"); printf("\n"); } closesocket(sClient); WSACleanup();return0;}intdirfun(SOCKETsClient){intret;char*MSG="dir$";charszBuffer[80]; strcpy(szMessage,MSG); ret=send(sClient,szMessage,strlen(szMessage),0);if(ret==0)return1;elseif(ret==SOCKET_ERROR) { printf("send()failed:%d\n",WSAGetLastError());return1; }//printf("Send%dbytes\n",ret);//printf("bSendOnly=%d\n",bSendOnly);while(!bSendOnly) {//读取流并显示 //ret=recv(sClient,szBuffer,80,0);//printf("%s",szBuffer); ret=recv(sClient,szBuffer,80,0);if(ret==0) //Gracefulclosereturn1;elseif(ret==SOCKET_ERROR) { printf("recv()failed:%d\n",WSAGetLastError());return1; } szBuffer[ret]='\0';if(strncmp(szBuffer,"226Close",strlen("226Close"))==0) {break; } printf("%s",szBuffer);if(strncmp(szBuffer,"500Synta*error",strlen("500Synta*error"))==0) {break; } }return0;}intgetfun(SOCKETsClient,charfilename[40]){intret; FILE*fpre;charszBuffer[80]; szMessage[0]='\0'; strcat(szMessage,"get$");//strcat(szMessage,"\\"); strcat(szMessage,filename);//printf("MSG[4]=%c\n",szMessage[4]);//szMessage[0]='g';szMessage[1]='e';szMessage[2]='t';////szMessage[4]='m';szMessage[5]='e';szMessage[6]='.';szMessage[7]='t';////szMessage[8]='*';szMessage[9]='t';szMessage[10]='\0'; ret=send(sClient,szMessage,strlen(szMessage)+1,0);if(ret==0)return1;elseif(ret==SOCKET_ERROR) { printf("send()failed:%d\n",WSAGetLastError());return1; } printf("Send%dbytes\n",ret); ret=recv(sClient,szBuffer,80,0);/*if(ret==0) //Gracefulclose break; elseif(ret==SOCKET_ERROR) { printf("recv()failed:%d\n",WSAGetLastError()); break; }*/ szBuffer[ret]='\0'; printf("%s\n",szBuffer);if(strncmp(szBuffer,"125Transfering...",strlen("125Transfering..."))==0) {if((fpre=fopen(filename,"w"))==NULL) { printf("openerrer");return1; } printf("bSendOnly=%d\n",bSendOnly);while(!bSendOnly) {//读取流并显示 ret=recv(sClient,szBuffer,80,0);if(ret==0) //Gracefulclosereturn1;elseif(ret==SOCKET_ERROR) { printf("recv()failed:%d\n",WSAGetLastError());return1; } szBuffer[ret]='\0';//printf("%s",szBuffer); if(strncmp(szBuffer,"226Transfer",strlen("226Transfer"))==0) {break; }if(strncmp(szBuffer,"500Synta*error",strlen("500Synta*error"))==0) {break; } fprintf(fpre,"%s",szBuffer); } printf("%s\n",szBuffer); fclose(fpre); }return0;}intputfun(SOCKETsClient,charfilename[40]){intret;//inti; FILE*fpse;//char*filename;//char*MSG="get\0me.t*t";charszBuffer[80],temp_buffer[80];//sprintf(szMessage,"get\0","te.t*t\0"); szMessage[0]='\0'; strcat(szMessage,"put$"); strcat(szMessage,filename); ret=send(sClient,szMessage,strlen(szMessage)+1,0);if(ret==0)return0;elseif(ret==SOCKET_ERROR) { printf("send()failed:%d\n",WSAGetLastError());return1; }//printf("Send%dbytes\n",ret);//filename="me.t*t"; printf("filename=%s\n",filename);if((fpse=fopen(filename,"r"))==NULL) { printf("openerrer");return1; }else { printf("Thefile%sfound,readytotransfer.\n",filename);//i=0;while
if((argv[i][0]=='-')||(argv[i][0]=='/'))
switch(tolower(argv[i][1]))
case'p':
//Remoteport
if(strlen(argv[i])>3)
iPort=atoi(&argv[i][3]);
break;
case's':
//Server
strcpy(szServerip,&argv[i][3]);
case'n':
//Numberoftimestosendmessage
//dwCount=atol(&argv[i][3]);
case'o':
//Onlysendmessage;don'treceive
bSendOnly=TRUE;
default:
usage();
intmain(intargc,char**argv)
WSADATA wsd;
SOCKET sClient;
char szBuffer[DEFAULT_BUFFER];
int ret;
//unsignedint i;
//intj;
structsockaddr_inserver;
structhostent *host=NULL;
charchoice[5],choice2[40];
//ParsethemandlineandloadWinsock
//
argv[1]="-s:
127.0.0.1";
strcpy(szServerip,&argv[1][3]);
//ValidateArgs(argc,argv);
if(WSAStartup(MAKEWORD(2,2),&wsd)!
=0)
printf("FailedtoloadWinsocklibrary!
\n");
return1;
//strcpy(szMessage,DEFAULT_MESSAGE);
//Createthesocket,andattempttoconnecttotheserver
sClient=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(sClient==INVALID_SOCKET)
printf("socket()failed:
%d\n",WSAGetLastError());
server.sin_family=AF_INET;
server.sin_port=htons(iPort);
printf("server.sin_port=%u\n",server.sin_port);
server.sin_addr.s_addr=inet_addr(szServerip);
//Ifthesuppliedserveraddresswasn'tintheform
//"aaa.bbb.ccc.ddd"it'sahostname,sotrytoresolveit
if(server.sin_addr.s_addr==INADDR_NONE)
host=gethostbyname(szServerip);
if(host==NULL)
printf("Unabletoresolveserver:
%s\n",szServerip);
CopyMemory(&server.sin_addr,host->h_addr_list[0],
host->h_length);
if(connect(sClient,(structsockaddr*)&server,
sizeof(server))==SOCKET_ERROR)
printf("connect()failed:
//显示接通信息
//for(j=0;j<2;j++)
ret=recv(sClient,szBuffer,DEFAULT_BUFFER,0);
if(ret==0) //Gracefulclose
return0;
elseif(ret==SOCKET_ERROR)
printf("recv()failed:
szBuffer[ret]='\0';
printf("%s\n",szBuffer);
if(ret<15)
//printf("recv()failed:
//printf("DEFAULT_BUFFER=%d\n",DEFAULT_BUFFER);
while
(1)
puts("------------------------------------------");
printf("ftp>");
scanf("%s",choice);
if(strncmp(choice,"dir",3)==0||strncmp(choice,"DIR",2)==0)
dirfun(sClient);
continue;
elseif(strncmp(choice,"pwd",3)==0||strncmp(choice,"PWD",3)==0)
pwdfun(sClient);
elseif(strncmp(choice,"",1)==0)
usafun(sClient);
elseif(strncmp(choice,"quit",4)==0||strncmp(choice,"QUIT",2)==0)
scanf("%s",choice2);
if(strncmp(choice,"get",3)==0||strncmp(choice,"GET",3)==0)
getfun(sClient,choice2);
elseif(strncmp(choice,"put",3)==0||strncmp(choice,"PUT",3)==0)
putfun(sClient,choice2);
elseif(strncmp(choice,"cd",2)==0||strncmp(choice,"CD",2)==0)
cdfun(sClient,choice2);
elseif(strncmp(choice,"md",2)==0||strncmp(choice,"MD",2)==0)
mdfun(sClient,choice2);
elseif(strncmp(choice,"del",3)==0||strncmp(choice,"DEL",3)==0)
delfun(sClient,choice2);
//else
puts("输入错误,请重新输入");
fflush(stdin);
printf("\n");
closesocket(sClient);
WSACleanup();
intdirfun(SOCKETsClient)
intret;
char*MSG="dir$";charszBuffer[80];
strcpy(szMessage,MSG);
ret=send(sClient,szMessage,strlen(szMessage),0);
if(ret==0)
printf("send()failed:
//printf("Send%dbytes\n",ret);
//printf("bSendOnly=%d\n",bSendOnly);
while(!
bSendOnly)
//读取流并显示
//ret=recv(sClient,szBuffer,80,0);
//printf("%s",szBuffer);
ret=recv(sClient,szBuffer,80,0);
if(strncmp(szBuffer,"226Close",strlen("226Close"))==0)
printf("%s",szBuffer);
if(strncmp(szBuffer,"500Synta*error",strlen("500Synta*error"))==0)
intgetfun(SOCKETsClient,charfilename[40])
FILE*fpre;
charszBuffer[80];
szMessage[0]='\0';
strcat(szMessage,"get$");
//strcat(szMessage,"\\");
strcat(szMessage,filename);
//printf("MSG[4]=%c\n",szMessage[4]);
//szMessage[0]='g';szMessage[1]='e';szMessage[2]='t';
//szMessage[4]='m';szMessage[5]='e';szMessage[6]='.';szMessage[7]='t';
//szMessage[8]='*';szMessage[9]='t';szMessage[10]='\0';
ret=send(sClient,szMessage,strlen(szMessage)+1,0);
printf("Send%dbytes\n",ret);
/*if(ret==0) //Gracefulclose
}*/
if(strncmp(szBuffer,"125Transfering...",strlen("125Transfering..."))==0)
if((fpre=fopen(filename,"w"))==NULL)
printf("openerrer");
printf("bSendOnly=%d\n",bSendOnly);
if(strncmp(szBuffer,"226Transfer",strlen("226Transfer"))==0)
fprintf(fpre,"%s",szBuffer);
fclose(fpre);
intputfun(SOCKETsClient,charfilename[40])
intret;//inti;
FILE*fpse;//char*filename;
//char*MSG="get\0me.t*t";
charszBuffer[80],temp_buffer[80];
//sprintf(szMessage,"get\0","te.t*t\0");
strcat(szMessage,"put$");
//filename="me.t*t";
printf("filename=%s\n",filename);
if((fpse=fopen(filename,"r"))==NULL)
else
printf("Thefile%sfound,readytotransfer.\n",filename);
//i=0;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1