文件传输协议的简单设计与实现.docx
- 文档编号:3226296
- 上传时间:2022-11-20
- 格式:DOCX
- 页数:36
- 大小:22.35KB
文件传输协议的简单设计与实现.docx
《文件传输协议的简单设计与实现.docx》由会员分享,可在线阅读,更多相关《文件传输协议的简单设计与实现.docx(36页珍藏版)》请在冰豆网上搜索。
文件传输协议的简单设计与实现
要求:
用socket编程接口编写两个程序,分别为客户程序(client.c)和服务器程序(server.c),该程序应能实现下述命令功能:
get:
取远方的一个文件
put:
传给远方一个文件
pwd:
显示远主当前目录
dir:
列出远方当前目录
cd:
改变远方当前目录
?
:
显示你提供的命令
quit:
退出返回
注意事项:
这此命令的具体工作方式(指给出结果的形式)可以参照FTP的相应命令,有余力的同学可以多实现几个命令。
使用Socket进行Client/Server程序设计的一般连接过程是这样的:
Server端Listen(监听)某个端口是否有连接请求,Client端向Server端发出Connect(连接)请求,Server端向Client端发回Accept(接受)消息。
一个连接就建立起来了。
Server端和Client端都可以通过Send,Write等方法与对方通信。
对于一个功能齐全的Socket,都要包含以下基本结构,其工作过程包含以下四个基本的步骤:
(1)创建Socket;
(2)打开连接到Socket的输入/出流;
(3)按照一定的协议对Socket进行读/写操作;
(4)关闭Socket.
下面是源代码:
/****************client.c****************/
#include
#include
#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(sC
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 文件传输 协议 简单 设计 实现