1、FTP文件传输客户端程序报告 File Transfer Protocol Client Progam X1002127 劉凱1、Program execution result: 程序會提示輸入資料名稱,輸入名稱之後,程序自動建立連接并發送命令,依次輸出收到的回信。下圖即為收到的回信:其中前兩條是歡迎信息,需要兩個recv函數接收。2、 Program Features: a. 分為一個主函數和5個小函數執行。 Main: 建立socket,調用filename和file_transfer。 Filename:輸入資料名稱,設置STOR命令。File_transfer:發送命令并傳送資料,c
2、ommand、port和send_file。Command:發送命令、接收并打印回信。Port:計算Port Y。File_transfer發送PASV命令之後調用。Send_file:打開傳送資料。函數調用關係如下圖: 程式代碼層次分明,易於閱讀和修改。b. 執行時僅需輸入需要傳送的資料名稱。 主函數調用Filename,提示輸入資料名稱,根據資料名稱設置STOR命令(即在資料名稱之前加“STOR”,之後加“rn”)。 然後主函數建立指令連接,調用File_transfer進行Client端的主要操作。 File_transfer中調用Command直接發送命令,無須輸入命令字符串。程序執行
3、簡單,易於操作。c.Name Resolution 程式調用gethostbyname獲取伺服器IP地址。根據地址去連接伺服器。相關代碼如下:struct hostent *server;server=gethostbyname(cramer.ee.nthu.edu.tw);獲取。servaddr1.sin_addr=*(struct in_addr *)server-h_addr);將連接到servaddr2.sin_addr=*(struct in_addr *)server-h_addr); 有進行Name Resolution。3. Source code# include# incl
4、ude# include# include# include# include# define MAXLEN 1024/PS: 執行時僅需輸入要傳送的資料名稱即可,程序會自動發送命令并輸出來自服務器的回信。 / 這些變量在多個函數中需要使用,因此定義在程序開頭。char RcvBufMAXLEN; int n; SOCKET a,b; / a用於建立連線,b用於傳送資料。 SOCKADDR_IN servaddr1,servaddr2;char name30,stor30=STOR ; / command用於向FTP服務器發送命令,然後接收回信并打印出來。int command(char *m
5、essage) send(a, message, strlen(message), 0); n=recv(a, RcvBuf, MAXLEN, 0); RcvBufn=0; / 在接收緩衝區的末尾加字符串結束符號。 printf(%snn, RcvBuf); / 發送PSAV命令之後,port將收到的信息中的port y轉換為整數。 如接收“227 Entering Passive Mode (140,114,26,104,68,245)”,則p1=245,p2=68。int port() int i=0, j=0, k=0, p, p1=0, p2=0; while(RcvBufi!=) i
6、+; / 用while找到右括號,然後依次求p1、p2,從右往左進行計算。 for(i=i-1;j1;i-) /計算p1 if(RcvBufi=,) j+; else p=RcvBufi-0; / 將字符轉化為數字. p1=p1+pow(10,k)*p; k+; k=0; for(;j2;i-) /計算p2 if(RcvBufi=,) j+; else p=RcvBufi-0; p2=p2+pow(10,k)*p; k+; return p=p1+p2*256; / 傳送資料的連接建立之後,用於發送資料。int send_file() char SendBufMAXLEN; FILE *p;
7、int FileSize; p=fopen(name, rb); /打開資料。 fseek(p, 0L, SEEK_END); FileSize=ftell(p); /用fseek和ftell計算資料大小。 fread(SendBuf, FileSize, 1, p); /將要發送的資料寫入發送緩衝區。 fclose(p); send(b, SendBuf, FileSize, 0); closesocket(b); /發送文件之後應及時關閉資料連接,不然收不到“226.。 return 0; /主函數調用此函數進行Client端的主要操作。 int file_transfer() int p
8、ort_y,i=0; while(ih_addr); /將gethostbyname返回的ip信息連接到socket. servaddr2.sin_family=AF_INET; servaddr2.sin_addr=*(struct in_addr *)server-h_addr); filename(); /用於輸入名稱,并設置STOR命令。 connect(a, (SOCKADDR*)&servaddr1,sizeof(servaddr1); file_transfer(); /調用file_transfer完成client端的操作。 closesocket(a); WSACleanup(); system(pause); return 0;/PS: 執行時僅需輸入要傳送的資料名稱即可,程序會自動發送命令并輸出來自服務器的回信。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1