版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、本科实验报告课程名称:计算机网络根底姓 名:赖剑学 院:软件学院系:软件工程专 业:软件工程学 号:3052211006指导教师:陆魁军 陈辉年 月 日浙江大学实验报告课程名称: 计算机网络根底 实验类型: 普通实验 实验工程名称: 熟悉网络命令及用SOCKET编程实现mini FTP client / Server 学生姓名: 赖剑 专业: 软件工程 学号: 3052211006 同组学生姓名: 刘世林 徐晓龙 邬雪松 指导老师: 陆魁军 陈辉 实验地点: 曹西软件学院机房 实验日期: 07 年 9 月 11日开始一、 实验目的和要求:在PC机上熟悉常用网络命令;熟悉掌握windows下的S
2、ocket编程,并应用Socket API实现miniFTPclient/Server。二、 实验内容和原理在PC机上熟悉常用网络命令: ,, , , ,, , , , ,选择5个或5个以上的命令书写实验报告。使用Win32 Socket 函数实现,不能使用MFC的Csocket类库MFC的Csocket类库不能在LINUX、UNIX等环境下使用,跨平台性差,不能用C+ builder开发编程量太少,C+ builder已完成了很多SOCKET代码的编写。1. mini FTP client/ Server要求:在客户端至少实现GET file, PUT file, CD( change Di
3、rectory), PWD( display current directory in server)功能。独立完成mini FTP client端及 Server端程序。mini FTP client/ Server不一定要使用标准FTP协议,不一定要与现有的标准FTP server互通,也不一定要与现有的标准FTP Client例如LEAP FTP互通。mini FTP client/ Server可使用自定义的FTP协议、应用层PDU格式及握手方式。2. 补充:有能力的同学在完成任务后,可以进一步开发client端软件,尝试与现有的标准FTP server互通, 实现GET file,
4、PUT file, CD( change Directory), PWD( display current directory in server)等功能。有能力的同学在完成任务后,可以进一步在自己机器上的linux / unix平台下实现mini FTP client/ Server或聊天程序。三、 主要仪器设备联网的PC机。四、 操作方法与实验步骤l 在命令行方式下,执行适当的命令,完成以下功能:1 测试到特定地址的联通性、数据包延迟时间2 显示本机的默认网关地址、DNS效劳器地址3 显示本机记录的局域网内其它机器IP地址与其物理地址的对照表4 显示已经与本机建立TCP连接的端口、IP地址
5、、连接状态等信息5 使用telnet连接WEB效劳器的端口,l 客户端和在vc6.0环境进行编译。效劳器端和在vs2005环境中进行编译。在使用效劳器端之前先修改配置文件。方法为“ServerIp表示效劳器ipServerPort表示效劳器端口RootDirectory表示效劳器共享根目录,缺省为当前目录“修改配置文件之后效劳器端可直接编译运行客户端需按要求输入效劳器ip和端口五、 实验数据记录和处理网络命令1 测试到特定地址的联通性、数据包延迟时间输入命令ping 35,得到与该地址的连通性及延迟。2. 显示本机的网卡物理地址、IP地址,默认网关地址、DNS效劳器地址
6、输入命令ipconfig /all得到当前连接的详细信息输入命令arp -a显示本机记录的IP及其对应物理地址4.显示已经与本机建立TCP连接的端口、IP地址、连接状态等信息输入命令netstat -a -n -p TCP,用数字模式显示于本机建立的TCP连接及其状态连接飘渺水云间,输入telnet .88 Mini-FTPl 程序框图依据上图将client和server进行连接和数据传输。l 主要过程介绍效劳器:开始从配置文件读取相关信息,创立一个套接口,将一本地地址与一套接口捆绑并监听申请的连接。当有客户端进行连接时接受并返回指令帮助和当前目录的文件列表。然后等待用户指令。收到指令后作出相
7、应回应。客户端:从屏幕上读取信息,创立一个套接口,与效劳器相连接。把效劳器端发来的信息打印出来。向效劳器发送命令,对相应命令处理从效劳器接受的信。l 源程序效劳器:#pragma comment(lib,ws2_32.lib)#include #include #include #include #include #include #define BUFSIZE 1024using namespace std;typedef struct acceptInfSOCKET acceptSocket;/store the clients socketstruct sockaddr_in *acce
8、ptAddr;/store the clients addressaccepInf;typedef struct transferInfSOCKET acceptSocket;/store the clients socketHANDLE hFile;/store the transferred files handleint type;/ 0 for download, 1 for uploadtransferInf;/util functionsint initNetServer(SOCKET*);/initialize the network environmentint getDire
9、ctoryFiles(WCHAR*,list*);/get the files list according the specified directoryvoid solveCommand(WCHAR *,const char*, SOCKET*);/analysis the command and solve the command separatelyvoid char2WCHAR(char*, WCHAR*);void WCHAR2char(WCHAR*, char*);char * DWORDtoCHAR(DWORD ) ;/create thread through the spe
10、cified functionsHANDLE createSessionThread(SOCKET, struct sockaddr_in*);void createTransferThread(transferInf*);void createListenThread(SOCKET);/thread functionDWORD WINAPI createSession(LPVOID);DWORD WINAPI createTransfer(LPVOID);DWORD WINAPI createListen(LPVOID);/global variableschar SERVERIP128;i
11、nt SERVERPORT;list rootFiles;list sessionList;WCHAR rootDirMAX_PATH;int hasConfiguredDir=0;char* OVER=;char* WELCOME=Welcome to Ftp Servern;char* BYE=See you!n;char* ERRORCMD=Error command, please check your cmdn;char* NOSUCHFILE=Requested file does not existn;char* COMMANDS=*n,* dir - print current
12、 directoryn, * cd - change current directoryn,* lcd - change local directoryn,* put - upload file to servern,* get - download file from servern,* help - get help informationn,* bye - to end the connectionn,*n;int CMDSIZE=9;include FtpServer.hint main() SOCKET serverSocket;printf(Initialize the netwo
13、rk.);if(!initNetServer(&serverSocket)return 1;printf(OKn);printf(Initialize the root files.);if(!hasConfiguredDir)int length= GetCurrentDirectoryW(0,NULL); if(!GetCurrentDirectory(length, rootDir)printf (Error at GetCurrentDirectory() %un, GetLastError();return 1;if(!getDirectoryFiles(rootDir,&rootF
14、iles)printf(Error directory configured, please check it outn);return 1;printf(OKn); / wait accept connections. printf( Waiting for a client to connect.n ); createListenThread(serverSocket); return 0;int initNetServer(SOCKET *serverSocket)int i,j;char buffer128,key128,value128;FILE *config=fopen(FtpS
15、erver.ini,r);while(fgets(buffer,128,config)!=NULL)/read the configuration file FtpServer.inii=0;j=0;while(bufferi!=&bufferi!=0)keyj=bufferi;i+;j+;keyj=0;j=0;i+;while(bufferi!=n&bufferi!=0)valuej=bufferi;i+;j+;valuej=0;if(strcmp(ServerIp,key)=0)strcpy(SERVERIP,value);if(strcmp(ServerPort,key)=0)SERVE
16、RPORT=atoi(value);if(strcmp(RootDirectory,key)=0)if(strlen(value)3)hasConfiguredDir=0;elsehasConfiguredDir=1;char2WCHAR(value,rootDir);fclose(config); / specify the version of Windows Sockets required and retrieve details of the specific Windows Sockets implementation WSADATA wsaData; int iResult =
17、WSAStartup( MAKEWORD(2,2), &wsaData );if ( iResult != NO_ERROR ) printf(Error at WSAStartup()n);return 0; / create the server socket which is connection-oriented socket that provide full-duplex connections *serverSocket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); if ( *serverSocket = INVALID_SOCK
18、ET ) printf( Error at socket(): %ldn, WSAGetLastError() ); WSACleanup(); return 0; /initialize the servers address with ip and port sockaddr_in service; service.sin_family = AF_INET;/converts a string containing an (Ipv4) Internet Protocol dotted address into a proper address for the IN_ADDR structu
19、re service.sin_addr.s_addr = inet_addr(SERVERIP);/converts a u_short from host to TCP/IP network byte order service.sin_port = htons( SERVERPORT);/Bind the serverSocket with servers address if ( bind( *serverSocket, (SOCKADDR*) &service, sizeof(service) ) = SOCKET_ERROR ) printf( Error at bind()n );
20、 closesocket(*serverSocket); return 0; /places a socket in a state in which it is listening for an incoming connection/SOMAXCONN make underlying service provider responsible for socket s will set the backlog to a maximum reasonable valueif ( listen( *serverSocket, SOMAXCONN ) = SOCKET_ERROR ) printf
21、( Error listening on socket.n);return 0;return 1;int getDirectoryFiles(WCHAR* directory, list* filesList)/get the files list of a specified directory WIN32_FIND_DATA foundFileData; HANDLE findHandle = INVALID_HANDLE_VALUE; WCHAR dirSpecMAX_PATH; / directory specification DWORD dwError; wcscpy_s (dir
22、Spec,MAX_PATH,directory); wcscat_s (dirSpec,MAX_PATH, _T(*); findHandle = FindFirstFile(LPCWSTR)dirSpec, &foundFileData); if (findHandle = INVALID_HANDLE_VALUE) /printf (Invalid file handle. Error is %un, GetLastError(); return 0; else filesList-clear();while (FindNextFile(findHandle, &foundFileData
23、) != 0) /get the files to the listint nLen=(int)wcslen(foundFileData.cFileName)+1;char *fileName=(char*)malloc(2*nLen);WideCharToMultiByte(CP_ACP, 0, foundFileData.cFileName, nLen, fileName, 2*nLen, NULL, NULL); strcat(fileName,n);filesList-push_back(fileName);dwError = GetLastError();FindClose(find
24、Handle);if (dwError != ERROR_NO_MORE_FILES) /printf (FindNextFile error. Error is %un, dwError);return 0;return 1;HANDLE createSessionThread(SOCKET acceptSocket, struct sockaddr_in *acceptAddr)/create a separate session thread for every connected clientacceptInf *acceptinf=new acceptInf;acceptinf-ac
25、ceptAddr=new struct sockaddr_in;*(acceptinf-acceptAddr)=*acceptAddr;acceptinf-acceptSocket=acceptSocket;/store the clients basic network informationDWORD threadID; HANDLE threadHandle;threadHandle=CreateThread(NULL,0,createSession,acceptinf,0,&threadID);return threadHandle;void createTransferThread(
26、transferInf *transferinf)/create a separate thread for transferring data between client and serverDWORD result;DWORD threadID; HANDLE threadHandle;threadHandle=CreateThread(NULL,0,createTransfer,transferinf,0,&threadID);while(1)result=WaitForSingleObject(threadHandle,100);if(WAIT_OBJECT_0=result)Clo
27、seHandle(threadHandle);break;void createListenThread(SOCKET serverSocket)/create a thread for listening the clients connection requestlist:iterator iter;LPDWORD exitCode=new DWORD;DWORD threadID; HANDLE threadHandle;threadHandle=CreateThread(NULL,0,createListen,&serverSocket,0,&threadID);while(threa
28、dHandle!=NULL)/manage the session threads, destroy the handle if a thread returnedfor(iter=sessionList.begin();iter!=sessionList.end();iter+)GetExitCodeThread(*iter, exitCode);if(*exitCode!=STILL_ACTIVE)CloseHandle(*iter);sessionList.remove(*iter);break;GetExitCodeThread(threadHandle, exitCode);if(*
29、exitCode!=STILL_ACTIVE)free(exitCode);CloseHandle(threadHandle);break;Sleep(100);DWORD WINAPI createSession(LPVOID param)/session thread function definationacceptInf acceptinf=*(acceptInf*)param;SOCKET *acceptSocket=&acceptinf.acceptSocket;struct sockaddr_in *acceptAddr=acceptinf.acceptAddr; int byt
30、esRecv;char recvbuf128;list:const_iterator iter;/show the welcom messagesend( *acceptSocket, WELCOME, (int)strlen(WELCOME),0);/show the user commands listfor(int i=0;isin_addr);int port=(int)ntohs(acceptAddr-sin_port);printf(Client Closed:%s:%dn,ip,port);free(acceptAddr);return 0;DWORD WINAPI create
31、Transfer(LPVOID param)/transfer thread function definationchar sendbufBUFSIZE;char *sendbegin=sendbuf+1;char recvbufBUFSIZE;char *recvbegin=recvbuf+1;DWORD dwBytesRead;DWORD dwBytesWritten;transferInf *transferinf=(transferInf*)param;/store the key data about the transferSOCKET acceptSocket=transfer
32、inf-acceptSocket;HANDLE hFile=transferinf-hFile;int type=transferinf-type;int recvbyte;int isputend=0;int isgetend=0;int putamount=0;BOOL result=false;char ack5;if(type=0)/get filedo result=ReadFile(hFile,sendbegin, BUFSIZE-1, &dwBytesRead, NULL);if (result & dwBytesReadBUFSIZE-1) / this is the end
33、of the filesendbuf0=0;isgetend=1;elsesendbuf0=1;send( acceptSocket, sendbuf, dwBytesRead+1, 0 );recv( acceptSocket, ack, 5, 0); while (!isgetend); else/put filedorecvbyte = recv(acceptSocket, recvbuf, BUFSIZE, 0 );putamount+=recvbyte-1;if(recvbyteBUFSIZE|recvbuf0=0)/ this is the end of the fileisput
34、end=1;WriteFile(hFile, recvbegin, recvbyte-1, &dwBytesWritten, NULL); /write these data to local file systemsend(acceptSocket,ok,2,0); while(!isputend);printf(Upload %dbytesn,putamount);CloseHandle(hFile);free(transferinf);return 0;DWORD WINAPI createListen(LPVOID param)/listen thread function defin
35、ationSOCKET serverSocket=*(SOCKET*)param;LPDWORD exitCode=new DWORD;struct sockaddr_in acceptAddr; SOCKET acceptSocket;int addrlen=(int)sizeof(acceptAddr);do acceptSocket=accept( serverSocket, (SOCKADDR*)&acceptAddr, &addrlen);/accept a client connection requestif(acceptSocket = SOCKET_ERROR)continu
36、e;char *ip=inet_ntoa(acceptAddr.sin_addr);int port=(int)ntohs(acceptAddr.sin_port);printf(Client Connected:%s:%dn,ip,port); HANDLE handle=createSessionThread(acceptSocket, &acceptAddr);/create a separate thread for every client requestif(handle!=NULL)sessionList.push_back(handle);/add to manage list
37、 of session thread while( 1);free(exitCode);return 0;void solveCommand(WCHAR *mydir, const char* command, SOCKET* socket)/command= cmd + paramlist myFiles;getDirectoryFiles(mydir,&myFiles);list:const_iterator iter;SOCKET acceptSocket=*socket;const char* position=command;char cmdMAX_PATH;char paramMA
38、X_PATH;/get cmdint i=0;while(*position= &*position!=0)position+;while(*position!=0&*position!= )cmdi+=*position;position+;cmdi=0;/get parami=0;if(*position!=0)while(*position= &*position!=0)position+;while(*position!=n&*position!=0)parami+=*position;position+;parami=0;/change dirif(strcmp(cmd,cd)=0)
39、if(strcmp(param,.)=0)/back to above directoryif(wcscmp(mydir,rootDir)=0)/ at the root directoryfor(iter=myFiles.begin();iter!=myFiles.end();iter+)send( acceptSocket,*iter,(int)strlen(*iter),0);send( acceptSocket, OVER, (int)strlen(OVER),0);else/change directory to child directorychar curDirMAX_PATH;
40、WCHAR2char(mydir,curDir);int pos=(int)strlen(curDir);for(;pos0;pos-)if(curDirpos=)curDirpos=0;break;char2WCHAR(curDir,mydir);getDirectoryFiles(mydir,&myFiles);for(iter=myFiles.begin();iter!=myFiles.end();iter+)send( acceptSocket,*iter,(int)strlen(*iter),0);send( acceptSocket, OVER, (int)strlen(OVER)
41、,0);return;TCHAR wparamMAX_PATH;char tempMAX_PATH;strcpy(temp,);strcat(temp,param);char2WCHAR(temp,wparam);WCHAR mydirprevMAX_PATH;wcscpy_s(mydirprev,MAX_PATH,mydir);wcscat_s (mydir,MAX_PATH, wparam);if(getDirectoryFiles(mydir,&myFiles)/get the files of specfied directoryfor(iter=myFiles.begin();ite
42、r!=myFiles.end();iter+)send( acceptSocket, *iter, (int)strlen(*iter), 0 );send( acceptSocket, OVER, (int)strlen(OVER),0);else/ if no such directory exists, return error message to clientsend(acceptSocket,NOSUCHFILE,(int)strlen(NOSUCHFILE),0);wcscpy_s(mydir,MAX_PATH, mydirprev);for(iter=myFiles.begin();iter!=myFiles.end();iter+)send( acceptSocket,*iter,(int)strlen(*iter),0);send( acceptSocket, OVER, (int)strlen(OVER),0);else if(strcmp(cmd,help)=0)/ list command list o
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年电子产品销售合同
- 2025年绿色生态农业示范园区建设项目可行性研究报告
- 2025年办公空间共享经济模式探索可行性研究报告
- 2025年南方沿海港口物流园区项目可行性研究报告
- 偿还垫付协议书
- 置换协议合同模板
- 临时人员协议书
- 乙方补充协议书
- 游戏原画设计师职业发展及面试题含答案
- 人力资源专员面试指南及问题解答
- 公司医务室院感管理制度
- 字节跳动会议管理制度
- T/CECS 10114-2021增强高密度聚乙烯(HDPE-IW)六棱结构壁管材
- 配电线路缺陷管理
- 基于用户行为的广告精准推送
- 第六单元《时间像小马车》课件 人音版音乐一年级下册
- 2025年科研项目保密合同
- 大学生劳动教育(高职版)知到智慧树章节测试课后答案2024年秋深圳职业技术大学
- 提高手术接台效率
- 2024秋五年级英语上册 Unit 4 What can you do说课稿1 人教PEP
- 华南理工大学《大数据导论》2021-2022学年期末试卷
评论
0/150
提交评论