FTP客户端和服务器源代码C语言实现.docx
《FTP客户端和服务器源代码C语言实现.docx》由会员分享,可在线阅读,更多相关《FTP客户端和服务器源代码C语言实现.docx(42页珍藏版)》请在冰豆网上搜索。
FTP客户端和服务器源代码C语言实现
课程设计:
FTP的设计与实现
/****************client.c****************/
#include
#pragmacomment(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:
x][-s:
IP][-n:
x][-o]\n\n");
printf(" -p:
x Remoteporttosendto\n");
printf(" -s:
IP Server'sIPaddressorhostname\n");
printf(" -n:
x Numberoftimestosendmessage\n");
printf(" -o Sendmessagesonly;don'treceive\n");
ExitProcess
(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': //Remoteport if(strlen(argv[i])>3) iPort=atoi(&argv[i][3]); break; case's': //Server if(strlen(argv[i])>3) strcpy(szServerip,&argv[i][3]); break; case'n': //Numberoftimestosendmessage if(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]; //ParsethecommandlineandloadWinsock // 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) //Gracefulclose return0; 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) //Gracefulclose return0; 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) //Gracefulclose return1; 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,"500Syntaxerror",strlen("500Syntaxerror"))==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]='x';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((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];
//ParsethecommandlineandloadWinsock
//
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,"500Syntaxerror",strlen("500Syntaxerror"))==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]='x';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);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1